zoukankan      html  css  js  c++  java
  • 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类的值不可修改,所有的数据类型包装类都不能更改其内部的值。

  • 相关阅读:
    GIT里 SSH和HTTPS的区别
    迷宫 DFS 算法
    全排列 DFS 模板
    独立岛问题的BFS,DFS求解
    红丝绒蛋糕
    BFS,DFS伪代码
    【转】一个时代的剪影----汉
    AlbertRender --- 实时&离线全局光照渲染器(一)
    【linux驱动笔记】linux模块机制浅析
    【linux驱动笔记】字符设备驱动相关数据结构与算法
  • 原文地址:https://www.cnblogs.com/lm3306/p/2806327.html
Copyright © 2011-2022 走看看