HashSet
hashSet的特点:
无序性:无序性指的是元素在底层存储的位置是无序的,不等于随机性;
不可重复性:当向Set中添加相同的元素时,只能添加进第一个,后面的不能被添加进去。
HashSet中元素的存储原理(哈希算法):
当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算次对象的哈希值,此哈希值决定了此对象在Set中存放的位置;若此位置没有被存储对象则直接存储,若已有对象则通过对象所在类的equals()比较两个对象是否相同,相同则不能被添加。
通过原理的讲解,得出一个注意点:存放在Set中的元素的所在类必须重写equals()方法和HashCode()方法。
下面举个HashSet的实例:
public void testHashSet(){
Set set = new HashSet();
set.add(123);
set.add("AA");
set.add(null);
Person p1 = new Person("GG",23);
Person p2 = new Person("MM",21);
set.add(p1);
set.add(p2);
}
Person类 (有name和age两个属性)
1、重写hashCode()
public int 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;
}
2、重写equles()
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集合元素时,回按照添加的顺序进行返回,尽管如此,LinkedHashSet仍然是无序的。
linkedHashSet遍历:
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}