搜尋

首頁  >  問答  >  主體

Java String 的 intern() 方法问题

请问两种方式是否等价?

    HashMap map = new HashMap<>();
    map.put("abc", 1); //1
    map.put("abc".intern(), 1);//2
ringa_leeringa_lee2803 天前813

全部回覆(3)我來回復

  • 高洛峰

    高洛峰2017-04-17 16:12:00

    .class檔案中的常數池,在運作期間會被JVM裝載,並且可以擴充。 String的intern()方法就是擴充常數池的一個方法;當一個String實例str呼叫intern()方法時,Java查找常數池中是否有相同Unicode的字串常數,如果有,則傳回其的引用, 如果沒有,則在常數池中增加一個Unicode等於str的字串並傳回它的引用.
    所以這兩個應該是等價的

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 16:12:00

    是等價的,首先你的第二條語句的intern()完全是多此一舉,「abc」本身就會編譯進常數池,所以你的intern()不會做什麼操作。

    回覆
    0
  • PHPz

    PHPz2017-04-17 16:12:00

    1. HashMap的put方法是會計算key的雜湊值,所以不管String是從常數池回傳還是new出來的都一樣

    2. 從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

        • 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 object is returned.
    🎜 🎜🎜 🎜🎜 🎜 🎜 🎜🎜 🎜 🎜

    回覆
    0
  • 取消回覆