18910140161

String的互联网方法分析

顺晟科技

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方法首先检查常量池中是否存在字符串,如果存在,则返回常量池的引用(与以前的版本没有区别)。像以前的版本一样,字符串不会复制到常量池中,常量池中会生成对原始字符串的引用(当然,如果找不到字符串,两个版本都会返回对原始字符串的引用)。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航