HashSet集合的底层数据结构为哈希表,当存储已有类型的数据时,不需要重写equals和hashcode方法,如果存储自定义类型的数据需要将两个方法重写。存储过程中,先调用hashcode方法产生哈希值,根据哈希值寻找存储位置,如果两个数的哈希值相同,则调用equals方法,如果放回true则第二个元素不予存储(已经重复),否则,将其存储到哈希表中。
(1)存储已经定义的数据:
import java.util.HashSet; import java.util.Iterator; public class HashSetDemo { public static void main(String[] args) { HashSet<String> hs = new HashSet<String>(); hs.add("qwe"); hs.add("123qwe"); hs.add("q23we"); hs.add("qw1e"); hs.add("qwe"); Iterator<String> it = hs.iterator(); while (it.hasNext()) { String s = it.next(); System.out.println(s); } } }
由运行结果可知,不用重写equals和hashcode方法,即可去除重复元素。
(2)存储自定义类型的数据(重写equals和hashcode方法)
创建Person类,重写equals和hashcode方法:
public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { if (age >= 0 || age <= 200) this.age = age; } public int hashCode() {//哈希值 final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } public boolean equals(Object obj) { if (this == obj) return true; if (!(obj instanceof Person)) { System.out.println("类型错误"); return false; } Person other = (Person) obj; return this.age == other.age && this.name.equals(other.name); } }
创建Way类,添加数据、遍历集合:
import java.util.HashSet; import java.util.Iterator; public class Way { // 添加元素 public void addHash(HashSet<Person> hash) { Person p1 = new Person(); Person p2 = new Person(); Person p3 = new Person(); Person p4 = new Person(); Person p5 = new Person(); Person p6 = new Person(); Person p7 = new Person(); p1.setAge(12); p1.setName("张敏"); p2.setAge(11); p2.setName("吴喜爱"); p3.setAge(14); p3.setName("小猫咪"); p4.setAge(67); p4.setName("吴长春"); p5.setAge(34); p5.setName("Tom"); p6.setAge(67); p6.setName("吴长春"); p7.setAge(34); p7.setName("Tom"); hash.add(p1); hash.add(p2); hash.add(p3); hash.add(p4); hash.add(p5); hash.add(p6); hash.add(p7); } // 运用迭代器方法遍历集合 public void iteratorPrint(HashSet<Person> hash) { System.out.println("迭代器方法遍历集合:"); Iterator<Person> hashIt = hash.iterator();// 获取集合的实现类对象,病调用集合的iterator() while (hashIt.hasNext()) { Person per = hashIt.next(); System.out.println(per.getName() + " " + per.getAge()); } } }
创建测试类:
import java.util.HashSet; public class HashDemo { public static void main(String[] args) { HashSet<Person> hash = new HashSet<Person>(); Way way = new Way(); way.addHash(hash); way.iteratorPrint(hash); } }
运行结果:
由运行结果可以看出,重写两个方法后,可以将姓名与年龄相同的对象,只保留一个。