文章目录
List和Set区别
都是继承自Collection接口
-
特点
List:元素有序存放,元素可以重复
Set:元素无序存放,元素不可以重复,重复元素会被覆盖掉 -
对比:
Set:检索元素效率低,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
List和Map区别
List是集合,允许对象重复。
Map是键值对的集合,不允许key重复。
ArrayList与LinkedList区别
-
ArrayList:
优点:动态数组结构、连续存储、查询操作效率高
缺点:插入和删除操作效率低
存储:逻辑结构上都是连续的。在物理结构上一定连续。 -
LinkedList:
优点:基于 链表 的数据结构(无头双向非循环链表),地址是任意的,所以在开辟内存空间时不需要等连续的地址,新增和删除操作有优势。适用于头尾操作或插入指定位置的场景。
缺点:要移动指针,所以查询操作性能低
存储:逻辑结构上都是连续的。在物理结构上不一定连续。
适用场景分析:
1)需要对数据对比访问用ArrrayList
2)对数据进行多次增加删除修改时用LinkedList
ArrayList与Vector区别
结论:都是用数组实现
4个区别:
1)Vector线程安全(synchronized),ArrayList非线程安全
2)物理存储相同(连续空间存储),但空间不足时,两个类增加方式不同。
3)Vector可以设置增长因子,ArrayList不可以。
4)Vector是老的动态数组,线程同步,效率低,不赞成使用
List如何保证线程安全
- 使用Vector容器
- 使用Collections的静态方法synchronizedList(List< T> list)
- 采用CopyOnWriteArrayList容器
结论:
读多写少的情况下,推荐使用CopyOnWriteArrayList方式
读少写多的情况下,推荐使用Collections.synchronizedList()静态方法的方式
HashMap和Hashtable区别
- hashMap去掉了HashTable的contains方法,但是加上了containsValues()和containsKey()方法
- hashTable是同步的,而hastMap是非同步的,效率上比hastTable高。
- hastMap允许空键值,而hashTable不允许。
HashSet和HashMap区别
- set是线性结构,set中的值不能重复,hashSet是set的hash实现,hashSet中值不能重复是用hashMap的key来实现的。
- map是键值对映射,可以空键空值。HashMap是Map接口的hash实现,key的唯一性是通过key值hash值的唯一来确定的,value值是链表结构。
- 共同点都是通过hash算法实现唯一性,他们都不能持有基本类型,只能持有对象。
HashMap和ConcurrentHashMap区别
ConcurrentHashMap是线程安全的HashMap实现
1)对整个桶数组进行了分割分段,然后在每个分段上都用了lock锁进行保护,相对于HashTable的synchronized关键字锁粒度更系,性能更好,而HashMap没有锁,不是线程安全。
2)HashMap的键值对允许为Null,ConcurrentHashMap都不允许。
HashMap扩充
HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。