1、手撕代码。牛客题霸上的原题,可以去看看:NC45 实现二叉树先序,中序和后序遍历
2、项目详细信息,涉及一些aiot交互处理,怎么实现大量的不同设备的指令编解码和指令转化,服务器的架构,自己责任模块
3、OOM的故障处理
4、有没有用过分布式锁,怎么实现的,讲讲原理
5、为什么Redis选择使用跳表而不是红黑树来实现有序集合?
首先分析下Redis的有序集合支持的操作:
1)插入元素
2)删除元素
3)查找元素
4)有序输出所有元素
5)查找区间内所有元素
其中,前4项红黑树都可以完成,且时间复杂度与跳表一致。但是,最后一项,红黑树的效率就没有跳表高了。在跳表中,要查找区间的元素,我们只要定位到两个区间端点在最低层级的位置,然后按顺序遍历元素就可以了,非常高效。
而红黑树只能定位到端点后,再从首位置开始每次都要查找后继节点,相对来说是比较耗时的。此外,跳表实现起来很容易且易读,红黑树实现起来相对困难,所以Redis选择使用跳表来实现有序集合。
6、mysql优化的实践经验
7、hashMap1.8与1.7区别
jdk1.8相对于1.7底层实现发生了一些改变。1.8主要优化减少了Hash冲突 ,提高哈希表的存、取效率。
(1)底层数据结构不一样,1.7是数组+链表,1.8则是数组+链表+红黑树结构(当链表长度大于8,转为红黑树)。
(2)JDK1.8中resize()方法在表为空时,创建表;在表不为空时,扩容;而JDK1.7中resize()方法负责扩容,inflateTable()负责创建表。
(3)1.8中没有区分键为null的情况,而1.7版本中对于键为null的情况调用putForNullKey()方法。但是两个版本中如果键为null,那么调用hash()方法得到的都将是0,所以键为null的元素都始终位于哈希表table【0】中。
(4)当1.8中的桶中元素处于链表的情况,遍历的同时最后如果没有匹配的,直接将节点添加到链表尾部;而1.7在遍历的同时没有添加数据,而是另外调用了addEntry()方法,将节点添加到链表头部。
(5)1.7中新增节点采用头插法,1.8中新增节点采用尾插法。这也是为什么1.8不容易出现环型链表的原因。
(6)1.7中是通过更改hashSeed值修改节点的hash值从而达到rehash时的链表分散,而1.8中键的hash值不会改变,rehash时根据(hash&oldCap)==0将链表分散。
(7)1.8rehash时保证原链表的顺序,而1.7中rehash时有可能改变链表的顺序(头插法导致)。
(8)在扩容的时候:1.7在插入数据之前扩容,而1.8插入数据成功之后扩容。
8、netty的原理和使用
9、tcp的连接过程
10、socket有几个队列
11、一台服务器能支持多少连接,为什么
12、tcp各个参数怎么设置
13、redis底层基本数据类型,redis集群原理,cluster集群的使用
14、mysql存储引擎类型,索引类型,innodb数据存储方式
15、线程池的参数说明,rejectHandler说明
16、volatile的原理
17、jvm有哪几种垃圾回收器,各自的应用场景
(1)新生代收集器:
•Serial
•ParNew
•Parallel Scavenge
(2)老年代收集器:
•Serial Old
•CMS
•Parallel Old
(3)堆内存垃圾收集器:G1
18、g1回收器的特征
19、jvm结构
20、负载均衡器的四层和七层负载均衡原理
21、场景题:设计一个高可用高并发的电商系统
全部评论
(2) 回帖