java中String的内存运行过程

String类创建对象的方法可以分为以下三种

String str1 = "hello";
String str2 = "he" + new String("llo");
String str3 = "he" + "llo";
System.out.println(str1 == str2);
System.out.println(str1 == str3);
输出:false  true

1.程序执行时,会先去jvm的常量池(在方法区中)中寻找有没有“hello” 的String 对象,如果已经存在,则无须新建对象,直接把常量池中的对象地址返回给栈中的引用 str1 (此时没有建立对象)

如果没有存在,则在常量池中新建一个“hello”的String对象。然后将其地址返回给栈中的引用 str1(此时建立了一个对象)。

2.程序执行时,首先去jvm的常量池中寻找有没有“hello”的String对象,如果有,则在堆中新建一个String类型的对象“hello”,然后将其地址返回给栈中的引用str2。(此时只新建了一个对象)。

如果没有,则先在常量池中新建一个“hello”的String对象。然后再去堆中新建一个值为“hello”的对象,并将堆中的对象地址返回给栈中的引用str2。(此时建立了两个对象)

那在这里就有一个有趣的问题,那就是常量池中的对象和堆中的对象到底是不是同一个?可以通过比较 str1 == str2 的值可得出结论。楼主这边得到false。可知他们并不是一个对象。

3.第三种构造方式比较复杂。网上也是众说纷纭。楼主在这里分为两种方式

3.1第一种方式是: String str1 = “hello”; String str2 = “he” + “llo”;如果是这样,由于全是str2是由常量拼接起来的。那么,在编译期间就能确定值,编译器就会在编译期间就帮你进行拼接。那么,编译过后就成为:String str2 = “hello”;之后的判断和1一样。且 str1 == str2 = true

3.2 String str1 = “hello”; String str2 = “he”; String str3 = str2 + “llo”;

由于str3中有引用的拼接,而在编译过程中是无法知道引用的具体值,那么编译器就不会默认帮你进行拼接。常量池中就要新建一个对象。这时, str1 == str3 =false;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值