Set集合
Set集合中,没有下标的概念。
Set集合,是一个去重复的集合。 在Set集合中不会添加重复的元素的!
Set集合中, 数据的存储是无序的
Set接口, 是继承自Collection接口的。 Set接口中的方法, 都是从Collection接口中继承下
来的, 并没有添加新的方法。
Map集合
Map是双列集合的顶级接口, 这个接口并没有继承自Collection接口。
在Map中, 更多强调的是一层映射关系。 在Map中存储的数据, 是一个个的键值对(Key
Value-Pair), 键和值是一一对应的。
HashSet与TreeSet的区别
HashSet:底层是哈希表,线程不安全的
TreeSet:底层是二叉树,线程不安全的
哈希表
Set集合的两个实现类HashSet与LinkedHashSet,底层实现都是哈希表
哈希结构是一个线性表
但元素之间可可能有空隙
散列表也叫哈希表根据key,value进行访问把键值应射到表中访问加快查找速度称为散列函数
Hash表的组成是”数组+链表”这些元素是按照什么样的规则存储到数组中呢。一般情况是
通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。
负载(加载)因子:0.75.-->hash表提供的空间是16 也就是说当到达12的时候就扩容
哈希表插入和查找都很优秀,但是在扩容的时候的表现并不好
哈希表有排重机制
二叉树
树是由根结点和若干颗子树构成的
单个结点是一棵树,树根就是该结点本身。
空集合也是树,称为空树。空树中没有结点;
森林:由m(m大于等于0)棵互不相交的树的集合称为森林。
孩子结点或子结点:一个结点含有的子树称为该结点的子结点;
结点的度:一个结点含有的子结点的个数称为该结点的度;
叶结点或终端结点:度为0的结点称为叶结点;
非终端结点或分支结点:度不为0的结点;
双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;
兄弟结点:具有相同父结点的结点互称为兄弟结点;
树的度:一棵树中,最大的结点的度称为树的度;
结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推;
树的高度或深度:树中结点的最大层次;
堂兄弟结点:双亲在同一层的结点互为堂兄弟;
结点的祖先:从根到该结点所经分支上的所有结点;
子孙:以某结点为根的子树中任一结点都称为该结点的子孙;
二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组
一样快速查找,也可以像链表一样快速添加。但是他也有自己的缺点:删除操作复杂
先序遍历
首先访问根,再先序遍历左子树,最后先序遍历右子树(根左右)
中序遍历
首先中序遍历左子树,再访问根,最后中序遍历右子树(左根右)
后序遍历
首先后序遍历左子树,再后序遍历右子树,最后访问根(左右根)
HashSet & LinkedHashSet
去重机制
先拿hashcode如果不同是两个元素,如果相同比较equals如果不同是两个元素,如果相同是一个元素
TreeSet是一个Set接口的实现类,底层实现是二叉树。这样的集合,会对添加进集合的元素
进行去重的处理。 同时, 这个集合会对添加进入的元素进行自动的升序排序
Comparable接口(默认排序)
如果某一个类实现这个接口, 表示自己实现了一个可以和自己的对象进行大小比较的规则
Comparator接口(人工排序)
定义:使用实现了Comparator接口的compare()方法的比较器对象进行比较
对于自定义的类,代码是我们自己编写的,所有在排序时不管是通过Comparator还是
Comparable,排序规则我们都可以自己制定,所以最终使用那种方法没有太大的区别
对于系统类,影响非常大.系统类中的代码我们只能用,不能改.这也就意味着系统类内部通
过Comparable实现的比较规则已经确定了.这时我们想使用其他的规则对当前的系统类
对象进行比较,只能使用Comparator自己重新制定比较规则.
人工排序的优先级高于默认排序
Comparable可以实现在类的构造上
Comparator可以现在重新的比较规则上
无论使用Comparator还是Comparable,如果两个对象进行大小比较的结果是0, 此时代表
这两个对象是相同的对象。 在TreeSet中会完成排重的处理。
注意: TreeSet中元素的去重只与对象的大小比较结果有关。 与hashCode()、equals(), 没
有任何关系
map
put(K key, V value)
将一个键值对插入到集合中。 在Map集合
中,不允许出现重复的键。 如果添加的键重
复了,会用新的值覆盖掉原来的值。并返回
被覆盖的原来的值。
putIfAbsent(K key, V
value)
将一个键值对插入到集合中。 向集合中添加
元素的时候,如果这个键已经存在了,则不
进行添加。 返回集合中已经存在的这个键对
应的值。
putAll(Map<K, V>
map)
将一个Map集合中所有的键值对添加到当前
集合中
remove(Object key)
通过键,删除一个键值对,并返回这个被删
除的键值对中的值。 如果这个键不存在,则
返回null。
remove(Object key,
Object value)
通过键值对进行删除。 只有当键和值一一匹
配的时候, 才会进行删除。
clear()
清空集合。
replace(K key, V value)
修改指定的键对应的值, 并返回被覆盖的
值。
replace(K key, V
oldValue, V newValue)
只有当key和oldValue是匹配的情况下,才会
将值修改成newValue。
replaceAll(BiFunction<K,
V, V> biFunction)
对集合中的元素进行批量的替换 将集合中的
每一个键值对,带入到BiFunction的方法中,
使用接口方法的返回值替换集合中原来的
值。
get(K key)
通过键, 获取值。 如果键不存在, 返回
null。
getOrDefault(K key)
通过键, 获取值。 如果键不存在, 返回默认
的值。
size()
获取集合中的元素数量(有多少个键值对)
isEmpty()
判断集合是否为空
containsKey(K key)
判断是否包含指定的键
containsValue(V value)
判断是否包含指定的值
keySet()
获取由所有的键组成的集合(因为键是不允
许重复的, 因此这里返回的是Set集合)
values()
获取由所有的值组成的集合
使用keySet进行遍历
1. 可以使用keySet()方法获取到集合中所有的键。
2. 遍历存储了所有的键的集合,依次通过键获取值。
使用forEach方法
这个forEach方法, 并不是Iterable接口中的方法。 是Map接口中定义的一个方法。 从功能
上将, 与Iterable中的方法差不多。 只是在参数部分有区别。
使用forEach方法
这个forEach方法, 并不是Iterable接口中的方法。 是Map接口中定义的一个方法。 从功能
上将, 与Iterable中的方法差不多。 只是在参数部分有区别。
LinkedHashMap
与HashMap类似的,底层多维护了一个链表, 记录每一个键的存储顺序。 也就是
说, 在LinkedHashMap中, 键值对的添加顺序可以得到保障。