<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java `CopyOnWriteArrayList`類 > 原文: [https://howtodoinjava.com/java/collections/java-copyonwritearraylist/](https://howtodoinjava.com/java/collections/java-copyonwritearraylist/) Java `CopyOnWriteArrayList`是`ArrayList`的[線程安全](https://howtodoinjava.com/java/multi-threading/what-is-thread-safety/)變體,其中的所有可變操作(添加,設置等)均通過對基礎[數組](https://howtodoinjava.com/java-array/)進行全新復制來實現。 它的[**不可變**](https://howtodoinjava.com/java/basics/how-to-make-a-java-class-immutable/)快照式迭代器方法在創建[迭代器](https://howtodoinjava.com/java/collections/java-iterator/)時使用了對數組狀態的引用。 這在遍歷操作遠遠超過列表更新操作且我們不想同步遍歷并且在更新列表時仍希望線程安全的用例中很有用。 ```java Table of Contents 1\. CopyOnWriteArrayList Hierarchy 2\. CopyOnWriteArrayList Features 3\. CopyOnWriteArrayList Example 4\. CopyOnWriteArrayList Constructors 5\. CopyOnWriteArrayList Methods 6\. CopyOnWriteArrayList Usecases 7\. CopyOnWriteArrayList Performance 8\. Conclusion ``` ## 1\. `CopyOnWriteArrayList`層次結構 `CopyOnWriteArrayList`類實現以下接口 – `List`,`RandomAccess`,[`Cloneable`](https://howtodoinjava.com/java/cloning/a-guide-to-object-cloning-in-java/)和[`serializable`](https://howtodoinjava.com/java/serialization/custom-serialization-readobject-writeobject/)。 ```java public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, Serializable { private transient volatile Object[] array; //implementation } ``` ## 2\. `CopyOnWriteArrayList`特性 有關 Java `CopyOnWriteArrayList`類的重要知識是: * `CopyOnWriteArrayList`類實現`List`和`RandomAccess`接口,因此提供`ArrayList`類中可用的所有特性。 * 使用`CopyOnWriteArrayList`進行更新操作的成本很高,因為每個突變都會創建基礎數組的克隆副本,并為其添加/更新元素。 * 它是`ArrayList`的線程安全版本。 每個訪問列表的線程在初始化此列表的迭代器時都會看到自己創建的后備數組快照版本。 * 因為它在創建迭代器時獲取基礎數組的快照,所以它不會拋出`ConcurrentModificationException`。 * 不支持對迭代器的刪除操作(刪除,設置和添加)。 這些方法拋出`UnsupportedOperationException`。 * `CopyOnWriteArrayList`是**同步列表**的并發替代,當迭代次數超過突變次數時,它提供了更好的并發性。 * 它允許重復的元素和異構對象(使用泛型來獲取編譯時錯誤)。 * 因為它每次創建迭代器時都會創建一個數組的新副本,所以**性能比`ArrayList`慢**。 ## 3\. `CopyOnWriteArrayList`示例 顯示在不同時間創建的迭代器如何查看`CopyOnWriteArrayList`中`list`的快照版本的 Java 程序。 在給定的示例中,當列表具有元素(`1,2,3`)時,我們首先創建了`list`和`itr1`。 然后,我們在列表中添加了另一個元素,并再次創建了一個迭代器`itr2`。 最后,我們驗證了兩個迭代器中的元素。 ```java CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>(new Integer[] {1,2,3}); System.out.println(list); //[1, 2, 3] //Get iterator 1 Iterator<Integer> itr1 = list.iterator(); //Add one element and verify list is updated list.add(4); System.out.println(list); //[1, 2, 3, 4] //Get iterator 2 Iterator<Integer> itr2 = list.iterator(); System.out.println("====Verify Iterator 1 content===="); itr1.forEachRemaining(System.out :: println); //1,2,3 System.out.println("====Verify Iterator 2 content===="); itr2.forEachRemaining(System.out :: println); //1,2,3,4 ``` 程序輸出。 ```java [1, 2, 3] [1, 2, 3, 4] ====Verify Iterator 1 content==== 1 2 3 ====Verify Iterator 2 content==== 1 2 3 4 ``` ## 4\. `CopyOnWriteArrayList`構造器 * **`CopyOnWriteArrayList()`**:創建一個空列表。 * **`CopyOnWriteArrayList(Collection c)`**:創建一個列表,其中包含指定集合的??元素,并按集合的迭代器返回的順序排列。 * **`CopyOnWriteArrayList(object[] array)`**:創建一個保存給定數組副本的列表。 ## 5\. `CopyOnWriteArrayList`方法 `CopyOnWriteArrayList`類支持`ArrayList`類支持的所有方法。 該行為僅在迭代器(**快照迭代器**)和列表中發生突變時創建的新支持數組的情況下有所不同。 此外,它提供了一些此類之外的方法。 * **`boolean addIfAbsent(Object o)`**:如果不存在,則追加元素。 * **`int addAllAbsent(Collection c)`**:按指定集合的??迭代器返回的順序,將指定集合中尚未包含在此列表中的所有元素追加到此列表的末尾 。 對于所有受支持的其他方法,請訪問[`ArrayList`](https://howtodoinjava.com/java-arraylist/)方法部分。 ## 6\. Java `CopyOnWriteArrayList`用例 在以下情況下,我們更喜歡使用`CopyOnWriteArrayList`而不是常規`ArrayList`: 1. 當在并發環境中使用列表時。 2. 迭代次數超過了變異操作的次數。 3. 迭代器在創建時必須具有列表的快照版本。 4. 我們不想[以編程方式同步線程訪問](https://howtodoinjava.com/java/multi-threading/wait-notify-and-notifyall-methods/)。 ## 7\. Java `CopyOnWriteArrayList`性能 由于每次更新列表時都要增加創建新支持數組的步驟,因此其性能比`ArrayList`差。 讀取操作沒有性能開銷,并且兩個類執行相同的操作。 ## 8\. 總結 在此 Java 集合教程中,我們學習了使用`CopyOnWriteArrayList`類,它的[構造器](https://howtodoinjava.com/oops/java-constructors/),方法和用例。 我們學習了`CopyOnWriteArrayList`內部在 Java 中的工作原理以及`CopyOnWriteArrayList`與同步`ArrayList`的工作原理。 我們通過 Java `CopyOnWriteArrayList`示例程序演示了快照迭代器的工作方式。 在評論中把您的問題交給我。 學習愉快! 參考: [`CopyOnWriteArrayList` Java 文檔](https://docs.oracle.com/javase/10/docs/api/java/util/concurrent/CopyOnWriteArrayList.html)
                  <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>

                              哎呀哎呀视频在线观看