这里说“+或substring等操作产生的字符串对象不是共享的。”
但是通过编程测试,发现应该是+和subtring一起操作产生的字符串对象不是共享的。
代码如下:
public class Main {
public static void main(String[] args) {
/**
* 前面的布尔值表示是否equals
* 后面的布尔值表示是否==
*/
String myname = "chenliang";
// String yourname = "chenliang";//true true
// String yourname = myname.substring(0,9); // true true
// String yourname ="chenlian" + "g";//true true
String yourname = myname.substring(0,7) + "ng";//true false
//equals方法比较字符串内容是否相同
boolean equalsResult = myname.equals(yourname);
boolean dengdengResult;
//==比较两个对象在内存中的地址是否相等
if(myname == yourname){
dengdengResult = true;
}else{
dengdengResult = false;
}
//输出结果
System.out.println(equalsResult + ":" + dengdengResult);
}
}
new String("xxx")创建了几个对象,
String池中的对象的共享等问题:
public class Main {
/**
* 帮助理解 内存中如何创建String对象
* @param args
*/
public static void main(String[] args) {
String s1 = "Hello";
s1 = "java";
String s2 = "java";
System.out.println(s1==s2);//true
String s5 = "java";
System.out.println("new :" + (s1 == s5));//true
String s3 = new String ("java");
System.out.println(s2==s3);//false
String s4 = new String ("java");
System.out.println(s3 == s4);//false
/**
* 之所以比较结果会是这样的,是因为:
* s1 = "java";
* String s2 = "java";
* s1 和 s2 的引用 都指向 String池 中的"java",是相同的区域。
* String池:字符串对象存放在内存中的地方,成为String池。
* 而通过new String ("java");方式来创建String对象,其中参数"java"指向String池,new String对象指向内存其他区域(不是String池)。
* 所以new String ("java");创建两个对象,一个不在String池,一个在String池(如果"java"在内存池存在,那么不会新创建一个对象)
*
*/
}
}