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。