• java中的栈


    我们知道java中的引用变量都是存储在栈中的。现在假使我们声明一个String变量,String a;这里我们就是在创建一个String引用,那么a其实就代表的是一个地址。编译器在做的时候就是为该引用变量在栈中分配一块内存,并且将该内存清零。(偶一直想获取该块内存的地址,但是java不允许程序员管理内存所以不知道该怎么做)。当将该引用初始化的时候,如a = new String("abc");那么这块栈内存中便写入了该String对象在堆中的地址。但是由于基本数据类型是存储在栈中的,所以对于基本数据类型的变量的引用,栈内存中存储的便是栈地址。而且由于栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:

    复制内容到剪贴板代码: 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的值。

     

    【注】数据类型包装类的值不可修改。不仅仅是String类的值不可修改,所有的数据类型包装类都不能更改其内部的值。

  • 相关阅读:
    js三种存储方式区别
    利用split方法计算字符串中出现字母最多的次数
    图片预加载的三个方法
    页面有大量图片,优化图片的加载方法
    USB通信协议——深入理解
    C/C++回调函数
    显卡工作原理
    include包含头文件的语句中,双引号和尖括号的区别是什么?
    华为2015校园招聘 上机试题
    位操作基础篇之位操作全面总结
  • 原文地址:https://www.cnblogs.com/lm3306/p/2806327.html
Copyright © 2020-2023  润新知