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