String 创建几个对象问题(详解-不容错过)

 String是常量,其对象一旦创建完毕就无法改变,当使用“+”拼接字符串时,会生成新的String对象,而不向原有的String对象追加内容,对于java的String来说比软特殊,java中有一个String pool的概念,它String这个类单独在栈中维护

String对象是不变对象,在程序运行过程中可能用到多个具有相同值得String对象,jvm中使用String pool来优化这种情况。当有新的String对象要建立的时候,jvm先检查Pool中时候已经有具有相同值的String对象,如果有就把这个对象的引用传递给新建立的对象,如果没有,就新建立一个对象,并将它放到Pool中。

实例:

1.String a = new String("b");

创建两个对象

"b"在String pool池中,当创建对象时,堆中会拷贝String池中”b“作为一个对象b1,然后建立一个新对象该对象的引用a指向b1;

所以创建两个对象。

2

String  c="b";

"b"在String池中,c指向该对象;

3

String a="i"+"u"+"s0";

这相当于String a="ius0".当JVM执行到这一句时,就在String pool里找,如果String pool里没有这个字符串,就会产生一个对象(见java面试宝典174页)

如果String pool里有这些字符串就产生2个对象 原因:每做一个连接便会产生一个对象.

4

String a="b";

a=a+"b";//有两个对象,第一a是个对象  2 a+"b"为一个对象

这时 原来 a指向的对象就变为垃圾对象,但后面又被用到所以没被回收 和"b'进行连接成为bb

5

String a="b";

a=a+"c";//有两个对象,第一"c"是个对象  2 a+"c"为一个对象 

此时a原来指向的对象成为垃圾对象,由jvm垃圾回收机制回收


6

String c;创建对象个数为 0;

初始化为null

(Java 语言规范 3.9 节最后一段:


虽然 true 和 false 看上去似乎是个关键字,但是他们在技术上而言是属于布尔的字面值(第 3.10.3 节)。类似地,null 看上去也像个关键字,但从技术上而言其是一个表示空的字面值(第 3.10.7 节))。


7.

引用指向对象分配内存地址,它可以代表对象,当你把另外一个对象内存址赋值给它时,它就代表另外一个对象了

String a="abc";

String b="abc‘;

问上述一共几个对象

答:一个

因为a和b持有”abc“的引用即持有相同对象的引用  其hashcode相同,引用不是对象,相当于c++中的指针代表该对象,从新赋值后就变成不同的对象


如果有什么错误请指出,谢谢


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值