1.HashMap常见面试题
-
HashMap的底层数据结构
HashMap底层是数组+链表 -
HashMap的存取原理
通过对key进行hash得到index值,根据index索引值找到对应的数据 -
java7和java8的区别
在hashmap put插入的时候,java7采用的是头插法,头插法会导致新来的值替换原来的值,会将hash的存储结构进行打乱,
在java8采用的是尾插法,不会打乱原hashmap存储结构 -
为啥hashmap线程不安全
以为hashmap的get/set方法没有同步锁,在多线程环境下,可能会出现get.set的不是同一个值, -
hashmap默认初始化大小
16 -
hashmap的扩容方式,负载因子是多少,
hashmap扩容有两个因素,一个是hashmap当前长度,另一个是hashmap的负载因子,
假如当前hashmap的长度是100 ,默认负载因子是0.75,当插入第76个元素的时候会出现扩容,
扩容分为两步,第一创建一个新的entry数组,长度是原数组的两倍,
第二遍历原数组,将原数组从新hash到新数组
消息队列MQ面试题
-
消息队列的作用和使用场景
异步:批量处理数据 例如:批量上传文件等
削峰:高负载任务负载均衡 例如:电商秒杀抢购
解耦:串行任务并行化 例如:退货流程解耦
广播:基于发布/订阅模式实现一对多通信 -
多个消费者监听一个队列时,消息如何分发
1.轮询,轮流给每一个消费者发送一条消息
2.公平分发,使用basicQos来指定消费消息数量,当消费者没有给服务端返回ack确认时,则代表消费者正在忙碌,则不会给该消费者发送消息 -
无法被路由的消息,去了哪里
被丢弃!
解决方案:使用mandatory=true实现消息的回发
或者声明交换机的时候指定备份交换机 -
消息在什么时候变成死信消息
当消息进入死信交换机才会变成死信消息
1.消息被消费者拒绝,会进入死信交换机
2.消息过期,可以设置消息过期时间
3.队列发生消息堆积,超过最大长度,则最先入队的消息会进入死信交换机 -
如何实现延时队列
创建死信队列的时候绑定死信交换机,所有到达死信交换机的消息都会进入到死信队列,然后再将对列指定过期时间,由于没有消费者,所以所有达到队列的消息都会进入到死信交换机从而进入死信队列,被消费者消费 -
如何保证消息的可靠性投递
1.保证消息从生产者发送至mq的服务器,
1.开启事务模式,
事务模式的话会出现阻塞,影响性能
2.开启确认模式
2.保证消息从交换价正确路由到正确的队列
不能路由的消息,最终保存下来,单独分析和处理
3.队列正确存储,
将消息进行持久化处理
4.消息从队列发送到消费者
开启消费者的手工应答,只有收到消费者的ack返回才代表该消息被正常消费