Map,Set,List的各种用法

217 阅读2分钟

Map,Set,List的各种用法 关系图: b9da001da073b4ecf419ea3b8b881b76.webp

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的内存空间,如图:

ArrayList.PNG

当数据长度到数组长度时,会调用Arrays.copyOf,复制一份更长的数组,并把前面的数据放进去。如图:

add.PNG

grow.PNG

随着元素的增加,以1.5倍原数组的长度创建一个新数组,即10152233,。。这样序列建立,将原来的元素拷贝到新数组之中,如果数组长度达到上限,则会以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
    

image.png

   (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方法 只不过在构架链表的时候会有不同。
具体体现如图:

image.png

image.png

image.png

    (4) 遍历的时候直接从表头进行遍历。是有序遍历。因为多维护了一份headtail链表
    

image.png

3) TreeMap平时用的不多,TreeMap会实现SortMap接口,定义一个排序规则,这样当遍历TreeMap的时候,会根据规定的排序规则返回元素。
4) WeakHashMap