集合关系如上所示
|–set:元素是无序的(存入和取出顺序不一致) 元素不可以重复
|–HasSet: 底层数据结构是哈希表(按照哈希值存储)。
HashSet是如何保证元素的唯一性的呢?
是通过元素的两个方法,hashCode和equals方法
如果元素的HashCode值相同,才会判断equals方法为ture
如果元素的HashCode值不同,不会调用Equals方法
注意:对于判断元素是否存在,以及删除等操作时,依赖的方法是HashCode和equals方法
ArrayList靠equals方法判断
|–TreeSet
和collection中的功能时一致
/*****示例
往HasSet集合中存入自定对对象
姓名和年龄相同视为同一个人
*/
import java.util.*;
class HashSetTest
{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
HashSet hs = new HashSet();
hs.add(new Person2("Wangwu01",29));
hs.add(new Person2("Wangwu02",28));
hs.add(new Person2("Wangwu03",27));
hs.add(new Person2("Wangwu04",26));
hs.add(new Person2("Wangwu05",25));
// hs.add(new Person2("Wangwu04",26));
// sop(hs.contains(new Person2("Wangwu02",28)));
hs.remove(a);
Iterator it = hs.iterator();
while(it.hasNext())
{
Person2 p =(Person2)it.next(); //向下转型
sop(p.getName()+"......"+p.getAge());
}
}
}
class Person2
{
private String name;
private int age;
Person2(String name, int age)
{
this.name=name;
this.age =age;
}
//复写hashCode方法
public int hashCode() //执行Person类时会自动调用Hash值,分配地址
{
System.out.println(this.name+"....hashCode....");
// return 60;
return name.hashCode()+age*37; //为保证返回的哈希值唯一,进行一些处理
}
public boolean equals(Object obj)
{
if(!(obj instanceof Person2)) //instanceof判断两个对象类型是否一致
return false;
Person2 p =(Person2)obj; //向下转型
System.out.println(this.name+"...equals..."+p.name);
return this.name.equals(p.name) && this.age == p.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}