Set集合
set集合作为collection的子类,被设计来作为集合的一份子,主要是因为我们很多业务需要元素唯一,而set集合应运而生,他保证了集合元素的唯一性.
特点:
1.set的元素是唯一的,不重复的.
2.set元素的存储是无序的,意思存储都是乱序的.
set集合的架构表
hashSet
元素的哈希值是通过元素的hashcode 方法来获取的, HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals 方法 如果 equls 结果为 true ,HashSet 就视为同一个元素。如果 equals 为 false 就不是同一个元素。如果元素的hash值相同,equal值不同,则会生成链表继续往下排列.
特点:
1.元素唯一,不重复.
2.元素存储无序,也没有办法按照存储的顺序取值.
3.底层是hashMap,元素是用hashMap的key值去掉重复的.
hashSet集合,的属性有两个,一个是hashMap用来存值的,一个是PRESENT,这是所有hashMap的value值.
添加元素的时候,直接将元素作为key,属性PRESENT作为值存入hashMap中.
常用方法
增加 add(E);
删除 remove(E);
对比查找 contains(E);
清空集合 clear();
size()获取长度
treeSet(二叉树)
treeSet的特点是去重.唯一,和排序,不是存放的顺序有序,而是按照对象的comparable方法.比较排序,也就是值有序.
特点:
- TreeSet()是使用二叉树的原理对新 add()的对象按照指定的顺序排序(升序、降序),每增 加一个对象都会进行排序,将对象插入的二叉树指定的位置。
- Integer 和 String 对象都可以进行默认的 TreeSet 排序,而自定义类的对象是不可以的,自 己定义的类必须实现 Comparable 接口,并且覆写相应的 compareTo()函数,才可以正常使 用。
- 在覆写 compare()函数时,要返回相应的值才能使 TreeSet 按照一定的规则来排序
- 比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整 数、零或正整数。
底层实现是通过NavigableMap<K,V>实现的,这个借口的实现类是treeMap.所以可以理解为是通过treeMap实现的.treeSet同hashSet一样都是这样的.
代码书写:
实现comparable借口,重写compareTo()方法
添加元素,验证去重和排序
常用方法
添加
public boolean add(E e)
public boolean addAll(Collection <?extends E > c)
删除
public boolean remove(Object o)
treeSet.size()
public int size() 返回此集合中的元素数(其基数)。
treeSet.isEmpty()
public boolean isEmpty()
true如果此set不包含任何元素,则返回
treeSet.ceiling()
public E ceiling(E e)
返回此set中大于或等于给定元素的最小元素,或者null如果没有这样的元素。
treeSet.floor()
public E floor(E e)
返回此set中小于或等于给定元素的最大元素,或者null如果没有这样的元素。
treeSet.lower()
public E lower(E e)
返回此集合中的最大元素严格小于给定元素,或者null如果没有这样的元素。
treeSet.contains()
public boolean contains(Object o)
true如果此set包含指定的元素,则返回。更正式地说,返回true当且仅当此set包含的元素e,使得 Objects.equals(o, e)。
LinkHashSet(HashSet+LinkedHashMap)
对于 LinkedHashSet 而言,它继承与 HashSet、又基于 LinkedHashMap 来实现的。
LinkedHashSet 底层使用 LinkedHashMap 来保存所有元素,它继承与 HashSet,其所有的方法
操作上又与 HashSet 相同,因此 LinkedHashSet 的实现上非常简单,只提供了四个构造方法,并
通过传递一个标识参数,调用父类的构造器,底层构造一个 LinkedHashMap 来实现,在相关操
作上与父类 HashSet 的操作相同,直接调用父类 HashSet 的方法即可