Set集合
存储元素无序,且唯一。
HashSet:
依赖于hashCode()与equals()方法
首先比较哈希值:
若,相同,比较地址值或者equals()
相同,说明元素重复,不添加
不同说明元素不重复,添加到集合中
若,不同,直接添加到集合中
若一个类中没有重写hashCode()和equals()则直接继承自Object类
当hashCode相同时,equals()不同,会对元素添加到同一个链式结构上,这样做效率低,为此一般让hashCode返回值尽可能的不同。
哈希值与对象的成员变量值相关。
hashCode返回值一般是把对象的成员变量值相加
若元素是基本类型,直接加值
若元素是引用类型,加哈希值
如:
public class people {
private String name;
private int age;
@Override
public int hashCode() {
return this.name.hashCode()+this.age;
}
}
但是为了减少误差一般乘以一些数
LinkedHashSet:
唯一的有序的set集合。通过链表与哈希表实现
TreeSet:(排序与唯一)
能够对元素按照某种规则进行排序。
排序有两种方式:
自然排序(调用无参构造)
比较器排序
自然排序解析:
真正的比较依赖于compareTo()方法,而这个方法是定义在Comparable接口中,
所以必须实现Comparable接口才可以重写compareTo()方法
底层结构是红黑树(一种自平衡的二叉树)取出时按照先序遍历方式取出
比较器排序:
让集合的构造方法接受一个比较器接口的子类对象Comparator