Set集合
特点:无序(没有下标)不允许重复元素,和Collection方法相同,Set集合取出方法只有一个:迭代器。
HashSet:去重的功能
HashSet的去重功能是如何实现的?
每一个对象在创建时,就会给每一个对象分配一个hashCode码。当添加到Set集合中的对象的hashCode码不相同时,不会调用equals方法,并且对象直接存到Set集合中。当hashCode码相同的时候,会调用equals方法来查看是否是同一个对象,如果是,就无法添加。
所以在需要使用HashSet的去重功能对对象元素进行去重时,需要重写对象类型中的hashCode方法以及equals方法。
系统重写的hashCode()方法:
public int hashCode() { // 减少hashCode码 重复 // 提高效率 final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; }
系统重写的equals方法:
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; }
LinkedHashSet
linked表示有序的,即此集合中的元素怎么存进去就怎么区出来,顺序不发生改变。
TreeSet
TreeSet具有排序的功能。
排序方式:需要元素具备比较功能。所以元素需要实现Comparable接口,覆盖comparaTo方法。
如何保证元素唯一性?
参考的就是比较方法的返回值是否是0,是,就是重复元素,不存进去。
若是存储到TreeSet集合中的元素的比较功能并不是所需求的,或者元素不具备比较功能,此时就可以使用第二种比较方式:让集合具备比较功能,定义一个比较器。
比较器的定义:
实现ComparaTor接口,覆盖Compare方法。将Comparator接口的对象,作为参数传递给TreeSet集合的构造方法。
比较器的好处:
比较器更为灵活,自然排序通常都作为元素的默认排序。