Set:集合,引自数学集合特性【唯一性,无序性】,不会存储重复元素,用于存储无序(存入和取出的顺序不一定相同)元素。
存储对象具有相等性
hashCode会返回每个对象特有的序号(java是依据对象的内存地址计算出的此序号),所以两个不同的对象的hashCode值是不可能相等的。Object hashCode方法返回的是该对象的内存地址。
Set实现类:
- HashSet 线程不安全,存取速度快。底层是以哈希表实现的。
- HashSet存储元素的顺序并不是按照存入时的顺序(和List显然不同) 是按照哈希值来存的所以取数据也是按照哈希值取得。HashSet主要通过对象的hashCode及equals判断元素相等,若hashCode补相等,则hashSet认为两个对象是不会重复的【满足set没有重复元素的特性】,对于hashCode相同但equals返回false的元素,hashSet将相同hashCode的元素存储在一个hashCode下方【一列存储,一个hashCode位置上可以存储多个元素】,
- 调用原理:先判断hashcode 方法的值,如果相同才会去判断equals 如果不相同,是不会调用equals方法的。
- TreeSet 红-黑树的数据结构,默认对元素进行自然排序(String)。如果在比较的时候两个对象返回值为0,那么元素重复。
- 红黑树算法规则:左小右大。
- TreeSet集合排序的两种方式:
- 1.让元素自身具备比较性。也就是元素需要实现Comparable接口,覆盖compareTo 方法。
- 2.让容器自身具备比较性,自定义比较器。当元素自身不具备比较性,或者元素自身具备的比较性不是所需的。 那么这时只能让容器自身具备。定义一个类实现Comparator 接口,覆盖compare方法。并将该接口的子类对象作为参数传递给TreeSet集合的构造函数。当Comparable比较方式,及Comparator比较方式同时存在,以Comparator比较方式为主。
- LinkedHashSet 会保存插入的顺序。
- 总结:
- array——角标。
- link——first,last。
- hash——hashCode,equals.
- tree——两个接口,Comparable,Comparator。