<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] Collection中的常用幾個子類(List集合、Set集合) # list List的介紹。有序的 collection(也稱為序列)。此接口的用戶可以對列表中每個元素的插入位置進行精確地控制。用戶可以根據元素的整數索引(在列表中的位置)訪問元素,并搜索列表中的元素。與 set 不同,列表通常允許重復的元素 List接口: * 它是一個元素存取有序的集合。例如,存元素的順序是11、22、33。那么集合中,元素的存儲就是按照11、22、33的順序完成的)。 * 它是一個帶有索引的集合,通過索引就可以精確的操作集合中的元素(與數組的索引是一個道理)。 * 集合中可以有重復的元素,通過元素的equals方法,來比較是否為重復的元素。 List接口的常用子類有: * ArrayList集合 * LinkedList集合 ## list常用方法 ![](https://box.kancloud.cn/911f4fd0b357d7686dfa1f5e7a3cad6a_1698x732.jpg) * 增加元素方法 - 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("itcast");// 該操作會導致程序出錯 } } //打印容器中的元素 System.out.println(list); ~~~ 運行上述代碼發生了錯誤 java.util.ConcurrentModificationException這是什么原因呢? 在迭代過程中,使用了集合的方法對元素進行操作。導致迭代器并不知道集合中的變化,容易引發數據的不確定性。 **并發修改異常解決辦法:在迭代時,不要使用集合的方法操作元素。 那么想要在迭代時對元素操作咋辦?通過ListIterator迭代器操作元素是可以的,ListIterator的出現,解決了使用Iterator迭代過程中可能會發生的錯誤情況** **如何解決 ** 第一: 使用普通for循環 第二(重點):使用listIterator -->是List 特有的,其他集合不能使用 ## 數據類型 棧 : 手槍的彈夾 : 手槍的壓棧 ---> 喝酒 --->先進后出,后進先出 隊列 : 超市的購物,先排隊,先處理 ---> 喝酒 --->先進去,先出來,后進去,后出來 數組 : 查找快:因為底層有索引,并且是連續 增刪慢: 數組的長度的是固定的,當我們在進行增刪時,會創建一個新的數組,并且將老數組中的值拷貝到新數組中 鏈表: 查找慢(底層是鏈表,兩兩相連,依次往下找,直到找到為止) --->linkedList 采用二分法查找 增刪快 :原因在于他僅僅只需要改變相鄰元素的地址值 ## ArrayList集合 ArrayList集合數據存儲的結構是數組結構。元素增刪慢,查找快,由于日常開發中使用最多的功能為查詢數據、遍歷數據,所以ArrayList是最常用的集合。 許多程序員開發時非常隨意地使用ArrayList完成任何需求,并不嚴謹,這種用法是不提倡的。 ## LinkedList集合 LinkedList集合數據存儲的結構是鏈表結構。方便元素添加、刪除的集合。實際開發中對一個集合元素的添加與刪除經常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法 ![](https://box.kancloud.cn/46ab54998ed03cf2b503d713e8a105e2_1324x1288.jpg) 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/84683877e7a973fc8a84826796bcd0c3_1836x900.jpg) Vector集合對ArrayList集合使用的對比 ![](https://box.kancloud.cn/8ea50cd32449d9fa438c9cf981c8fcb9_1872x664.jpg) # Set接口 學習Collection接口時,記得Collection中可以存放重復元素,也可以不存放重復元素,那么我們知道List中是可以存放重復元素的。那么不重復元素給哪里存放呢?那就是Set接口,它里面的集合,所存儲的元素就是不重復的。 查閱Set集合的API介紹,通過元素的equals方法,來判斷是否為重復元素 ## HashSet 查閱HashSet集合的API介紹:此類實現Set接口,由哈希表支持(實際上是一個 HashMap集合)。HashSet集合不能保證的迭代順序與元素存儲順序相同。 HashSet集合,采用哈希表結構存儲數據,保證元素唯一性的方式依賴于:hashCode()與equals()方法。 ## HashSet集合存儲數據的結構(哈希表) 什么是哈希表呢? 哈希表底層使用的也是數組機制,數組中也存放對象,而這些對象往數組中存放時的位置比較特殊,當需要把這些對象給數組中存放時,那么會根據這些對象的特有數據結合相應的算法,計算出這個對象在數組中的位置,然后把這個對象存放在數組中。而這樣的數組就稱為哈希數組,即就是哈希表。 當向哈希表中存放元素時,需要根據元素的特有數據結合相應的算法,這個算法其實就是Object類中的hashCode方法。由于任何對象都是Object類的子類,所以任何對象有擁有這個方法。即就是在給哈希表中存放對象時,會調用對象的hashCode方法,算出對象在表中的存放位置,這里需要注意,如果兩個對象hashCode方法算出結果一樣,這樣現象稱為哈希沖突,這時會調用對象的equals方法,比較這兩個對象是不是同一個對象,如果equals方法返回的是true,那么就不會把第二個對象存放在哈希表中,如果返回的是false,就會把這個值存放在哈希表中。 總結:保證HashSet集合元素的唯一,其實就是根據對象的hashCode和equals方法來決定的。如果我們往集合中存放自定義的對象,那么保證其唯一,就必須復寫hashCode和equals方法建立屬于當前對象的比較方式。 ![](https://box.kancloud.cn/b628048ae711aba9335b97cf1a9aed14_1422x690.jpg) ## HashSet存儲JavaAPI中的類型元素 給HashSet中存儲JavaAPI中提供的類型元素時,不需要重寫元素的hashCode和equals方法,因為這兩個方法,在JavaAPI的每個類中已經重寫完畢,如String類、Integer類等。 ~~~ //創建HashSet對象 HashSet<String> hs = new HashSet<String>(); //給集合中添加自定義對象 hs.add("zhangsan"); hs.add("lisi"); hs.add("wangwu"); hs.add("zhangsan"); //取出集合中的每個元素 Iterator<String> it = hs.iterator(); while(it.hasNext()){ String s = it.next(); System.out.println(s); } ~~~ 輸出結果如下,說明集合中不能存儲重復元素: wangwu lisi zhangsan ## HashSet存儲自定義類型元素 給HashSet中存放自定義類型元素時,需要重寫對象中的hashCode和equals方法,建立自己的比較方式,才能保證HashSet集合中的對象唯一 創建自定義對象Student ~~~ public class Student { private String name; private int age; public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if(!(obj instanceof Student)){ System.out.println("類型錯誤"); return false; } Student other = (Student) obj; return this.age == other.age && this.name.equals(other.name); } } ~~~ 創建HashSet集合,存儲Student對象。 ~~~ public class HashSetDemo { public static void main(String[] args) { //創建HashSet對象 HashSet hs = new HashSet(); //給集合中添加自定義對象 hs.add(new Student("zhangsan",21)); hs.add(new Student("lisi",22)); hs.add(new Student("wangwu",23)); hs.add(new Student("zhangsan",21)); //取出集合中的每個元素 Iterator it = hs.iterator(); while(it.hasNext()){ Student s = (Student)it.next(); System.out.println(s); } } } ~~~ 輸出結果如下,說明集合中不能存儲重復元素: ~~~ Student [name=lisi, age=22] Student [name=zhangsan, age=21] Student [name=wangwu, age=23] ~~~ ## LinkedHashSet 我們知道HashSet保證元素唯一,可是元素存放進去是沒有順序的,那么我們要保證有序,怎么辦呢? 在HashSet下面有一個子類LinkedHashSet,它是鏈表和哈希表組合的一個數據存儲結構。 演示代碼如下: ~~~ public class LinkedHashSetDemo { public static void main(String[] args) { Set<String> set = new LinkedHashSet<String>(); set.add("bbb"); set.add("aaa"); set.add("abc"); set.add("bbc"); Iterator it = set.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } } ~~~ 輸出結果如下,LinkedHashSet集合保證元素的存入和取出的順序: bbb aaa abc bbc # 判斷集合元素唯一的原理 ## ArrayList的contains方法判斷元素是否重復原理 ![](https://box.kancloud.cn/0f99b2a560fd2012cf4cae1283b5d106_1108x108.jpg) ArrayList的contains方法會使用調用方法時,傳入的元素的equals方法依次與集合中的舊元素所比較,從而根據返回的布爾值判斷是否有重復元素。此時,當ArrayList存放自定義類型時,由于自定義類型在未重寫equals方法前,判斷是否重復的依據是地址值,所以如果想根據內容判斷是否為重復元素,需要重寫元素的equals方法。 ## HashSet的add/contains等方法判斷元素是否重復原理 ![](https://box.kancloud.cn/1ea81afeed670cd6f64935235e76cb11_1234x214.jpg) Set集合不能存放重復元素,其添加方法在添加時會判斷是否有重復元素,有重復不添加,沒重復則添加。 HashSet集合由于是無序的,其判斷唯一的依據是元素類型的hashCode與equals方法的返回結果。規則如下: 先判斷新元素與集合內已經有的舊元素的HashCode值 * 如果不同,說明是不同元素,添加到集合。 * 如果相同,再判斷equals比較結果。返回true則相同元素;返回false則不同元素,添加到集合。 所以,使用HashSet存儲自定義類型,如果沒有重寫該類的hashCode與equals方法,則判斷重復時,使用的是地址值,如果想通過內容比較元素是否相同,需要重寫該元素類的hashcode與equals方法。
                  <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>

                              哎呀哎呀视频在线观看