快递100一面(Java)

这篇博客记录了一次Java面试中关于ArrayList线程安全的问题及其解决方法,HashMap可能出现的冲突以及解决策略,以及如何创建线程池和设置相关参数。线程安全可以通过Collections.synchronizedList实现,HashMap冲突可通过开放寻址法或链表法解决,线程池可以使用Executors的不同静态方法创建,自定义线程池则涉及7个参数,包括核心线程数、最大线程数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面试邀请来得有突然,记录一下有些问题以及答案。

ArrayList 是线程安全的吗,怎样保证他线程安全。

原因:
其实大部分集合类都不是线程安全的,其关键的原因在于添加元素的底层实现,因为在arrayList的add()中:

elementData[size++] = e;

这一步包括了自增和赋值,因为当线程A执行了赋值以后,暂停转而运行其他的线程,但是还没扩容,就会导致,B线程的值直接覆盖A的值,

解决:
调用Collections.synchronizedList方法 ,其原理也就是将ArrayList里的方法添加synchronized关键字,也就是加锁,也就是经典的装饰器模式

HashMap会出现什么问题,如何解决?

首先HashMap是一个高效的数据结构,可以在O(1)时间复杂度查询数据,原理大致为:将Key通过Hash算法得到一个地址值,再获取内存中想要的数据,但是Hash算法存在缺陷,就是不同的Key值通过计算得到的地址值又很小的几率相同,这就是Hash冲突。
解决方法:

  1. 开放寻址法:
    它的核心思想就是重新探测新的位置来解决冲突,如何寻找新的地址:
    1.线性探测法:
    当向Hash表中插入数据时,发现该地址已经有数据了,那就从这个位置开始在数组中往后查找,直到找到空闲位置为止;缺点是随着不断填充,空闲的位置变少,探测的时间就会增加,
    2.二次探测法:
    探测的下标为hash(key)+0² 、 hash(key)+1² …
    3.双重哈希法:
    使用多个hash函数计算key ,如果第一个hash函数计算出来的地址被占用了,就调用第二个函数 ,直到找到空闲位置为止;

  2. 链表法:
    该方法更常用,原理为:在hash表中每一个桶或者槽(slot) 都会对应一个链表,将hash值相同的元素放到相同槽位的对应链表中,插入数据的时候,只需要通过hash函数计算出对应的hash值,然后添加到链表之后。链表法性能取决于hash函数的性能,尽量保证链表长度足够小。

如何创建一个线程池,其

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值