<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] # 簡介 **線程不安全的** Collections中定義了synchronizedList(List list)將此ArrayList轉化為線程安全的 數組可以保存多個元素,但在某些情況下無法確定到底要保存多少個元素,此時數組將不再適用,因為數組的長度不可變 為了保存這些數目不確定的元素,JDK中提供了一系列特殊的類,這些類可以存儲任意類型的元素,并且長度可變,統稱為集合,**集合存儲引用類型,不存儲基本類型** ArrayList集合是程序中最常見的一種集合,它屬于引用數據類型(類)。在ArrayList內部封裝了一個長度可變的數組,當存入的元素超過數組長度時,ArrayList會在內存中分配一個更大的數組來存儲這些元素,因此可以將ArrayList集合看作一個長度可變的數組。 # 使用 如果我們一開始就知道里面放多少個元素就指定多少個元素,不然多次擴容 ~~~ List list = new ArrayList(80); ~~~ 創建集合的常用格式在此說明一下: 導包: ~~~ import java.util.ArrayList; ~~~ 創建對象:與其他普通的引用數據類型創建方式完全相同,但是要指定容器中存儲的數據類型: ~~~ ArrayList<要存儲元素的數據類型>變量名 = new ArrayList<要存儲元素的數據類型>(); ~~~ * 集合中存儲的元素,只能為<>括號中指定的數據類型元素; * "<要存儲元素的數據類型>"中的數據類型**必須是引用數據類型,不能是基本數據類型** 下面給出8種基本數據類型所對應的引用數據類型表示形式: 基本數據類型 對應的引用數據類型表示形式 基本數據類型 對應的引用 | byte | Byte | | --- | --- | | short | Short | | Int | Integer | | long | Long | | double | Double | | char | Character | | boolean | Boolean | * 存儲String類型的元素 ~~~ ArrayList<String> list = new ArrayList<String>(); ~~~ * 存儲int類型的數據 ~~~ ArrayList<Integer> list = new ArrayList<Integer>(); ~~~ * 存儲Phone類型的數據(要有Phone這個類) ~~~ ArrayList<Phone> list = new ArrayList<Phone>(); ~~~ ## 常用方法 方法聲明 功能描述 ~~~ boolean add(Object obj)將指定元素obj追加到集合的末尾 Object get(int index)返回集合中指定位置上的元素 int size() 返回集合中的元素個數 boolean add(int index, Object obj)將指定元素obj插入到集合中指定的位置 Object remve(int index)從集合中刪除指定index處的元素,返回該元素 void clear()清空集合中所有元素 Object set(int index,Object obj)用指定元素obj替代集合中指定位置上的元素 ~~~ ## 補充方法 boolean add(int index,Object obj) 功能:在集合中指定index位置,添加新元素obj 功能說明:假設集合list中有元素[“java”,“javaEE”],當使用add(1,“javaWeb”)后,集合list中的元素為[“java”,“javaWeb”,“JavaEE”]。 Object set(int index,Object obj) 功能:用指定元素obj替代集合中指定index位置的元素 功能說明:假設集合list中有元素[“java”,“javaEE”],當使用set(0,“javaWeb”)后,集合list中的元素為[“javaWeb”,“JavaEE”]。 Object remve(int index) 功能:從集合中刪除指定index處的元素,返回該元素 功能說明:假設集合list中有元素[“java”,“javaEE”],當使用remove(0)后,集合list中的元素為[“JavaEE”],返回值為“java”。 void clear() 功能:清空集合中所有元素 功能說明:假設集合list中有元素\[“java”,“javaEE”\],當使用clear\(\)后,集合list中的元素為空\[\]。 例如 ~~~ import java.util.ArrayList; public class ArrayListDemo01 { public static void main(String[] args) { // 創建ArrayList集合 ArrayList<String> list = new ArrayList<String>(); // 向集合中添加元素 list.add("stu1"); list.add("stu2"); list.add("stu3"); list.add("stu4"); // 獲取集合中元素的個數 System.out.println("集合的長度:" + list.size()); // 取出并打印指定位置的元素 System.out.println("第1個元素是:" + list.get(0)); System.out.println("第2個元素是:" + list.get(1)); System.out.println("第3個元素是:" + list.get(2)); System.out.println("第4個元素是:" + list.get(3)); } } ~~~ # 遍歷 ~~~ for (類型 變量: 數組|集合){ //每一次循環自動把數組的內容設置給變量 } ~~~ ~~~ import java.util.ArrayList; public class ArrayListDemo02 { public static void main(String[] args) { //創建ArrayList集合 ArrayList<Integer> list = new ArrayList<Integer>(); //添加元素到集合 list.add(13); list.add(15); list.add(22); list.add(29); //遍歷集合 for (int i = 0; i < list.size(); i++) { //通過索引,獲取到集合中每個元素 int n = list.get(i); System.out.println(n); } } } ~~~ # Collections.synchronizedList **線程安全的** 底層在集合的所有方法之上加上了synchronized synchronizedList修飾list如下: ~~~ private static List<String> TEST_LIST = Collections.synchronizedList(new ArrayList<String>()); ~~~ 因為ArrayList本身不是線程安全的,通過Collections.synchronizedList可以將其包裝成一個線程安全的List。 下面通過一個實例來理解synchronizedList的用法 ~~~ ArrayList<String> res = new ArrayList<>(); res.add("1"); res.add("2"); res.add("3"); List<String> synList = Collections.synchronizedList(res); synchronized (res) { //獲取迭代器 Iterator<String> iterator = synList.iterator(); //遍歷 while (iterator.hasNext()) { System.out.println(iterator.next()); } } ~~~ **synchronizedList在迭代的時候,需要開發者自己加上線程鎖控制代碼,因為在整個迭代的過程中如果在循環外面不加同步代碼,在一次次迭代之間,其他線程對于這個容器的add或者remove會影響整個迭代的預期效果,所以這里需要用戶在整個循環外面加上synchronized(list)** # CopyOnWriteArrayList ArrayList的線程安全的變體,其原理大概可以通俗的理解為:初始化的時候只有一個容器,很常一段時間,這個容器數據、數量等沒有發生變化的時候,大家(多個線程),都是讀取(假設這段時間里只發生讀取的操作)同一個容器中的數據,所以這樣大家讀到的數據都是唯一、一致、安全的,但是后來有人往里面增加了一個數據,這個時候CopyOnWriteArrayList?底層實現添加的原理是先copy出一個容器(可以簡稱副本),再往新的容器里添加這個新的數據,最后把新的容器的引用地址賦值給了之前那個舊的的容器地址,**但是在添加這個數據的期間,其他線程如果要去讀取數據,仍然是讀取到舊的容器里的數據** **如果不是寫少讀多的場景,使用 CopyOnWriteArrayList 開銷比較大,因為每次對其更新操作(add/set/remove)都會做一次數組拷貝。** `CopyOnWriteArrayList`的整個add操作都是在**鎖**的保護下進行的。 這樣做是為了避免在多線程并發add的時候,**復制出多個副本出來**,把數據搞亂了,導致最終的數組數據不是我們期望的。 `CopyOnWriteArrayList`的`add`操作的源代碼如下 ~~~ public boolean add(E e) { //1、先加鎖 final ReentrantLock lock = this.lock; lock.lock(); try { Object[] elements = getArray(); int len = elements.length; //2、拷貝數組 Object[] newElements = Arrays.copyOf(elements, len + 1); //3、將元素加入到新數組中 newElements[len] = e; //4、將array引用指向到新數組 setArray(newElements); return true; } finally { //5、解鎖 lock.unlock(); } } ~~~ 使用 ~~~ ArrayList<String> res = new ArrayList<String>(); res.add("1"); res.add("2"); res.add("3"); CopyOnWriteArrayList<String> copyOnWriteArrayList = new CopyOnWriteArrayList<>(res); copyOnWriteArrayList.add("4"); copyOnWriteArrayList.add("5"); System.out.println(copyOnWriteArrayList); ~~~
                  <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>

                              哎呀哎呀视频在线观看