62,628
社区成员
发帖
与我相关
我的任务
分享
String a1 = new String("AA") ;
a1.intern();
String a2 = "AA";
System.out.println(a1 == a2); //为什么会是false呢? String a1 = new String("AA") ;
a1.intern();
String a2 = "AA";
System.out.println(a1 == a2); //为什么会是false呢?[/quote]
可以这么理解 所有出现在 “ ”之间的 字符 ,jvm都会将其写入 字符常量池// ① 堆内存中会 出现 变量a4_1(地址为Da41值为AA) ,a4_2 (地址为Da42值为BB), a4(地址为Da4值为 AABB)
// 常量池中出现 AA(Ca41), BB(Ca42)
String a4 = new String("AA") + new String("BB");
// intern() 会先判断 常量池中是否已存在 AABB, 如果存在 返回 常量池中AABB 的地址,如果不存在,将AABB(a4)写入常量池 地址为 a4 的内存地址
a4.intern();
// a5 直接指向 常量池中 AABB 的地址,a5(地址a4)
String a5 = "AABB";
// 此时 a4 a5 的内存地址相同
System.out.println(a4 == a5); // true
// new String() 重新开辟内存地址 a6 (Da6)
String a6 = new String("AA");
// 先判断 发现 AA 已经存在于常量池 (① 中 AA 已被写入常量池)
a6.intern();
// 指向 常量池中的 AA (a41)
String a7 = "AA";
System.out.println(a6 == a7); // false String s1_1 = new String("aaaa");
s1_1.intern();
String s1_2 = "aaaa";
System.out.println(s1_1 == s1_2);
String s2_1 = new String("aa") + new String("bb");
s2_1.intern();
String s2_2 = "aabb";
System.out.println(s2_1 == s2_2);
String s3_1 = new String("aa") + new String("bb");
s3_1.intern();
String s3_2 = "aabb";
System.out.println(s3_1 == s3_2);
返回false
true
false