package Container; import java.util.HashSet; import java.util.Iterator; /* Set 元素是无序的(存入和取出的顺序不一定一致),元素不可以重复 |---HashSet:底层数据结构是哈希表 | HashSet是如何保证元素唯一性呢? | 是通过两个方法来完成的 hashCode 和 equals来完成的 | 如果元素的hashCode值相同,才会判断 equals 是否为true | 如果hashCode值不相同,不会调用 equals | | 注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的 | hashCode和equals方法 | (arrayList判断元素是否存在只依赖于equals方法) |---TreeSet: Set 集合的功能和 Collection 是一致的 */ 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 int getage() { return age; } // 重写 hashCode 方法 public int hashCode() { // return 1; 这种方法也能得到效果但会调用 equals 方法,并且 比较次数比较多 // 该种方法调用 String 的hashCode 方法,就不会调用 equals 方法,比较次数少 return name.hashCode()+age*39; // 保证 hashCode 值的唯一性 } public boolean equals(Object obj) { if (!(obj instanceof Person)) return false; Person person = (Person)obj; return this.name.equals(person.name) && this.age == person.age; } } public class HashSetDemoTwo { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) { HashSet<Person> hs = new HashSet<Person>(); hs.add(new Person("a1", 11)); hs.add(new Person("a2", 12)); hs.add(new Person("a3", 13)); hs.add(new Person("a4", 14)); hs.add(new Person("a5", 15)); hs.add(new Person("a3", 13)); System.out.println( hs.contains(new Person("a1", 11))); // 判断 a1 是否存在于集合中 sop("al:"+hs.contains(new Person("a1", 11))); // 将 a3 移除集合中 hs.remove(new Person("a3", 13)); // 遍历集合 Iterator<Person> it = hs.iterator(); while (it.hasNext()) { Person person = (Person) it.next(); sop(person.getname()+"==="+person.getage()); } } }