Set接口
1、Set接口基本情况
- 不一定是有序的,添加元素,与取出元素的顺序不一定一致(没有索引值)
- 不能有重复元素,所以最多包含一个null值
2、Set集合中的常用方法
方法名 | 返回值 | 作用 |
---|---|---|
add(E e) | boolean | 如果 set 中尚未存在指定的元素,则添加此元素(可选操作) |
addAll(Collection<? extends E> c) | boolean | 如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中(可选操作)。 |
clear() | void | 移除此 set 中的所有元素(可选操作)。 |
contains(Object 0) | boolean | 如果 set 包含指定的元素,则返回 true 。 |
containsAll(Colleaction<?> c) | boolean | 如果此 set 包含指定 collection 的所有元素,则返回 true |
equals(Object 0) | boolean | 比较指定对象与此 set 的相等性。 |
hashcode() | int | 返回set的哈希码值 |
isEmpty() | boolean | 判断该集合是否为空 |
iterator() | Iterator | 返回在此 set 中的元素上进行迭代的迭代器。 |
remove(Object o) | boolean | 如果 set 中存在指定的元素,则将其移除(可选操作)。 |
size() | int | 返回 set 中的元素数(其容量)。 |
toArray() | Object[] | 返回一个包含 set 中所有元素的数组。 |
3、遍历元素:
-
使用迭代器:
Iterator it = set.iterator(); while (it.hasNext()) { Object next = it.next(); System.out.print(next + " "); //null tom jerry job jack }
-
使用增强for循环
for (Object o : set) { System.out.print(o + " "); //null tom jerry job jack }
-
不能使用索引下表来遍历
-
set接口的实现类
- 不嫩存放重复元素,只能添加一个null值
- set对象存放的元素不一定是有序的,(添加的元素的顺序与取出元素的顺序不一致)
4、Set集合的实现类
(1)、HashSet集合
-
HashSet底层是HashMap
源码:
public HashSet() { map = new HashMap<>(); }
-
可以存放null值,但只能存放一个null值
-
HashSet不保证元素是有序的,取决于hash后,在确定元素索引的位置(及不保证存入的元素的顺序与取出元素的顺序不一致)
-
不可以有重复元素(重复元素值:基本数据类型:就是栈中存放的值,对于引用数据类型;栈中的地址是一致的,但是注意String:就算你new String(),也不能将相同的字符串介入进去;)所以在很多时候,在自定义的类中,需要重写equals()方法和hashCode方法来自定义两个对象相等的条件
-
HashSet中的方法:
方法 返回值 作用 add() boolean 添加元素 remove() Boolean 删除元素 -
HashSet底层结构
-
HashSet底层是HashMap,hashMap底层是(数组 +链表 + 红黑树)
-
HashMap底层:
- 添加元素:先得到hash值,将hash值转化为索引值
- 找到存储数据数据的table(数组)看这个索引位置是否已存放该元素,
- 如果没有,直接加入
- 如果有,调用equals比较,如果相同就放弃,如果不相同,则添加到最后,
- 如果一条链中的元素达到一定的个数,并且table的长度大于等于,就将这个table转化为红黑树;
-
(2)、LinkedhashSet集合
- LinkedHashSet是HashSet的子类
- LinkedhashSet底层死一个LinkedHashMap,LinkedHashMapd 底层是 (数组 + 双向建表 + 红黑树) (HashMap底层是【数组 + 单向链表 + 红黑树】)
- LinkedHashSet根据元素计算元素的hashCode值,来决定元素的存储位置,同时使链表维护元素色次序图,这使得元素开起来是插入存储的
- LinkedHashSet不允许添加重复元素,,他是有序的,(插入顺序与取出元素的顺序是一致的)
- 扩容:
- 第一次添加:直接将数组table扩容为16,存放的节点类型是LinkedHashMap$Entry类型
- 数组HashMap$Node[] 存放的元素是LinkedHashMap¥Entry;
(3)、TreeSet结合
-
底层是treeMap
-
创建对象时,可以传入比较器:(Comparator())
TreeSet treeSet = new TreeSet(new Comparator() { @Override public int compare(Object o1, Object o2) { //比较规则 return ((String)o1).length() - ((String)o2).length(); } });