<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                在Java中字符串(String)是一個不可改變的類。一個不可改變的類只是一個對象實例不可修改的簡單類。當創建一個對象實例時,對象實例的所有信息都被初始化,并且信息不能被修改。對于不可改變的類來說還有很多優勢。上一篇文章很好說明了為什么字符串被設計成不可改變的。只有你很好的掌握了內存,同步,數據結構等知識后,你才能很好的回答這個問題。 1.字符串常量池的需求 字符串常量區是方法區(Method Area)中一塊特殊的存儲區域。當一個字符串被創建,如果該字符串已經存在字符串常量區時,相應的返回存在字符串的引用,而不是去新創建一個新的對象返回它的引用。 下面的代碼中只會在堆中創建一個字符串對象。 ~~~ String string1 = "abcd"; String string2 = "abcd"; ~~~ 下面的圖能很好的說明: ![](https://box.kancloud.cn/2016-03-18_56eba2a98c48c.jpg) 如果字符串是可以改變的,改動一個字符串的引用將會導致另一個引用出現錯誤值。 2.緩存HashCode(哈希碼) 在Java中一個字符串的哈希碼是經常被使用的,例如在hashMap中。不可改變性確保了哈希碼總是會保持不變,這樣我們就不必擔心發生任何變化。換一句話說,我們沒有必要每次使用字符串時都要計算哈希碼(因為不可改變性確保哈希碼保持不變),這是一種更有效率的方式。 在String類中,都會有下列代碼: ~~~ public final class String implements java.io.Serializable, Comparable<String>, CharSequence{ /** Cache the hash code for the string */ private int hash; // Default to 0 } ~~~ 3.促進其他的對象的使用 為了說明更具體一些,考慮下面的程序: ~~~ HashSet<String> set = new HashSet<String>(); set.add(new String("a")); set.add(new String("b")); set.add(new String("c")); for(String a: set) a.value = "a"; ~~~ 在這個例子中,假設String是可變的,那么其值就可以修改,這有違集(set)的設計(集中不包含重復的元素)。這個例子為簡單考慮,在真實String類中沒有value屬性。 4.安全 String在很多Java類中廣泛使用作為參數,例如,網絡連接,打開文件等等。如果字符串是可改變的,那么網絡連接或者文件都可能會被改變,將導致嚴重的安全威脅。方法還以為是連接到一臺機器上,但實際上卻沒有。可變字符串可能會導致在反射中出現問題,因為這些參數都是字符串。 ~~~ boolean connect(string s){ if (!isSecure(s)) { throw new SecurityException(); } //如果在這之前s通過其他引用進行改變,這可能會出現問題 causeProblem(s); } ~~~ 5.不可變對象是線程安全的 因為不可變對象是不可改變的,那么它們可以在多個線程之間自由的共享。這就取消了進行同步的需求。 總之,字符串被設計為不可變是為了效率和安全性考慮。這也就是一般情況下優先選擇不可變對象的原因。 原文:[Why String is immutable in Java ?](http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看