请问两种方式是否等价?
HashMap map = new HashMap<>(); map.put("abc", 1); //1 map.put("abc".intern(), 1);//2
ringa_lee
.class檔案中的常數池,在運作期間會被JVM裝載,並且可以擴充。 String的intern()方法就是擴充常數池的一個方法;當一個String實例str呼叫intern()方法時,Java查找常數池中是否有相同Unicode的字串常數,如果有,則傳回其的引用, 如果沒有,則在常數池中增加一個Unicode等於str的字串並傳回它的引用.所以這兩個應該是等價的
是等價的,首先你的第二條語句的intern()完全是多此一舉,「abc」本身就會編譯進常數池,所以你的intern()不會做什麼操作。
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
String
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
.class檔案中的常數池,在運作期間會被JVM裝載,並且可以擴充。 String的intern()方法就是擴充常數池的一個方法;當一個String實例str呼叫intern()方法時,Java查找常數池中是否有相同Unicode的字串常數,如果有,則傳回其的引用, 如果沒有,則在常數池中增加一個Unicode等於str的字串並傳回它的引用.
所以這兩個應該是等價的
是等價的,首先你的第二條語句的intern()完全是多此一舉,「abc」本身就會編譯進常數池,所以你的intern()不會做什麼操作。
HashMap的put方法是會計算key的雜湊值,所以不管String是從常數池回傳還是new出來的都一樣
從intern()方法的註解中看到,它會從String的常數池中找這個字串,找到了就返回常數池中的字串,沒找到就常數池新增這個字串,然後返回。
-
-
- the {@link #equals(Object)} method, then the string from the pool is
returned. Otherwise, this
pool and a reference to thisWhen the intern method is invoked, if the pool already contains a
string equal to this
String
object as determined byString
object as determined bythe {@link #equals(Object)} method, then the string from the pool is
returned. Otherwise, this
String
object is added to thepool and a reference to this
String
String
object is added to theString
object is returned.