格式:
创建:以多态的方式;
具体实现:HashMap Map
可以比较元素大小的Map集合,会对传入的Key进行大小的排序;可以使用元素的自然排序,也可以使用集合中自定义的比较容器来进行排序;
特点:
不允许重复键;
可以插入null,键和值都可以;
可对元素进行排序;
无序集合,插入和遍历顺序不一致;
基本操作:
- 1、遍历元素
- Set
> entrySet = treeMap.entrySet(); - 2、获取所有key
- Set
keySet = treeMap.keySet(); - 3、获取所有value
- Collection
valueList = treeMap.values(); - 4、获取集合内第一个元素
- String firstKey = treeMap.firstKey();
- 5、获取集合内最后一个元素
- String lastKey =treeMap.lastKey();
排序:
自然元素排序:需要让被比较的元素实现Comparable接口,这是因为在调用put()方法时,会将传入的元素转化为Comparable类型对象;
- TreeMap
treeMapFirst = new TreeMap(); - treeMapFirst.put(1,"huangqiuping");
- treeMapFirst.put(6,"huangqiuping");
- treeMapFirst.put(3,"huangqiuping");
- System.out.println(treeMapFirst.toString());
- 结果:{1=huangqiuping, 3=huangqiuping, 6=huangqiuping}
使用自定义比较器比较:需要在创建treeMap对象时,将自定义比较器对象传到treeMap构造方法中;需要实现Comparator接口,并实现比较方法compare(to1,to2);
- public class SortedTestComparator implements Comparator
{ - //自定义比较器:实现compare(To1,To2)方法:
- public int compare(SortedTest sortedTest1, SortedTest sortedTest2) {
- int num = sortedTest1.getAge() - sortedTest2.getAge();
- if(num==0){//为0时候,两者相同:
- return 0;
- }else if(num>0){//大于0时,后面的参数小:
- return 1;
- }else{//小于0时,前面的参数小:
- return -1;
- }
- }
- }
用于存储K-V键值对的集合,每一个元素的初始值都是Null,无序的;
常用方法:put() 、get()
HashMap默认的长度为16,拓展或初始化长度必须是2的幂(确定位置时,碰撞概率会比较低)
put过程:
1、对Key求Hash值,然后再计算下标
2、如果没有碰撞,直接放入桶中(碰撞的意思是计算得到的Hash值相同,需要放到同一个bucket中)
3、如果碰撞了,以链表的方式链接到后面
4、如果链表长度超过阀值( TREEIFY THRESHOLD==8),就把链表转成红黑树,链表长度低于6,就把红黑树转回链表
5、如果节点已经存在就替换旧值
6、如果桶满了(容量16*加载因子0.75),就需要 resize(扩容2倍后重排)
查找时调用hash方法,找到具体的key所对应的hash,然后再到entry中去找value
比较:
HaspMap | treeMap |
---|---|
无序 | 有序 |
查询速度更快 | 查询速度慢 |
适合插入、删除、查找 | 适合排序 |
非线程安全 | 非线程安全 |
输出结果无序 | 输出结果已排序 |
数组+链表+红黑树 | 红黑树 |
List是一个接口,继承于Collection;元素可以重复,有序存储(按照插入顺序进行有效存储),可以添加null。
底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素;ArrayList更适合检索和在末尾插入或删除。初始容量为10.
常用方法:
方法 | 作用 |
---|---|
add(E) | 添加元素 |
set(int index,E element) | 覆盖指定位置的元素 |
remove(int index) | 删除指定位置的元素 |
get(int index) | 获取指定位置的元素 |
indexOf(Object o) | 获取指定位置的索引 |
iterator() | 获取迭代器 |
size() | 获取集合大小 |
isEmpty() | 判断集合是否为空 |
clear() | 清空集合 |
stream() | 为集合创建流 |
底层数据结构是双向链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素;inkedList更适合从中间插入或者删除
常用方法:
方法 | 作用 |
---|---|
getFirst | 返回此列表中的第一个元素。 |
getLast | 返回此列表中的最后一个元素。 |
removeFirst | 从此列表中删除并返回第一个元素。 |
removeLast | 从此列表中删除并返回最后一个元素。 |
add | 将指定的元素追加到此列表的末尾。 |
addFirst | 在该列表开头插入指定的元素。 |
size | 返回此列表中的元素数。 |
clear | 从列表中删除所有元素。 此呼叫返回后,列表将为空。 |
contains | 如果此列表包含指定的元素,则返回true` |
listIterator | 从列表中的指定位置开始,返回此列表中元素的列表迭代器(按适当的顺序)。 |
straem | 为集合创建流 |
底层数据结构是数组,查询快、增删慢,线程安全(大部分的方法都包含关键字synchronized),效率低,可以存储重复元素;如果涉及到多线程,选择Vector
- 1、添加 addFirst() addLast()
- 2、删除 removerFirst() removerLast()
- 3、获取 getFirst() getLast()
比较
ArrayList | LinkedList | Vector |
线程不安全,效率高 | 线程不安全,效率高 | 线程安全,效率低 |
数组 | 链表 | 数组 |
查询快,增删慢 | 查询慢,增删快 | 查询快,增删慢 |
treeMap主要功能用于排序;LinkedHashSet的主要功能用于保证FIFO即有序的集合(先进先出);HashSet只是通用的存储数据的集合;
底层采用二叉树,元素无序且唯一,线程不安全,效率高,可以存储null元素;
常用方法:
方法 | 作用 |
---|---|
add | 添加元素 |
containsKey(Object) | 查询集合中是否包含指定键 |
remove(Object) | 删除指定键 |
iteartor | 迭代器 |
size() | 获取集合大小 |
isEmpty() | 判断集合是否为空 |
clear() | 清空集合 |
底层采用链表和Hash表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高;
常用方法:
方法 | 作用 |
---|---|
add | 添加元素 |
containsKey(Object) | 查询集合中是否包含指定键 |
remove(Object) | 删除指定键 |
iteartor | 迭代器 |
size() | 获取集合大小 |
isEmpty() | 判断集合是否为空 |
clear() | 清空集合 |
底层采用二叉树实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性;
常用方法:
方法 | 作用 |
---|---|
add | 添加元素 |
containsKey(Object) | 查询集合中是否包含指定键 |
remove(Object) | 删除指定键 |
iteartor | 迭代器 |
size() | 获取集合大小 |
isEmpty() | 判断集合是否为空 |
clear() | 清空集合 |
descendingIterator | 倒叙遍历 |
比较
HashSet | LinkedHashSet | TreeSet |
实现Set接口 | 实现Set接口 | 实现Set接口 |
线程不安全 | 线程不安全 | 线程不安全 |
添加、查询快 | 添加、修改、删除快;有序 | 只有需要对元素进行排序时使用 |
数组+链表+红黑树 | 哈希表+双向链表 | 红黑树 |
可以有null值 | 可以有null值 | 可以有null值 |
List与Set的区别
1、List中元素可以重复,并且是有序的(按照插入的顺序进行存储);Set中的元素是不可重复的(重复元素会被覆盖掉),并且无序。
2、List和Set都继承Collection接口;
3、Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变