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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] # list List的介紹。有序的 collection(也稱為序列)。此接口的用戶可以對列表中每個元素的插入位置進行精確地控制。用戶可以根據元素的整數索引(在列表中的位置)訪問元素,并搜索列表中的元素。與 set 不同,列表通常允許重復的元素 List接口: * 它是一個元素存取有序的集合。例如,存元素的順序是11、22、33。那么集合中,元素的存儲就是按照11、22、33的順序完成的)。 * 它是一個帶有索引的集合,通過索引就可以精確的操作集合中的元素(與數組的索引是一個道理)。 * 集合中可以有重復的元素,通過元素的equals方法,來比較是否為重復的元素。 List接口的常用子類有: * ArrayList集合 * LinkedList集合 ## list常用方法 ![](https://box.kancloud.cn/b3228d72b9fc645e0b279e0de9fcec94_892x400.png) * 增加元素方法 - add(Object e):向集合末尾處,添加指定的元素 - add(int index, Object e):向集合指定索引處,添加指定的元素,原有元素依次后移 * 刪除元素方法 - remove(Object e):將指定元素對象,從集合中刪除,返回值為被刪除的元素 - remove(int index):將指定索引處的元素,從集合中刪除,返回值為被刪除的元素 * 替換元素方法 - set(int index, Object e):將指定索引處的元素,替換成指定的元素,返回值為替換前的元素 * 查詢元素方法 - get(int index):獲取指定索引處的元素,并返回該元素 **由于List集合擁有索引,因此List集合迭代方式除了使用迭代器之外,還可以使用索引進行迭代。** ~~~ for (int i = 0; i < list.size(); i++) { String str = list.get(i); System.out.println(str); } ~~~ ## Iterator的并發修改異常 在list集合迭代元素中,對元素進行判斷,一旦條件滿足就添加一個新元素。代碼如下 ~~~ //創建List集合 List<String> list = new ArrayList<String>(); //給集合中添加元素 list.add("abc1"); list.add("abc2"); list.add("abc3"); list.add("abc4"); //迭代集合,當有元素為"abc2"時,集合加入新元素"itcast" Iterator<String> it = list.iterator(); while(it.hasNext()){ String str = it.next(); //判斷取出的元素是否是"abc2",是就添加一個新元素 if("abc2".equals(str)){ list.add("123");// 該操作會導致程序出錯 } } //打印容器中的元素 System.out.println(list); ~~~ 運行上述代碼發生了錯誤 java.util.ConcurrentModificationException這是什么原因呢? 在迭代過程中,使用了集合的方法對元素進行操作。導致迭代器并不知道集合中的變化,容易引發數據的不確定性。 **并發修改異常解決辦法:在迭代時,不要使用集合的方法操作元素。 那么想要在迭代時對元素操作咋辦?通過ListIterator迭代器操作元素是可以的,ListIterator的出現,解決了使用Iterator迭代過程中可能會發生的錯誤情況** **如何解決 ** 第一: 使用普通for循環 第二(重點):使用listIterator -->是List 特有的,其他集合不能使用 **注意添加的時候一定要用ListIterator添加,不是list** ~~~ public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("abc1"); list.add("abc2"); list.add("abc3"); ListIterator<String> it = list.listIterator(); while (it.hasNext()) { String str = it.next(); if ("abc1".equals(str)) { //這邊要用迭代器添加,不能用list添加 it.add("123"); } } System.out.println(list); } ~~~ ## java.lang.Iterable.forEach java8提供了循環的新方式 以下是幾個示例,運行結果就不貼出來了,就是循環顯示 ~~~ String[] a = { "17", "52", "33", "412", "59", "62", "71" }; List<String> list = Arrays.asList(a); //這個是使用的lambda表達式的的循環 list.forEach(cc -> System.out.println(cc)); ~~~ ~~~ String[] a = { "17", "52", "33", "412", "59", "62", "71" }; List<String> list = Arrays.asList(a); //這個是使用lambda表達式的簡化版本雙冒號表達式(調用out對象的println方法) list.forEach(System.out::println); ~~~ ~~~ String[] a = { "17", "52", "33", "412", "59", "62", "71" }; List<String> list = Arrays.asList(a); //這個還是用的java8提供的新函數,但是沒有用lambda表達式 list.forEach(new Consumer<String>() { @Override public void accept(String t) { // TODO Auto-generated method stub System.out.println(t); } }); ~~~ ## 數據類型 棧 : 手槍的彈夾 : 手槍的壓棧 ---> 喝酒 --->先進后出,后進先出 隊列 : 超市的購物,先排隊,先處理 ---> 喝酒 --->先進去,先出來,后進去,后出來 數組 : 查找快:因為底層有索引,并且是連續 增刪慢: 數組的長度的是固定的,當我們在進行增刪時,會創建一個新的數組,并且將老數組中的值拷貝到新數組中 鏈表: 查找慢(底層是鏈表,兩兩相連,依次往下找,直到找到為止) --->linkedList 采用二分法查找 增刪快 :原因在于他僅僅只需要改變相鄰元素的地址值 ## ArrayList集合 **線程不安全的** Collections中定義了synchronizedList(List list)將此ArrayList轉化為線程安全的 **ArrayList集合數據存儲的結構是數組結構。元素增刪慢,查找快**,由于日常開發中使用最多的功能為查詢數據、遍歷數據,所以ArrayList是最常用的集合。 許多程序員開發時非常隨意地使用ArrayList完成任何需求,并不嚴謹,這種用法是不提倡的。 ## LinkedList集合 **線程不安全,線程安全用ConcurrentLinkedQueue** **LinkedList集合數據存儲的結構是鏈表結構。方便元素添加、刪除的集合。** 實際開發中對一個集合元素的添加與刪除經常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法 ![](https://box.kancloud.cn/990ac96df4da9861d721a5b33026b6c7_908x907.png) LinkedList是List的子類,List中的方法LinkedList都是可以使用 ~~~ LinkedList<String> link = new LinkedList<String>(); //添加元素 link.addFirst("abc1"); link.addFirst("abc2"); link.addFirst("abc3"); //獲取元素 System.out.println(link.getFirst()); System.out.println(link.getLast()); //刪除元素 System.out.println(link.removeFirst()); System.out.println(link.removeLast()); while(!link.isEmpty()){ //判斷集合是否為空 System.out.println(link.pop()); //彈出集合中的棧頂元素 } ~~~ ## Vector集合 Vector集合數據存儲的結構是**數組結構**,為JDK中最早提供的集合。Vector中提供了一個獨特的取出方式,就是枚舉Enumeration,它其實就是早期的迭代器。 此接口Enumeration的功能與 Iterator 接口的功能是類似的。Vector集合已被ArrayList替代。枚舉Enumeration已被迭代器Iterator替代。 ![](https://box.kancloud.cn/d98522b8940b6dbe7bdaf1ba53380cec_910x453.png) Vector集合對ArrayList集合使用的對比 ArrayList是線程不安全的 Vector線程安全 # toArray() 需要特別注意,不能這樣寫: ~~~ ArrayList<String> list=new ArrayList<String>(); String strings[]=(String [])list.toArray(); ~~~ 這樣寫編譯沒有什么問題,但是運行時會報ClassCastException,這是因為Java中允許向上和向下轉型,但是這個轉型是否成功是根據Java虛擬機中這個對象的類型來實現的。Java虛擬機中保存了每個對象的類型。而數組也是一個對象。數組的類型是java.lang.Object。把java.lang.Object轉換成java.lang.String是顯然不可能的事情,因為這里是一個向下轉型,而虛擬機只保存了這是一個Object的數組,不能保證數組中的元素是String的,所以這個轉型不能成功。數組里面的元素只是元素的引用,不是存儲的具體元素,所以數組中元素的類型還是保存在Java虛擬機中的。 因此正確的方法是這樣的 ~~~ //要轉換的list集合 List<String> testList = new ArrayList<String>(){{add("aa");add("bb");add("cc");}}; //使用toArray(T[] a)方法 String[] array2 = testList.toArray(new String[testList.size()]); //打印該數組 for(int i = 0; i < array2.length; i++){ System.out.println(array2[i]); } ~~~
                  <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>

                              哎呀哎呀视频在线观看