国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

關于 String.intern() 的思考

siberiawolf / 864人閱讀

摘要:我看到一個上的問題是關于的感覺比較有意思于是自己也去探索了一下有了一些自己的見解于是在此記錄下來我們首先來看一個例子編程編程這個例子會輸出什么呢有些讀者朋友可能沒有想到其實上面的例子在不同的版本中運行會有不同的結果的那么接下來我們來試一下吧

我看到一個 segmentfault 上的問題, 是關于 String.intern() 的, 感覺比較有意思, 于是自己也去探索了一下, 有了一些自己的見解, 于是在此記錄下來.

我們首先來看一個例子:

// 1
String str1 = new StringBuilder("ja").append("va").toString();
System.out.println(str1.intern() == str1);

// 2
String str2 = new StringBuffer("編").append("程").toString();
System.out.println(str2.intern() == str2);

// 3
String str3 = new StringBuffer("編").append("程").toString();
System.out.println(str3.intern() == str3);

這個例子會輸出什么呢? 有些讀者朋友可能沒有想到, 其實上面的例子在不同的 JDK 版本中運行, 會有不同的結果的. 那么接下來我們來試一下吧:

// 使用 JDK6 進行編譯運行:
false, false, false
// 使用 JDK7 進行編譯運行:
false, true, false

為什么結果會不同呢?
首先我們來看一下第一部分:

String str1 = new StringBuilder("ja").append("va").toString();
System.out.println(str1.intern() == str1);

這里 JDK6 和 JDK7 都是打印的 false, 其原因是 "java" 字符串常量比較特殊, 它是固定存在字符串常量池中的, 因此 "str1.intern()" 返回的就是字符串常量池中的對象的引用, 和堆上的 str1 就自然是不相等了.

接下來我們來分析一下第二部分的代碼:

// 2
String str2 = new StringBuffer("編").append("程").toString();
System.out.println(str2.intern() == str2);

在這里 JDK6 和 JDK7 的輸出有了差異, 其具體原因是 JDK6 和 JDK7 對 String.intern() 方法的實現的不同.
在 JDK6 及以前的 JDK 中:

intern() 方法會把首次遇到的字符串實例 **復制** 到永久代中, 然后返回永久代中的實例.

而對于 JDK7 以及之上的JDK:

當遇到第一次出現的字符串時, intern() **不再復制實例**, 而是在常量池中記錄首次出現的實例的引用, 并且 intern() 返回的是此實例引用.

根據 JDK6 和 JDK7 的 intern() 方法的區別, 我們就知道了在第二部分的代碼中, "編程" 這個字符串是第一次出現的, 因此在 JDK6 中, 會將此對象的實例拷貝一份然后存放到常量池中, intern() 返回的是在常量池中拷貝后的新對象的引用, 進而就和堆上的 str1 不等了; 而在 JDK7 中, 由于 intern() 方法的實現不同, 這個方法并不會拷貝一份對象實例到常量池中, 而是在常量池中記錄此對象的引用, 因此 intern() 返回的引用其實和堆中的 str1 是一樣的.

有了前面的認知, 我們對第三部分的代碼的輸出結果就比較熟悉了:

// 3
String str3 = new StringBuffer("編").append("程").toString();
System.out.println(str3.intern() == str3);

第三部分代碼和第二部分代碼其實是一樣的, "編程" 這個字符串已經在第二部分的代碼中出現了, 因此在常量池中已經存在了, 因此 str3.intern() 返回的是常量池中的對象的引用, 和堆上的 str3 自然是不一樣的, 因此不論在 JDK6 還是 JDK7 中, 輸出的都是 false.

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66087.html

相關文章

  • 關于String.intern()和new StringBuilder("").

    摘要:對比較返回是因為這個字符串在執之前已經出現過,字符串常量池中已經有它的引用了,不符合首次出現的原則,而計算機軟件這個字符串則是首次出現的,因此返回。 在《深入理解Java虛擬機》書中,提到在jdk1.7的版本中用String.intern()返回引用。 public class RuntimeConstantPoolOOM { public static void main(S...

    derek_334892 評論0 收藏0
  • join()方法神奇用處與Intern機制軟肋

    摘要:機制失效的情況方法的神奇用處使我不得不改變對機制的認識,本小節就帶大家重新學習一下機制吧。目前看來,方法最具通用性。學習的方法論總而言之,因為重新學習方法的神奇用處與機制的例外情況,我得以修正上篇文章的錯誤。 showImg(https://segmentfault.com/img/bVbkpfb?w=3106&h=2071);上篇文章《Python是否支持復制字符串呢?》剛發出一會,...

    Towers 評論0 收藏0
  • join()方法神奇用處與Intern機制軟肋

    摘要:機制失效的情況方法的神奇用處使我不得不改變對機制的認識,本小節就帶大家重新學習一下機制吧。目前看來,方法最具通用性。學習的方法論總而言之,因為重新學習方法的神奇用處與機制的例外情況,我得以修正上篇文章的錯誤。 showImg(https://segmentfault.com/img/bVbkpfb?w=3106&h=2071);上篇文章《Python是否支持復制字符串呢?》剛發出一會,...

    yck 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<