<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國際加速解決方案。 廣告
                [TOC] # 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/444fbb6c603a05b62ce16c8154a390ea_916x432.png) ## 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] ~~~ ## jdk1.8之后 jdk8之前: 哈希表=數組+鏈表 jdk8之后: 哈希表=數組+鏈表 哈希表=數組+紅黑樹(提高查詢效率) ![](https://img.kancloud.cn/aa/ef/aaef9531c4138849c7dce5c799919a58_1025x537.png) ## 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 ~~~ # TreeSet 元素能否add成功,是否能remove,是否constains,都依賴compareTo()或compare()與元素所在類的equals/hashCode無關 可以按照添加的元素的指定屬性的大小實現遍歷.底層實現:紅黑樹 1. 向TreeSet中添加的元素必須是同一個類創建的對象 2. 如果是存對象,對象要實現Comparable接口 ~~~ TreeSet<String> set = new TreeSet<>(); set.add("a"); set.add("b"); set.add("c"); set.add("d"); System.out.println(set); ~~~ TreeSet排序的方式: 1. 自然排序 2. 定制排序 自然排序: 1. 要求添加元素所在的類要實現Comparable接口 2. 重寫接口中compareTo(Object obj)--->指明排序的規則 定制排序 1. 提供Comparator接口匿名實現類對象 2. 重寫其中的compare(Object o1, Object o2),指明排序的規則 3. 將此類的對象作為參數傳遞到TreeSet的構造器中 4. 向TreeSet的對象中添加compare()方法中判斷的類的對象 定制排序的例子 Person類(這邊沒有實現Comparable接口,是定制排序,自然排序那就要了) ~~~ package com.study; public class Person { private String name; private int age; public Person(String name, int age) { 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() { final StringBuilder sb = new StringBuilder("{"); sb.append("\"name\":\"") .append(name).append('\"'); sb.append(",\"age\":") .append(age); sb.append('}'); return sb.toString(); } } ~~~ 如果是自然排序(`Set set = new TreeSet<Person>();`)這樣就行了 ~~~ Comparator com = (o1, o2) -> { Person person1 = (Person) o1; Person person2 = (Person) o2; return person1.getAge() - person2.getAge(); }; Set set = new TreeSet<Person>(com); set.add(new Person("jdxia", 17)); set.add(new Person("xjd", 12)); set.add(new Person("x", 23)); System.out.println(set); ~~~
                  <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>

                              哎呀哎呀视频在线观看