顺晟科技
2021-08-28 09:43:06
179
分析这些情况(JDK 1.8):
情况1:
stringstr 1=new string(' hel ')new string(' lo ');
//未在常量池中创建“hello”
stringstr 2=new string(' ja ')new string(' va ');
//此语句在常量池中没有创建“Java”,但常量池前面已经有“Java”
system . out . print ln(str 1 . intern()==str 1);
system . out . print ln(str 2 . intern()==str 2);
输出
True
False
Str1.intern()与对Str1的引用相同,因为它在常量池中创建并返回对原始字符串(str1)的引用。相反,str2.intern()与str2不同,它返回对常量池中“Java”的引用
案例2:
String str 1=new String(' hello ');
//在堆中创建对象时,常量池中也会创建“hello”
String str 2=new String(' Java ');
//堆中创建了对象,但常量池中没有创建“Java”(因为“Java”已经存在)。
system . out . print ln(str 1 . intern()==str 1);
system . out . print ln(str 2 . intern()==str 2);
输出
False
False
Str1和str2的intern方法都返回常量字符串,与堆中生成的str1和str2不同
情况3:
String str1=' hello
//在自来水纸上做了“hello”
String str2=' java
//由于常量池中已存在“Java”,因此没有创建任何内容。参考就可以了
system . out . print ln(str 1 . intern()==str 1);
system . out . print ln(str 2 . intern()==str 2);
输出
True
True
Str1和str2的intern方法都返回常量池的字符串,str1和str2也指向常量池的字符串,两者是相同的
情况4:
字串S1=新字串(' a ');//(1)
S1 . Intern();//常量池返回了对“A”的引用。这句话实际上对结果没有影响
字串S2=' a
system . out . print ln(s 1==s 2);
strings 3=new string(' a ')new string(' b ');//(2)
S3 . Intern();//常数池创建指向S3的“ab”
字串S4=' ab
system . out . print ln(s 3==s 4);
输出
False
True
在门(1)中,常量水池中创建了“A”,因为这个“A”与S1没有关系,所以S2也与S1没有关系。S1==S2为false返回。语句(2)中的常量池不创建“ab”,因此以后的s3.intern()中的常量池会创建“ab”,而这个“ab”指s3,因此S4也指S3、S3。
结论
Jdk 1.7后(测试1.8后,有人说1.9不同,这并不明显。那么,让我们锁定1.7和1.8),intern方法首先检查常量池中是否存在字符串,如果存在,则返回常量池的引用(与以前的版本没有区别)。像以前的版本一样,字符串不会复制到常量池中,常量池中会生成对原始字符串的引用(当然,如果找不到字符串,两个版本都会返回对原始字符串的引用)。
28
1990-12
02
2022-09
29
2021-08
29
2021-08
28
2021-08
28
2021-08