Java杂谈——集合(三)

目录

1.List、Set、Map三者区别

2.ArrayList和LinkedList区别

3.HashMap和Hashtable区别

4.ConcurrentHashMap和Hashtable的区别

5.集合框架底层数据结构


1.List、Set、Map三者区别

  • List:存储一组不唯一、有序的对象,可有多个元素引用相同对象。
  • Set:不允许重复元素,不会有多个元素引用相同对象。
  • Map:使用键值对存储对象。两个Key可引用相同对象,但Key不能重复

2.ArrayList和LinkedList区别

首先两个都是不同步的,都不保证线程安全。

 ArrayListLinkedList
底层数据结构底层使用Object数组底层使用双向链表
插入和删除是否受元素位置影响采用数组存储,因此在指定位置插入和删除受元素位置影响,采用链表存储,普通插入和删除不受位置影响,但指定位置删除受元素位置影响,时间复杂度近似O(n)
是否支持快速访问支持不支持
内存占用空间list列表结尾会预留一定容量空间每一元素都要消耗比ArrayList更多的空间。

Vector类的所有方法都是同步的,是线程安全的,但效率不如ArrayList。因此不需要线程安全采用ArrayList。

3.HashMap和Hashtable区别

 HashMapHashtable
线程安全非线程安全线程安全(内部方法经过synchronized修饰)
效率比Hashtable略高 
对Null key和Null value支持

Null可作为键,但只能有一个;多个值可为Null

不允许Null键值存在
容量

默认16,每次扩容为原来两倍

若给定初始容量,会扩充为2的幂次方大小

默认11,每次扩充为原来2n+1
底层数据结构JDK1.8之后,当链表长度大于阈值(默认8),链表转化为红黑树无此机制

HashSet底层是基于HashMap实现的。除了 clone()、writeObject()、readObject()是HashSet 子集不得不实现的方法,其他都是调用HashMap中的方法。

为什么建议在定义HashMap时,指定初始化大小?

若没有设置初始化容量,系统默认容量16,当超过临界值(默认16*0.75=12)时,HashMap会重新扩容到下一个2的指数幂(16→32)。而HashMap扩容就要执行resize操作,频繁resize,会降低性能。HashMap是线程不安全的,不安全主要就体现在resize操作上,多线程情况下,可能会形成环形链表,导致下一次读取时出现死循环。

(resize方法是定义长度为新长度的数组,对原数组数据进行再Hash,这个过程是一个性能损耗点)

4.ConcurrentHashMap和Hashtable的区别

 ConcurrentHashMapHashtable
底层数据结构

JDK 1.7:数组+链表

JDK 1.8 :数组+链表/红黑二叉树

数组+链表
实现线程安全方式

JDK 1.7:对整个桶数组进行分隔分段(Segment),每一把锁只锁容器中一部分数据,提高并发访问率。

JDK 1.8:摒弃Segment,直接使用Node数组+链表+红黑树,并发控制使用synchronized和CAS操作。看起来像优化过且线程安全的HashMap。

使用synchronized保证线程安全,效率非常低下。多线程操作竞争越激烈效率越低。

 

5.集合框架底层数据结构

Collection:

1.List

ArrayListObject数组
VectorObject数组
LinkedList双向链表

 

 

 

 

2.Set

HashSet基于HashMap实现,底层使用HashMap保存元素
LinkedHashSet继承于HashSet,内部通过LinkedHashMap实现
TreeSet红黑树

 

 

 

 

Map:

HashMap

JDK 1.8前是数组+链表。数组是主体,链表是为解决哈希冲突存在。

JDK 1.8之后当链表长度大于阈值(默认为8)时,链表转化为红黑树,减少搜索时间

LinkedHashMap

继承自HashMap,由数组和链表/红黑树组成。

同时增加了一条双向链表,可以保持键值对的插入顺序

Hashtable数组+链表
TreeMap红黑树(自平衡的排序二叉树)

 

 

 

 

 

 

 

如何选用集合?

需要根据键值对获取元素选择Map接口下的集合,需要排序选择TreeMap,不需要排序则HashMap,需要线程安全选择ConcurrentHashMap;

只需要存放元素选择Collection接口下集合,保证元素唯一选择Set接口的集合,如TreeSet或HashSet。不需要则选择List接口下的ArrayList或LinkedList,具体在根据需求选择集合使用。

 

以上大部分内容来自:JavaGuide 面试突击版,仅个人学习,完整版可关注作者公众号领取

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值