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++中的指针代表该对象,从新赋值后就变成不同的对象
如果有什么错误请指出,谢谢