栈跟堆个人简介整理

在Java代码中,常常会使用到这样的类的声明实例化:

Person per = new Person();

//这其实是包含了两个步骤,声明和实例化

Person per = null; //声明一个名为Person类的对象per

per = new Person(); // 实例化这个per对象

声明 指的是创建类的对象的过程;

实例化 指的是用关键词new来开辟内存空间。

它们在内存中的划分是这样的:

那什么是栈内存(heap)和栈内存(heap)呢?

栈内存:

       在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。栈内存主要存放的是基本类型类型的数据 如( int, short, long, byte, float, double, boolean, char) 和对象句柄。注意:并没有String基本类型、在栈内存的数据的大小及生存周期是必须确定的、其优点是寄存速度快、栈数据可以共享、缺点是数据固定、不够灵活。

栈的共享:
1
2
3
4
5
6
7
8
9
10
11
String str1 = "myString" ;
 
String str2 = "myString" ;
 
System.out.println(str1 ==str2 );
 
//注意:这里使用的是str1 ==str2,而不是str1.equals(str2)的方式。
 
//因为根据JDK的说明,==号只有在两个引用都指向了同一个对象时才返回真值
 
//而str1.equals(str2),只是比较两个字符串是否相等 

   结果为True,这就说明了str1和str2其实指向的是同一个值。

       上述代码的原理是,首先在栈中创建一个变量为str1的引用,然后查找栈中是否有myString这个值,如果没找到,就将myString存放进来,然后将str1指向myString。接着处理String str2 = "myString";;在创建完str2 的引用变量后,因为在栈中已经有myString这个值,便将str2 直接指向myString。这样,就出现了str1与str2 同时指向myString。

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

 

堆内存:

堆内存用来存放所有new 创建的对象和 数组的数据

1
2
3
4
5
6
7
8
9
10
11
String str1 = new String ( "myString" );
 
String str2 = "myString" ;
 
System.out.println(str1 ==str2 ); //False
 
String str1 = new String ( "myString" );
 
String str2 = new String ( "myString" );
 
System.out.println(a==b); //False

  创建了两个引用,创建了两个对象。两个引用分别指向不同的两个对象。以上两段代码说明,只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。

转载于:https://www.cnblogs.com/cn-superjun/p/9517026.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值