集合總結 --- Set

HashSet

原理:底層是hash表,根據對象的hash值來存儲  (hash碼:collection.Demo@1540e19d)

判斷hash值是否相等的底層實現(JDK1.7):數組+鏈表

  • 首先判斷hash值是否相等 (調用hashCode()方法)
  • 如果不相等,則將對象存儲到hash表中
  • 如果相等,則比較是否爲同一對象(調用equal()方法)
  • 如果部位同一對象,則以鏈表形式存儲

判斷hash值是否相等的底層實現(JDK1.8):數組+鏈表+紅黑樹

查詢複雜度

  • HashSet時根據元素的hashCode來快速定位元素位置的O(1)
  • 而使用鏈表存儲後,查詢效率性能爲O(n)

建議:

  • 儘量複寫hashCode() ,讓其就可以區別各個對象而不需要執行equals() ,例如:return name.hashCode()+age*37;

TreeSet

特點:可以對存儲的元素進行排序(可以讓集合自身具有比較性

實現自然排序方式1:元素實現Comparable接口

實現自然排序方式2:讓集合自身具有比較性

  • 定義了比較器,讓其實現Comparator接口,實現compare(Object o1,Object o2)
  • 將比較器對象作爲參數傳遞給TreeSet集合的構造函數

注意:

  • 如果兩種排序方式存在,則以比較器爲主
  • 放入集合的對象,其類需要重新hashCode()  和  equal()
public class TreeSetDemo {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet(new MyCompare());

        ts.add(new Person("abc",1));
        ts.add(new Person("abb",2));
        ts.add(new Person("bc",3));
        ts.add(new Person("cd",2));
        ts.add(new Person("abb",3));

        Iterator it = ts.iterator();
        while(it.hasNext()){
            Person p = (Person)it.next();
            System.out.println(p.getAge()+":"+p.getName());
        }
    }
}

class MyCompare implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        Person p1 = (Person)o1;
        Person p2 = (Person)o2;

        int num =  p1.getName().compareTo(p2.getName());
        if(num == 0){
            if(p1.getAge() > p2.getAge()){
                return 1;
            }
            if(p1.getAge() < p2.getAge()){
                return -1;
            }
            return 0;
        }
        return num;
    }
}

 

 

 

發佈了124 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章