您的位置:首页 > 其它

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

2014-07-31 21:25 357 查看
 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++中的指针代表该对象,从新赋值后就变成不同的对象

如果有什么错误请指出,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息