Map,Set,List的各种用法
关系图:
1.共同点:
set和List都是包java.util下,实现了Collection接口
2.区别:
list:
1).ArrayList:
(1)与常规数组的区别是ArrayList是一个可变型数组
(2)可以插入多个null值
(3)size, isEmpty, get, set, iterator,add(E)操作的时间复杂度为O(1)
(4)ArrayList不是synchronized的
(5)常用于在对数据的查询
(6)ArrayList在初始化时不会分配内存,只用在添加数据时会分配大小为10的内存空间,如图:
当数据长度到数组长度时,会调用Arrays.copyOf,复制一份更长的数组,并把前面的数据放进去。如图:
随着元素的增加,以1.5倍原数组的长度创建一个新数组,即10, 15, 22, 33,。。这样序列建立,将原来的元素拷贝到新数组之中,如果数组长度达到上限,则会以MAX_ARRAY_SIZE 或者 Integer.MAX_VALUE作为最大长度,而多余的元素就会被舍弃掉。
(7)ArrayList.remove的时间复杂度O(n)
2).LinkedList:
(1)LinkedList是一个链表维护的序列容器
(2)可以插入多个null值
(3)add方法操作时间复杂度为O(1)
(4)双向列表,没有初始化大小
(5)LinkedList底层方法实现了Deque接口,Deque接口是继承Queue的,所以也支持队列的pop,push,peek操作。
Set:
1) hashset:
(1)底层是hash表,所以不能存储相同的值,set中的值都存储在map中的key位置,value都是相同的,PRESENT
(2)因为是基于hash表是实现的,所以其相关的方法都是在hash表上的操作
2) linkedset:由链表和hash表共同组成。底层是基于linkedHashMap实现的
3) TreeSet 是有次序的集合,当没有设定顺序时,会根据Comparator自然排序。(自然排序即e1.compareTo(e2) == 0作为比较)TreeSet内的元素必须实现Comparable接口。
Map
1) HashMap:散列表存储
相关原理:https://blog.csdn.net/tuke_tuke/article/details/51588156
2) LinkedHashMap:
(1) LinkedHash继承自 HashMap,所以它的底层仍然是基于拉链式散列结构。该结构由数组和链表+红黑树 在此基础上LinkedHashMap 增加了一条双向链表,保持遍历顺序和插入顺序一致的问题
(2) 继承自hashMap所以初始容量也为16
(3) LinkedHashMap没有put方法 完全使用父类HashMap中的put方法 只不过在构架链表的时候会有不同。
具体体现如图:
(4) 遍历的时候直接从表头进行遍历。是有序遍历。因为多维护了一份head,tail链表
3) TreeMap平时用的不多,TreeMap会实现SortMap接口,定义一个排序规则,这样当遍历TreeMap的时候,会根据规定的排序规则返回元素。
4) WeakHashMap