HashSet是无序(输入和输出顺序不一样),不重复,底层数据结构是哈希表。
package test1;
import java.util.HashSet;import java.util.Iterator;
class Person{
private String name;
private int age;
Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class test {
public static void main(String[] args){
HashSet hs=new HashSet();
hs.add(new Person("li",23));//返回值类型为boolean
hs.add(new Person("li",23));
hs.add(new Person("li2",23));
Iterator it=hs.iterator();
while(it.hasNext()){
Person ps=(Person)it.next();
System.out.println(ps.getName()+" "+ps.getAge());
}
}
}
运行输出结果:
li 23
li 23
li2 23
由结果可以发现,输出了两个相同元素,和HashSet元素不重复特点矛盾,其实不然
可以直接根据hashcode值判断两个对象是否相等吗?肯定是不可以的,因为不同的对象可能会生成相同的hashcode值。虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须通过equals方法。
两个Person对象是new出来的,哈希值不一样,就是两个对象,所以都输出来了。
HashSet判断两个对象相等的标准是,先看哈希值是否相等,若不相同,则为两个对象,若相同,再判断equals方法是否返回true。
下面重写hashCode() equals()方法
package test1;
import java.util.HashSet;
import java.util.Iterator;
class Person{
private String name;
private int age;
@Override
public int hashCode() {
return 100;
//return name.hashCode()+age;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person))
return false;
Person p =(Person)obj;
return this.name.equals(p.name)&&this.age==p.age;
}
Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class test {
public static void main(String[] args){
HashSet hs=new HashSet();
hs.add(new Person("li",23));
hs.add(new Person("li",23));
hs.add(new Person("li2",23));
Iterator it=hs.iterator();
while(it.hasNext()){
Person ps=(Person)it.next();
System.out.println(ps.getName()+" "+ps.getAge());
}
}
}
运行输出结果:
li 23
li2 23
Hhashset