java堆栈知识点总结(转)

概念:堆和栈都是Java用来在存储器里面存放数据的地方。与C++不同的是,Java自动管理堆和栈,程序员不能直接设置

    堆和栈,堆是全局的,堆栈是每个函数机内的时候分一小块,函数返回的时候会自动释放

    堆栈就是STACK,是只有一个出入口的队列,即后进先出

数据存放的位置:

    静态和全局变量,new得到的变量,都全部放在堆里面 ,

    局部变量放在堆栈里面,所以函数返回,局部变量就全没有了

    在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 

区别:堆的优势是可以动态分配内存大小,生存期也不必告诉编辑器,Java的垃圾收集器会自动收走这些不再使用的数据

                  缺点是由于要 在运行时动态分配内存,存取速度较慢。 

           栈的优势是存取速度比堆要快,仅次于直接位于CPU中的寄存器,栈数据可以共 享

                  缺点是存在栈中的数据大小与生存期必须是确定的,缺乏灵活性

Java数据在栈和堆里面的解析:

    Java的基本数据类型:int,short,long,byte,double,float,char,boolean等存放在栈里面:

    int a = 3; 
    int b = 3; 
  编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处 理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。

  特别注意的是,这种字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了这个对象的内部状态,那么另 一个对象引用变量也即刻反映出这个变化。相反,通过字面值的引用来修改其值,不会导致另一个指向此字面值的引用的值也跟着改变的情况。如上例,我们定义完 a与b的值后,再令a=4;那么,b不会等于4,还是等于3。在编译器内部,遇到a=4;时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地 址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。 

    Java的包装类型:Interger,Double,String等,这些数据全部位于堆中,Java用new()语句来显示地告诉编译器,

    在运行时才根据需要动态创 建,因此比较灵活,但缺点是要占用更多的时间

  举例:

    关于String str = "abc"的内部工作。Java内部将此语句转化为以下几个步骤: 
  (1)先定义一个名为str的对String类的对象引用变量:String str; 
  (2)在栈中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为"abc"的地址,接着创建一个    String类的对象o,并 将o的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址,则查找对象o,并返回o的地址。 
  (3)将str指向对象o的地址。 
  值得注意的是,一般String类中字符串值都是直接存值的。但像String str = "abc";这种场合下,其字符串值却是保存了一个指向存在栈中数据的引用! 

    String str1 = "abc"; 
    String str2 = "abc"; 
    System.out.println(str1==str2); //true 

    

  出处:https://www.cnblogs.com/iliuyuet/p/5603618.html

猜你喜欢

转载自www.cnblogs.com/hplsharenote/p/10466336.html
今日推荐