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集合的构造方法。
比较器的好处:
比较器更为灵活,自然排序通常都作为元素的默认排序。