List
List | 不同: | ArrayList:底层使用的是Object数组(数组和链表结构在下文),new ArrayList<>();默认大小是10个。每次卡扩容:原有大小(如果没有制定大小):10*3/2+1; |
LinkedList:底层使用的是双向循环链表数据结构; | ||
相同: | | |
插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行add(E e) 方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话(add(int index, E element) )时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。 ② LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n)。 |
数组和链表结构:
数组、链表
数组
操作数据(增加): 是将原数组的数据复制一份,再加上增加的对应位置的数据,形成一个新的数组。所以较慢。
查找数据:数组是有下标的,根据下标进行查找。
链表
一个链表的数据单元,结构是存储着一个数据,以及下一个链表单元数据的地址。如下所示。
数据 | 下一个链表单元的地址 |
操作数据(增加):如 a-b。在ab之间增加一个c,增加c这个单元,并修改c的“下一个链表单元的地址”为b的地址,并将a的“下一个链表单元的地址”修改为c的地址即可。
取出数据,根据上一个数据,才能找到下一个数据。
ArrayList 与 Vector 区别
Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。
Arraylist不是同步的,所以在不需要保证线程安全时时建议使用Arraylist。
Map
HashMap、HashTable、ConcurrentHashMap 原理、源码、数据结构,线程是否安全
HashMap是数组加链表结构。通过key的hashcode 找到数组角标。再遍历链表。
HashTable和HashMap区别,属于线程安全,key value 不能为 null。
ConcurrentHashMap也是线程安全,结构可理解成 分裂数组+HashTable。效率比HashTable高,因为HashTable是整个Map加锁,ConcurrentHashMap是把锁加到 各个分裂数组上。
如果问题请指出谢谢,建议看源码学习!