HashSet的特点:
- 它是无序的,即添加的顺序和遍历出来的顺序是不同的
- 它里面不允许有重复元素,是因为它是基于HashMap实现的
- 实现了Set接口,由哈希表(实际上是一个HashMap实例)支持
- 底层数据结构是哈希表
如何将自定义类对象存入HashSet进行去重呢?
-
类中必须重写hashCode()方法和equals()方法
-
equals()方法中比较所有属性
-
hashCode()方法要保证属性相同的对象返回值相同, 属性不同的对象尽量不同,对象的成员变量值相同即为同一个元素
以上来源:https://blog.csdn.net/colinchen1996/article/details/77887539
---------------------------------------实践---------------------------------------------
Person类
package testHashSet; public class Person { public String name; public int age; public 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; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @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 != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
测试代码:
package testHashSet; import java.util.HashSet; public class testHashSet { public static void main(String[] args) { HashSet hashSet = new HashSet(); hashSet.add(new Person("王一",1)); hashSet.add(new Person("王一",1)); hashSet.add(new Person("张三",11)); hashSet.add(new Person("张三",1)); hashSet.add(new Person("李二",2)); hashSet.add(new Person("李二",2)); System.out.println(hashSet); } }
输出结果:
[Person [name=李二, age=2], Person [name=张三, age=1], Person [name=张三, age=11], Person [name=王一, age=1]]
- 它是无序的,即添加的顺序和遍历出来的顺序是不同的
- 重写了hashCode()方法和equals()方法,不允许出现重复元素