Java的String用法

String a = "java";
String b = "java";
String x = "ja";
String y = "va";
String c = x+y;
为什么
a和b在内存中 共用一个“java”
而c是另外用一个“java”

java中String类型的字面量(即“java”这个字符串)是存放在内存中的静态存储区,当程序执行到String a = "java";该区域里就会生成一个字符串字面量“java”,执行String b = "java";时,java对字符串的创建过程进行了优化,会先去该区域里寻找字面量为“java”的字符串,如果找到了,就把该字符串的引用指向到b,如果找不到就创建新的字符串“java”,所以a和b共用一个。加号(+)是字符串的一个连接方法,可以理解为String类的concat方法,String c = x +y;和String c = x.concat(y);效果是一样的,变量c接受的是concat方法的返回值,是内存中“ja”和“va”连接后的对象,与前面的过程不是一码事!如果还不理解,可以再问我!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-23
Java对常量在内存中相同对象会合并,因为常量不会改变,多份引用指向同一份数据可以节省内存。
这是在编译源程序时分析和处理的。

c=x+y实际是用x和y的值又新创建了一个字符串对象,这是在程序运行时发生的,你的例子中c内容只是恰好和a、b相同,若也进行常量合并则势必要在内存中进行搜索匹配,得不偿失。所以实际c的值不会借用a、b的值。
第2个回答  2012-07-23
这里用到Java里面是一个常量池的问题。对于x+y操作,其实是在堆里面重新创建了一个新的对象,c保存的是这个新对象在堆空间的的内容,所以c与a的值是不相等的。而当调用c.intern()方法,却可以返回c在常量池中的地址值,因为a的值存储在常量池中,故c.intern和a的值相等。本回答被网友采纳
第3个回答  2012-07-23
String对象是不可变的对象,所以x是一个对象,y是一个对象,c=x+y就是另一个对象,而a和b使用的是相同的内存地址,因此他们是相同的
第4个回答  2012-07-23
c是变量x的地址断开后再连接上的
相似回答