62,629
社区成员
发帖
与我相关
我的任务
分享public static void main(String[] args){
String str1 = new String("abc") + new String("abc");
str1.intern();
String str2 = "abcabc";
System.out.println(str1 == str2);//true
String str3 = new String("abcd") + new String("abcd");
String str4 = "abcdabcd";
str3.intern();
System.out.println(str3 == str4);//false
}public static void main(String[] args){
String str2 = new String("hello");
str2.intern();
String str = "hello";
System.out.println(str==str2);// 运行后结果为false
String str3 = new String("world");
String str4 = "world";
str3.intern();
System.out.println(str4==str3);// 运行后结果为false
} @Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
String s = new String("1"); 第一句代码,生成了2个对象。常量池中的“1” 和 JAVA Heap 中的字符串对象。s.intern(); 这一句是 s 对象去常量池中寻找后发现 “1” 已经在常量池里了。
接下来String s2 = "1"; 这句代码是生成一个 s2的引用指向常量池中的“1”对象。 结果就是 s 和 s2 的引用地址明显不同。
来看第二段代码,从上边第二幅图中观察。第一段代码和第二段代码的改变就是 s3.intern(); 的顺序是放在String s4 = "11";后了。这样,首先执行String s4 = "11";声明 s4 的时候常量池中是不存在“11”对象的,执行完毕后,“11“对象是 s4 声明产生的新对象。然后再执行s3.intern();时,常量池中“11”对象已经存在了,因此 s3 和 s4 的引用是不同的。
第二段代码中的 s 和 s2 代码中,s.intern();,这一句往后放也不会有什么影响了,因为对象池中在执行第一句代码String s = new String("1");的时候已经生成“1”对象了。下边的s2声明都是直接从常量池中取地址引用的。 s 和 s2 的引用地址是不会相等的
原文链接:https://www.cnblogs.com/wxgblogs/p/5635099.html
public static void main(String[] args){
String str1 = new String("abc") + new String("abc");
str1.intern();
String str2 = "abcabc";
System.out.println(str1 == str2);//true
String str3 = new String("abcd") + new String("abcd");
String str4 = "abcdabcd";
str3.intern();
System.out.println(str3 == str4);//false
}
public static void main(String[] args){
//堆内存:
//POOL:
String str1 = new String(new char[]{'a','b','c','a','b','c'});
//堆内存:str1@&01, str1.value={'a','b','c','a','b','c'}@&02, str1.hashCode=-1424388928
//POOL:
str1.intern(); //pool中没有,所以放到pool中,(注意:返回值为&01)
//堆内存:str1@&01, str1.value={'a','b','c','a','b','c'}@&02, str1.hashCode=-1424388928
//POOL:hashCode:-1424388928⇒&01
String str2 = "abcabc"; //pool中有,所以用pool的
//堆内存:str2&01, str2.value={'a','b','c','a','b','c'}@&02, str2.hashCode=-1424388928
//POOL:hashCode:-1424388928⇒&01
System.out.println(str1 == str2);// &01==&01,true
//不再考虑上面的堆内存和pool
//堆内存:
//POOL:
String str3 = new String(new char[]{'a','b','c','d','a','b','c','d'});
//堆内存:str3@&03, str3.value={'a','b','c','d','a','b','c','d'}@&04, str1.hashCode=1259550596
//POOL:
String str4 = "abcdabcd"; //pool中没有,所以放到pool中
//堆内存:
// str3@&03, str3.value={'a','b','c','d','a','b','c','d'}@&04, str1.hashCode=1259550596
// str4@&05, str4.value={'a','b','c','d','a','b','c','d'}@&06, str1.hashCode=1259550596
//POOL:1259550596⇒&05
str3.intern(); //pool已有,不做任何操作 (注意:返回值为&05,如果str3=str3.intern(),则结果不一样)
// str3@&03, str3.value={'a','b','c','d','a','b','c','d'}@&04, str1.hashCode=1259550596
// str4@&05, str4.value={'a','b','c','d','a','b','c','d'}@&06, str1.hashCode=1259550596
//POOL:1259550596⇒&05
System.out.println(str3 == str4); &03==&05//false
}
public static void main(String[] args){
String str2 = new String("hello");
str2.intern();
String str = "hello";
System.out.println(str==str2);// 运行后结果为false
String str3 = new String("world");
String str4 = "world";
str3.intern();
System.out.println(str4==str3);// 运行后结果为false
}
public static void main(String[] args){
//堆内存:
//POOL:
String temp = "hello"; //pool中没有,所以放到pool中
//堆内存:temp@&10,temp.value={'h','e','l','l','o'}@&11, temp.hashCode=99162322
//POOL:99162322⇒&10
String str2 = new String(temp); //str2的value存储到temp的引用,并不分配新地址
//堆内存:
// temp@&10,temp.value={'h','e','l','l','o'}@&11, temp.hashCode=99162322
// str2@&12,str2.value={'h','e','l','l','o'}@&11, str2.hashCode=99162322
//POOL:99162322⇒&10
str2.intern(); //pool已有,不做任何操作 (注意:返回值为&10,如果str2=str2.intern(),则结果不一样)
// temp@&10,temp.value={'h','e','l','l','o'}@&11, temp.hashCode=99162322
// str2@&12,str2.value={'h','e','l','l','o'}@&11, str2.hashCode=99162322
//POOL:99162322⇒&10
String str = "hello";//pool已有,所以用pool的
// temp@&10,temp.value={'h','e','l','l','o'}@&11, temp.hashCode=99162322
// str2@&12,str2.value={'h','e','l','l','o'}@&11, str2.hashCode=99162322
// str@&10,str.value={'h','e','l','l','o'}@&11, str.hashCode=99162322
//POOL:99162322⇒&10
System.out.println(str==str2);// &10==&12 运行后结果为false
//不再考虑上面的堆内存和pool
//堆内存:
//POOL:
String temp1 = "world" //pool中没有,所以放到pool中
//堆内存:temp1@&20,temp.value={'w','o','r','l','d'}@&21, temp.hashCode=113318802
//POOL:113318802⇒&20
String str3 = new String(temp1); //str3的value存储到temp1的引用,并不分配新地址
//堆内存:
// temp1@&20,temp.value={'w','o','r','l','d'}@&21, temp.hashCode=113318802
// str3@&22,str3.value={'w','o','r','l','d'}@&21, str3.hashCode=113318802
//POOL:113318802⇒&20
String str4 = "world";//pool已有,所以用pool的
//堆内存:
// temp1@&20,temp.value={'w','o','r','l','d'}@&21, temp.hashCode=113318802
// str3@&22,str3.value={'w','o','r','l','d'}@&21, str3.hashCode=113318802
// str4@&20,str4.value={'w','o','r','l','d'}@&21, str4.hashCode=113318802
//POOL:113318802⇒&20
str3.intern();//pool已有,不做任何操作 (注意:返回值为&20,如果str3=str3.intern(),则结果不一样)
// temp1@&20,temp.value={'w','o','r','l','d'}@&21, temp.hashCode=113318802
// str3@&22,str3.value={'w','o','r','l','d'}@&21, str3.hashCode=113318802
// str4@&20,str4.value={'w','o','r','l','d'}@&21, str4.hashCode=113318802
//POOL:113318802⇒&20
System.out.println(str4==str3);// &20==&22 运行后结果为false
}
