1、两个方法的要求
要求:向Set中添加数据,其所在类一定要重写hashCode()和equals()。hashCode与equals()要保持一致。(实现对等规则)
对一致的理解
- HashSet集合判断两个元素相等的标准:两个对象通过hashCode()方法比较相等,并且两个对象的equals()返回值也相等。
- 即相等对象必须具有相等的散列码。
技巧:自动生成
HashSet 底层:数组+链表结构
2、LinkedHashSet
LinkedHashSet 添加数据的同时,实现双向链表记录前驱后继。
优点:频繁的遍历操作可使用,效率较高
@Test
public void hashSetest(){
Set set1 = new LinkedHashSet();
set1.add(123);
set1.add(123);
set1.add(456);
set1.add("aa");
set1.add("BB");
set1.add(new Person());
//次处的两个类对应得两个对象的equals() 方法只比较 name
// 相同返回true
System.out.println("两个对象比较返回值为:");
Person person = new Person("Tom", "程序员", 26);
User user = new User("Tom", "程序员", 26);
System.out.println(person.equals(user));//true
set1.add(new Person("Tom","程序员",26));
set1.add(new User("Tom","程序员",26));
System.out.println("遍历的结果为:(可以看出两个对象只有一个存入set1)");
System.out.println("");
Iterator iterator = set1.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
运行结果
两个对象比较返回值为:
使用equals()
false
遍历的结果为:(可以看出两个对象只有一个存入set1)
123
456
aa
BB
Person{name='null', profession='null', age=0}
Person{name='Tom', profession='程序员', age=26}
com.clection.User@3dbb3858