intern方法
java 对这个方法的解释:
返回字符串对象的规范表示形式。
作用:String.intern()方法可以用来处理在Java中字符串的重复问题。
比如接口返回一个字符串,你要保存那个字符串,你就调用intern保存他的规范表示形式(即常量池上的),接口那个字符串就能垃圾回收。直接报错返回的对象字符串,如果有大量重复的,这些字符串对象就会很多。
这个方法应该是这样的逻辑
String intern() {
if(常量池找到该字面量的字符串) {
return 常量池该字面量的字符串
}
if(常量池已经记录字符串字面量相等的引用) {
return A
}
记录 堆上第一个与该字符串字面量相等的引用
return 记录的引用
}
intern方法在1.7和1.6及之前差异
字面量:指的是String的值,两个字符串equals为true,字面量相同
- jdk1.6及之前
- 如果常量池存在该字面量的字符串,返回这个常量池的对象引用
- 常量池不存在这个字面量的字符串,a.intern()会常量池创建字面量一样的字符串,返回常量池(新建)的对象引用
- jdk1.7及之后
- 如果常量池存在该字面量的字符串,返回这个常量池的对象的引用(同1.6)
- 如常量池不存在字面量的对象,在常量池中记录首次出现的实例引用。调用intern()返回这个引用。
请问下面两个输出是什么?(jdk1.7及之后)
答案是:
具体分析
都是1.8上运行的
对于s1
- String s1 = new String(“123”);堆上创建123字符串,常量池创建123字符串对象。(第一次运行,之前常量池是空的,没有123字符串)
- String internS1 = s1.intern();intern()方法找到常量池上“123”字面量的字符串,返回这个引用
- String poolsS1 = “123”;poolsS1 指向常量池创建的123字符串
poolsS1 == internS1 != S1
对于s2:
- String s2 = new String(“Hel”) + new String(“lo”);常量池有"hell"和“lo”字符串对象,堆上“hello”字符串对象
- String internS2 = s2.intern();intern()方法在常量池中记录首次出现的实例(堆上)的引用,返回第一次hello的字符串
poolsS2 == internS2 == S2
扩展一下
s2,s22,poolsS2,internS2 哪些是相等的,(打印地址,地址相等代表对象是一个)
可以发现
s2 == poolsS2 == internS2 != S22