面试 | 12.21 电话面记录和答案

电话面问题有:聊下hashmap,和线程安全的hashmap;线程池有了解嘛?java里面怎么实现线程安全的?jvm的内存模型,及jvm内存分区?

记录下当时的回答:

hashmap涉及的数据结构?为链表的时候时间复杂度?为红黑树的时候时间复杂度?

关键字:
“hashmap底层的数据结构是数组+链表+红黑树”
“hash碰撞”
“put方法:当新增元素时,将获取到该元素的hash值来计算在应在数组中存放的下标。如果有发生hash碰撞,将会生成链表或者红黑树。出于查询效率的优化,链表将会在到达8个结点时转为树”
“hashmap的扩容,扩容时机:即resize方法。说到扩容,hashmap有几个重要的成员变量,loadFactor负载因子(默认0.75),容器初始化大小(默认16),临界值threshold,当容器中的元素达到初始容量的0.75时开始扩容”
“时间复杂度:为链表时,复杂度是O(n);为红黑树时,复杂度是O(lgN)
“其他特性:hashmap线程不安全,key不可重复”
hashmap如何判断元素是否重复
“扩容是个耗内存的操作,java开发手册里规定如果容器的长度可预知,最好先预设容器大小”


线程安全的map有哪些?

思路:问线程安全肯定离不开两个关键字,synchronize和volitle;
synchronize实现原子性,在共享资源的场景下,能保证线程拿到的是代码块执行的最终结果,而不是中间结果
volitle禁止指令重排,保证了可见性

ConcurrentHashMap和HashTable,这两个都实现了Map接口。
hashTable是线程安全的,因为它用synchronized做了线程同步,ConcurrentHashMap怎么实现线程同步的?用了啥关键字?

讲到ConcurrentHashMap,一定要提分段锁,它的目的是降低锁的粒度,更好的支持并发。从源码看,ConcurrentHashMap是怎么降低锁的粒度的?减少hash冲突?全局锁,段锁?


java里面怎么实现线程安全?

sync和volitle
lock有了解嘛

这一部分讲得挺差的,往线程间的通信方向引、提了一下notify方法;
又提了一下countDownLatch在项目中的使用

线程池的用法?

如何获取一个线程池?ThreadPoolExcutor?
核心线程数;最大线程数;拒绝策略;keepAliveTime


jvm内存分区

方法区、堆、程序计数器、虚拟机栈、本地方法栈。其中方法区和堆是线程共享的,余下的是线程独占的


jvm参数列举

在这里插入图片描述
线程池执行流程
参数:
keepAliveTime是空闲线程存货时间,控制多余线程数伸缩的(线程销毁)
任务和keepAliveTime共同控制池内线程伸缩;
好处是线程复用,统一管理,稳定
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

事务失效场景

在这里插入图片描述

mysql索引失效场景

在这里插入图片描述
B+树与索引
在这里插入图片描述
countDownLatch
countDownLatch
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值