集合list map

在java面试过程中,Map时常会被作为一个面试点来问,今天就在这里整理总结一下

  • 首先回顾一下集合体系
  •  

1 集合面试过程中,对于单列集合经常会被问到List和set的区别
list集合元素有序并且集合元素可以重复
set集合元素无序并且集合元素不允许重复
2 集合面试过程中,对于单列集合经常会被问道Arraylist和Linkedlist的区别
Arraylist底层数据结构为数组,所以有索引,查询速度比较快但是增删速度比较慢
LinkedList底层数据是双向链表,所以没有索引,查询速度比较慢,但是增删比较快HashMap

 HashMap

  • 数据结构
    • JDK1.7:数组+链表
    • JDK1.8之后:数组+链表+二叉树

    • Hashmap数据结构(这里以1.7为例)是由数组(table)+链表(entry)组成,每个entry对应着一个table的索引页对应着一个唯一的hash地址值
  • 初始化
  •  

    • 我们看到Hashmap在使用空参构造的时候会默认加载一个长度为16,加载因子为0.75的集合
  • HashMap的put方法(保证key的唯一性)

Hashmap在put的数据的时候,在底层代码中会先通过判断put的值的key是否为null,如果为null,会固定存放到table[0]下面,如果不为null,会通过hash()方法计算出key对应的hash地址,通过hash地址去寻找数据应存放的table的指定索引下,找到之后会判断put的key在链表中是否存在(地址值和具体值都要判断)如果存在则为替换,如果不存在则为新增;
JDK1.8的Hashmap和1.7的区别


 JDK1.8之后在集合put元素的时候新增了一个长度检测,如果同意hash地址下的链表长度大于了等于了7,那么就会将链表转化为红黑树(为了提高查询效率)
HashMap和Hashtable的区别
 Hashmap可以存储Key为null的值,线程不安全,但是效率高
Hashtable不可以存储Key为null的值,线程安全,但是效率低

在源代码里面我们可以清楚的看到,Hashtable的put方法中有这synchronize修饰,明显是线程安全的,而在Hashmap中并没有任何相关关键字修饰,而且没有加锁,所以线程是不安全的;
ConcurrentHashMap
ConcurrentHashmap区别于hash的分段锁

在ConcurrentHashMap中他并没有在方法中佳田synchronize关键字修饰,而是使用Segment同步方法,而且Segment又继承了ReentrantLock,所以实现了分布式锁,保证线程安全的同时还提交了效率;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值