基础知识

1.ArrayList与LinkedList区别

  数据结构不同 Arraylist是动态数组的数据结构,LinkedList是链表 双向链表的数据结构

  ArrayList是动态数组有初始容量的,而LinkedList是不需要制定初始容量

  当随机访问List(get set )操作时 ArrayList要比LinkedList效率要快一些,因为动态数组结构是连续性的存储方式,而LinkedList是线性存储方式,所以需要从前往后依次查找,ArrayList对于数据查询比较快,但是在插入或者删除时就是比较慢,因为需要移动其他元素

  当添加 和删除时 LinkedList要更快一些,因为不需要管其他元素 对于LinkedList来言 只有查找的时候时间复杂度是O(i) 这里的i指的是 索引的位置,而删除时间复杂度是O(1)

2.HashMap为什么需要红黑树?

  在原有的链表上增加了一个二分搜索法是可以更高效率的优化查询速度,为什么选择红黑树而不是AVL树,那是因为在考虑查询的基础上还要考虑添加和删除的代价,AVL树的旋转也很耗时,所以被否定

3.HashMap和LinkedHashMap区别? 

  HashMap是无序的,而linkedHashMap是有序的  inkedHashMap继承了HashMap,在hashMap基础之上又维护了一个双向链表, 可分为插入顺序 和访问顺序两种 如果是访问顺序 那put和get 操作已经存在的Entry时都会把Entry移动到双向链表的最前面,(linkedHashMap使用了LUR(最少使用算法))

4.hashmap什么时候扩容?

  当元素的个数超过临界值时就会自动扩容, 临界值如何计算呢?  计算公式如下:  临界值=负载因子(默认0.75) * 容量大小(默认16)

5.TreeMap为什么要实现compare接口?

  treeMap 根据其key键自然顺序排序,内部使用的不是hashcode也不是equals 是使用的compare排序

6.RocketMQ的实现 如何保证高可用,高吞吐,消息顺序,重复消费,事务消息,延迟消息,死信队列

  RocketMq如何保证高可用? 尽量避免单节点的架构,数据要求高最好是一主多从的方式,数据要求不是很高多主多从

  死信队列? 当一条消息初次消费失败,消息队列 RocketMQ 会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正 确地消费该消息,此时,消息队列 RocketMQ 不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。
在消息队列 RocketMQ 中,这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),存储死信消息的特殊队列称为死信队列 (Dead-Letter Queue)。

  如何避免死信队列?解决私信队列问题  可以在消费过程中做幂等性的时候做好状态码控制
  RocketMq如何保证高吞吐? 生产消息需要过滤,例如tag关键词,消费消息要多实例 避免消息堆积

  RocketMq是推模式还是拉模式?不管是推模式还是拉模式底层都是拉模式 

7.RocketMQ如何保证顺序消费?

  如果我们能保证每次生产数据的顺序放入的是同一个队列就可以保证生产者的顺序,因为队列本身就是先进先出的天然数据结构,我们一般都是按照订单编号取余数%的方式 把当前订单的顺序状态发送到同一个队列里,那么在消费端RocketMQ 也给我们提供了两种消费模式 一种是并发消费MessageListenerConcurrently,一种是顺序消费MessageListenerOrderly  我们只要确保消费使用的是顺序消费即可,并且顺序消费带来的是降低吞吐量的代价,如果消费端采用的是多线程消费,那么要使用锁,或者分布式锁来控制消费端流程,还要注意的是要控制好消费失败后最大的重试机制,不能让队列阻塞

8.RocketMQ如何保证不重复消费?

  我个人偏向使用 数据库的主键和状态机来实现这种方式,一来可以控制重复消费 二来状态机还可以控制死信队列,消费成功否等问题,

9.如何在一堆字符串里面去寻找一个字符串?

  使用字母查找树最完美 时间复杂度O(M)

10.spring bean的生命周期?

     加载系统环境变量 加载 解析 校验配置合法性 创建 装配依赖注入(解决三级缓存)使用,销毁

posted @ 2023-02-15 16:56  郎小乐  阅读(20)  评论(0编辑  收藏  举报