set集合知識
/*
* Set:存儲的元素是無序的,不可重復的!
* 1.無序性:無序性!= 隨機性。真正的無序性,指的是元素在底層存儲的位置是無序的(存儲時根據hash值隨機存儲)(add一個元素就調用hashCode()方法算出hsah值 不同的元素算出的hsah值是不相同的並且是沒有順序 根據hash值給元素指定位置,就像同學進教室做座位一樣)。
* 2.不可重復性:當向Set中添加進相同的元素的時候,後面的這個不能添加進去。new 出來的對象也不行
*說明:要求添加進Set中的元素所在的類(自定義類),一定要重寫equals()和hashCode()方法。 進而保證Set中元素的不可重復性!(先算hash值 根據hash值指定位置 ,hash值相同再比較equals()方法)
*
* Set中的元素時如何存儲的呢?使用了哈希算法。
* 當向Set中添加對象時,首先調用此對象所在類的hashCode()方法,計算此對象的哈希值,此哈希值,決定了此對象在Set中的存儲位置。若此位置之前沒有對象存儲,則這個對象直接存儲到此位置。若此位置
* 已有對象存儲,再通過equals()比較這兩個對象是否相同。如果相同,後一個對象就不能再添加進來。 萬一返回false呢,都存儲。(不建議如此)
* >要求:hashCode()方法要與equals()方法一致,(當兩個元素算出同一個hash值時 比較equals(),方法也要為true)
*/
@Test
public void testHashSet() {
Set set = new HashSet();
set.add(123);
set.add(456);
set.add(new String("AA"));
set.add(new String("AA")); //String重寫了兩個方法
set.add("BB");
set.add(null); //可以存null
Person p1 = new Person("GG", 23);
Person p2 = new Person("GG", 23);
System.out.println(p1.equals(p2));
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
set.add(p1);
set.add(p2);
System.out.println(set.size());
System.out.println(set);
}
類中重寫
//static int init = 1000;
@Override
public int hashCode() {//return age.hashCode() + name.hashCode();沒下述的健壯性好。
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
//return init++;//不能這樣用
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
/*
* LinkedHashSet:使用鏈表維護了一個添加進集合中的順序。導致當我們遍歷LinkedHashSet集合
* 元素時,是按照添加進去的順序遍歷的!
* LinkedHashSet插入性能略低於 HashSet,但在叠代訪問 Set 裏的全部元素時有很好的性能。
*/
@Test
public void testLinkedHashSet() {
Set set = new LinkedHashSet();
set.add(123);
set.add(456);
set.add(new String("AA"));
set.add(new String("AA"));
set.add("BB");
set.add(null);
存入得位置也是無需 根據算出來的hash值存儲
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());//鏈表叠代出來的是按照存入得順序(因為鏈表有下標指針,指向下一個元素)
}
}
本文出自 “11854647” 博客,請務必保留此出處http://11864647.blog.51cto.com/11854647/1975012
set集合知識