zoukankan      html  css  js  c++  java
  • JAVA堆,栈的区别,用AarrayList、LinkedList自定义栈

      大家都知道java模拟机在运行时要开辟空间所以它有特定的五个内存划分:

      1.寄存器;

        2.本地方法区;

        3.方法区;

        4.栈内存;

        5.堆内存;

    但是我们今天来注重讲一下栈和堆。

             栈区(Stack):

      1.栈的特点在于它是先进后出的线性表FILO(Last in first out),它的操作数据顺序是从上至下的。

             就比如:一包抽巾纸,它放进包装袋时是最底下那一张最先进,但是在我们使用时最先拿出的是最上层的纸巾。

      2.栈在被调用时存放在一级缓存中,调用完毕后就释放。

      3.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中

      4.每个栈中的数据都是私有的,其他栈不能访问 

     如何自定义栈:

    一:用的是arraylist集合中去模拟栈的数据结构:

    package com.j2ee;
    /**
     * 自定义栈
     * @author Administrator
     *
     */
    import java.util.ArrayList;
    public class Stack {
    
         ArrayList<Object> list = new ArrayList<Object>(); // 使用集合存储数据
    
        // 栈是否为null
        public boolean isEmpty() {
            return list.isEmpty();
        }
    
        // 栈长度
        public int size() {
            return list.size();
        }
    
        // 取栈顶元素
        public Object stackTop() {
            if (list.size() == 0) {
                return null;
            }
            return list.get(list.size() - 1);
        }
        // 出栈
        public Object pop() {
            if (list.size() == 0) {
                return "栈为null,无法删除";
            }
            Object obj = list.get(list.size() - 1);
            list.remove(list.size() - 1);
            return obj;
        }
    
        // 压栈
        public void push(Object obj) {
            list.add(obj);
        }
    
        // toString
        public String toString() {
            return "Stack:" + list.toString();
        }
    }、
        // 压栈
        public void push(Object obj) {
            list.add(obj);
        }
    
        // toString
        public String toString() {
            return "Stack:" + list.toString();
        }
    }

    //测试类代码:

    package com.j2ee;
    /**
     * 测试
     * @author Administrator
     *
     */
    public class Temp {
    public static void main(String[] args) {
        Stack stack=new Stack();
        System.out.println("是否为空:" + stack.isEmpty());
        System.out.println("长度:" + stack.size());        
        System.out.println("顶元素:" + stack.stackTop());
        System.out.println("出栈:" + stack.pop());
        System.out.println("==============我是分割线================");
        stack.push("本是青灯不归客");
        System.out.println("是否为空:" + stack.isEmpty());
        System.out.println("长度:" + stack.size());        
        System.out.println("顶元素" + stack.stackTop());
        System.out.println("出栈" + stack.pop());
    }
    }

     二:用LinkedList集合去模拟栈的数据结构

    //用LinkedList集合去模拟栈的数据结构
        LinkedList arr=new LinkedList();
        public void push(Object obj) {
            arr.addFirst(obj);
        }
        public Object prop() {
         Object object=  arr.getFirst();
         arr.removeFirst();
         return object;
        }

    //测试代码

    //
        MyStarck myStarck=new MyStarck();
        myStarck.push(1);
        myStarck.push(2);
        myStarck.push(3);
        myStarck.push(4);
        myStarck.push(5);
        myStarck.push(6);
        for (int i = 0; i <myStarck.arr.size(); i++) {
            System.out.println(myStarck.prop());
            
        }

         堆区(heap):

      1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。

          2.堆的特点在于它是先进先出的缓存FIFO(First In First Out)队列,模拟器只有一个堆区(heap)被所有线程共享,堆中只存放对象本身,存放在二级缓存中,生命周期由虚拟机的垃圾回收机制定

      

    谢谢观看!

  • 相关阅读:
    获取请求浏览器信息
    (转)获取页面 鼠标位置
    (转)location.href 用法
    (转)异常的处理
    (转载)提高ASP.NET Web应用性能的技巧
    赶集网二手数据.py
    豆瓣top250.py
    爬取58二手数据.py
    使用类和实例.py
    爬取小猪短租房.py文件
  • 原文地址:https://www.cnblogs.com/huangting/p/10893169.html
Copyright © 2011-2022 走看看