1、LinkedList是单向的还是双向的?
双向,因为有previous和next两个方向的指针。
那面试官可能会接着问,那是双向链表还是双向重复链表呢?
jdk1.6是双向循环链表,head节点首尾相连;jdk1.7是双向链表,去掉了header节点,对应的加了first,last两个节点。
为什么jdk要做这样的优化呢?
链表在表头表尾做操作情况居多,新的结构只需要在first前或者last后追加节点,维护单边指针即可,旧数据结构需要同时维护前后指针,成本更高。(个人见解,网上讨论这个问题的不多)
2、synchronized有哪几种使用方式?
- 修饰代码块
- 修饰方法
- 修饰静态方法
修饰代码块手动创建的对象越小,性能越高,比如byte[] lock = new byte[0]
3、ReentrantReadWriteLock重入读写锁
- 读写锁的优势在于允许同时加读锁以提供性能
- 读锁释放前不能加写锁
- 写锁释放前不能加读锁或写锁
4、线程池工作线程未达到核心线程数时是否会重用空闲线程?
不会,会新建工作线程去处理任务,超过核心线程数的空闲线程会被重复利用,若超过keepAliveTime+unit指定的时间一直未被使用,便会回收直到工作线程数量减小到核心线程数。
5、hashSet的value存的是什么?
private static final Object PRESENT = new Object();
为什么不是null呢?
看hashset的add方法就明白了,如果是null,无法根据返回值判断元素是否已存在。
6、Redis为什么不用多线程?
- 单线程避免了线程上下文切换
- redis使用多路复用技术,可以处理并发的连接
7、Redis如何保证主从高可用?
哨兵机制,定时发送心跳检测主是否存活,不存活则认为是“主观下线”,多数哨兵都认为主已下线,则认为是“客观下线”,这时候才会将其中一个从节点升为主节点,其他的从节点从新的主节点同步数据,原主节点活过来也从新的主节点同步数据。
8、Redis集群原理
对象保存到Redis之前先经过CRC16哈希到一个指定的Node上,每个Node被平均分配了一个Slot段,对应着0-16384,Slot不能重复也不能缺失,否则会导致对象重复存储或无法存储。
集群是为了扩展并发写的能力,主从是为了扩展并发读的能力。两者结合使用效果最好。
9、MySQL索引失效的原因有哪些?
- 等号左侧做计算、使用函数
- 使用!= <>
- 使用not in
- 使用or
- 使用is null、is not null
- 数据量小,全表扫描比走索引快时
10、MySQL优化方式?
11、MySQL内存分页原理
12、MySQL读写的过程是怎样的?
13、MySQL主从复制原理
binlog
14、MySQL主从复制如何保证数据一致性
15、MySQL 常用引擎以及特性
16、Thread调用两次start会怎样?
17、hdfs节点挂掉再恢复数据会删除吗?
18、mapreduce和spark哪个更细粒度?
19、hdfs读写数据步骤
20、hive支持哪些执行引擎
21、HBASE和MySQL有什么区别?
22、数据量小时HBASE和MYSQL哪个写的效率更高
23、kafka交付保证语义级别有哪些?
24、zookeeper有哪些使用场景?怎么保证高可用
25、描述下垃圾收集器G1
26、讲解下volatile关键字的作用以及原理
后面问题的答案后面有时间再整理,前面的答案写的比较简洁,后续再完善,睡觉睡觉。。。狗命重要。