目錄
1.無序&&唯一
2.真的唯一麼?
3.先入為主
4.set的其他實現類
hashset實現了set介面,內部主要是通過hashmap實現的.
1.無序&&唯一
public class hashsetdemo1 ;
collections.addall(set, str);
system.out.println(set);
}}
執行結果:[set, itaretor, collection, list, map]
可以看到,set的列印順序與陣列str不同,且重複"set"只能儲存一次,那麼hashset是如何判斷兩個物件是否是同乙個物件的呢?
2.真的唯一麼?
在hashmap內部對於是否是同乙個物件是這樣判斷的:
(p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))));
與三個條件有關:1st.判斷hash;2nd.判斷==;3rd.呼叫equals(),即如果(1st && (2nd || 3rd))滿足true,則視為物件.可見hashset內元素的唯一並非真正意義上的唯一,而是取決於如何定義hashcode()和equals()方法.下面依次進行驗證.
1)判斷hashcode()
public class hashsetdemo2
}class person
@override
public int hashcode()
}
執行結果:
hashcode被執行:366712642
hashcode被執行:1829164700
2由結果可知hashcode()方法被執行,由於hash值不同,p2可以新增到set中.注意:不要在新增元素之後嘗試修改hashset當中參與生成hash值的屬性,否則hash值的改變會導致很多問題.
2)判斷"=="
當hashcode相等時,會通過==判斷兩個物件是否是同乙個物件,如果是同乙個將不會再進行equals判斷(短路||).
public class hashsetdemo2
}class person
@override
public int hashcode()
@override
public boolean equals(object o)
}
執行結果:
hashcode被執行
hashcode被執行
1注意,此段**中的equals()未被呼叫.
3)呼叫equals判斷
當兩個物件hashcode相等但又不是同乙個物件,將呼叫equals方法再次進行判斷:如果true則視為同乙個物件,否則視為兩個物件(hash值衝突).
public class hashsetdemo2
}class person
@override
public int hashcode()
@override
public boolean equals(object o)
}
執行結果:
hashcode被執行
hashcode被執行
equals被執行
2如果上面equals返回true,則列印出的set.size()為1.
3.先入為主
hashset在新增元素時,如果認定了重複元素,hashset將遵循先入為主的原則,直接捨棄新元素.例:
public class hashsetdemo3
}class person
@override
public int hashcode()
@override
public boolean equals(object o)
@override
public string tostring()
}
執行結果:[小明]
4.set的其他實現類
1)treeset
內部通過二叉樹結構儲存資料,排序儲存,可在構造時自定義comparator按指定規則儲存.
API集合框架 Set集合之HashSet
set集合中不允許有相同的元素,並且取出集合中的元素的方式只有一種 迭代器 雜湊表 用於儲存元素與雜湊值對應的關係的容器 一.雜湊表特點 二.雜湊演算法原理 hashcode方法 hash element 因此從這裡可以看出來當我們從雜湊表中取出元素的時候,會發現與我們儲存元素的順序不一樣 三.雜湊...
集合框架Set介面之hashset
1 set介面 public inte ce set extends collection 乙個不包含重複元素的collection。更確切的說,set不包含滿足 e1.equal e2 的元素對e1和e2,並且最多包含乙個null元素.set介面不包含重複的元素,並且做多只能有乙個null值,而l...
java集合框架
集合框架包括集合與對映 collection and map 以及它們的子類 容器類 1 list 元素有先後次序的集合,元素有index位置,元素可以重複,繼承自collection介面,實現類 arraylist,vector,linkedlist 2 set 元素無續,不能重複新增,是數學意義...