请问两种方式是否等价?
HashMap map = new HashMap<>();
map.put("abc", 1); //1
map.put("abc".intern(), 1);//2
高洛峰2017-04-17 16:12:00
.class檔案中的常數池,在運作期間會被JVM裝載,並且可以擴充。 String的intern()方法就是擴充常數池的一個方法;當一個String實例str呼叫intern()方法時,Java查找常數池中是否有相同Unicode的字串常數,如果有,則傳回其的引用, 如果沒有,則在常數池中增加一個Unicode等於str的字串並傳回它的引用.
所以這兩個應該是等價的
PHPz2017-04-17 16:12:00
HashMap的put方法是會計算key的雜湊值,所以不管String是從常數池回傳還是new出來的都一樣
從intern()方法的註解中看到,它會從String的常數池中找這個字串,找到了就返回常數池中的字串,沒找到就常數池新增這個字串,然後返回。
When the intern method is invoked, if the pool already contains a
string equal to this String
object as determined byString
object as determined by
the {@link #equals(Object)} method, then the string from the pool is
returned. Otherwise, this String
object is added to the
pool and a reference to this String
String
object is added to theString
object is returned.