笔记==>Set

来源:互联网 发布:mac字体切换快捷方式 编辑:程序博客网 时间:2024/06/06 03:33

一.Set集合接口

Set接口:

如果是实现了Set接口的集合类,具备的特点:无序,不可重复。

无序:

添加元素 的顺序与元素出来的顺序是不一致的。

不可重复:

注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素。

对象的相等性:

引用到堆上同一个对象的两个引用是相等的。如果对两个引用调用hashCode方法,会得到相同的结果,
如果对象所属的类没有覆盖Object的hashCode方法的话,hashCode会返回每个对象特有的序号 (java
是依据对象的内存地址计算出的此序号),所以两个不同的对象的hashCode值是不可能相等的。

如果想要让两个不同的Person对象视为相等的,就必须覆盖Object继承下来的hashCode方法和equals方法,
因为Object hashCode方法返回的是该对象的内存地址,所以必须重写hashCode方法,才能保证两个不同的
对象具有相同的hashCode,同时也需要两个不同对象比较equals方法会返回true。

Set集合中没有特有常用的方法,直接继承自Collection。

二.Set集合接口下的实现类——hashSet类

HashSet 底层是使用了哈希表来支持的,特点: 存取速度快.

hashSet的实现原理:

往Haset添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值 , 然后通过元素
的哈希值经过移位等运算,就可以算出该元素在哈希表中 的存储位置。

情况1:

如果算出元素存储的位置目前没有任何元素存储,那么该元素可以直接存储到该位置上。

情况2:

如果算出该元素的存储位置目前已经存在有其他的元素了,那么会调用该元素的equals方法与
该位置的元素再比较一次,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,
不允许添加,如果equals方法返回的是false,那么该元素运行添加。

这里写图片描述
图1:hashCode值不相同的情况
图2:hashCode值相同,但equals不相同的情况。

HashSet:通过hashCode值来确定元素在内存中的位置。一个hashCode位置上可以存放多个元素。

注意:

HashSet集合在判断元素是否相同先判断hashCode方法,如果相同才会判断equals。 如果不相同,是不会调用equals方法的。

三.Set集合接口下的实现类——treeSet类

treeSet 底层是以红-黑树的数据结构实现的,默认对元素进行自然排序(String)。
如果在比较的时候两个对象返回值为0,那么元素重复。

treeSet要注意的事项:

  1. 往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
  2. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实Comparabl接口,把元素的比较规则定义在compareTo()方法上。
  3. 如果比较元素的时候,compareTo方法返回 的是0,那么该元素就被视为重复元素,不允许添加.(注意: TreeSet与HashCode、equals方法是没有任何关系。)
  4. 往TreeSet添加元素的时候, 如果元素本身没有具备自然顺序 的特性,而元素所属的类也没有实现Comparable接口, 那么必须要在创建TreeSet的时候传入一个比较器。
  5. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口,
  6. 在创建TreeSet对象的时候也传入了比较器;那么是以比较器的比较规则优先使用。

如何自定义定义比较器: 自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在compare方法内即可。
自定义比较器的格式 :

    class  类名  implements Comparator{    }

推荐使用:使用比较器(Comparator)。

TreeSet是可以对字符串进行排序 的, 因为字符串已经实现了Comparable接口。
字符串的比较规则:

情况一: 对应位置有不同的字符出现, 就比较的就是对应位置不同的字符。

情况 二:对应位置上 的字符都一样,比较的就是字符串的长度。

原创粉丝点击