本文主要对自己碰到的常见的Java面试题进行了总结以及给出了自己的解答。

  • 讲一讲你对数据库的索引和事务的理解 ?
    可参考[[MySQL 数据库常见面试题总结]]进行针对性回答。

  • 讲一讲你对数据库的乐观锁和悲观锁的理解 ?
    可参考[[MySQL数据库常见面试题总结]]进行针对性回答。

  • Java里面有哪几种类型的锁 ?

1、synchronized

1
2
3
4
5
6
7
8
三个阶段
偏向锁
在对象头上的Mark Word部分设置线程ID
轻量级锁
轻量级锁依赖CAS操作Mark Word来试图获取锁
重量级锁
monitorenter 和 monitorexit
不可重入锁

2、ReentrantLock

1
2
3
4
可重入锁
基于AQS来实现,首先尝试用CAS(LOCK_IF_MP)来获取锁,如果没有获取到,就加入到FIFO的链表里面,然后锁如果被释放了,通知链表里面的第一个节点获取锁
提供了Condition用于线程间通信
提供了tryAcquire方法,用于超时没有获取到锁的处理

3、ReentrantReadWriteLock

1
写线程访问时,所有的读和其他写线程都阻塞
  • 定义一个10位的buffer,有一个线程每100ms读一次buffer,有一个线程每1s写一次buffer,要求性能尽可能高,且不能出现脏读和幻读
    可利用上面的ReentrantReadWriteLock读写锁来实现,并在buffer定义的时候加上volatile关键字,保证线程的可见性。

  • 单一接口混合功能和接口功能单一哪个实现上更优?
    暂无什么好的想法,个人自由发挥

  • 消息防疲劳系统怎么设计?
    暂无什么好的想法,个人自由发挥

  • 首字母联想词搜索用什么数据结构比较好?

  • 根据GC Root确定对象能不能回收的具体机制是什么,到底怎么确定对象之间是否存在引用?

  • 讲一讲你项目中最大的技术难点是什么?
    核心是需要讲好项目中遇到的最大挑战,要从面试官的角度去考虑问题,而不是泛泛的去谈自己整个做事的流程,最主要是说这个技术挑战的缘起是什么,自己怎么考虑的,用什么好方法解决的。
    其实可以讲讲我们缓存的设计。怎么设计缓存key的?怎么保证缓存不雪崩,怎么保证高可用,怎么做的缓存预热,怎么保证缓存命中率,怎么保证缓存不穿透,可以从上面这几个方面去讲,说实话自己对整个项目的总结还是有点不够,面对面试官的气场不够强,信心不太足,没有发挥出自己的亮点,其实整个来说我做的这块还是挺有挑战的。

其他

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
1.一面主要问基础,包括几方面:

1) collection接口下面有哪些集合,hashmap的实现原理,要把1.7和1.8的区别(红黑树)讲出来,map有哪些实现类以及使用场景,hashmap, hashtable, linkedhashmap,weakHashMap, treemap, concurrentmap,你要是讲的好这里可以说十几分钟,linkedhashmap和treemap排序的区别,concurrenthashmap如何实现线程安全,这里也要把1.7和1.8实现差异说出来(分段加锁和cas技术),说到这里以后就会问你cas实现原理( CPU Lock前缀指令),它是如何保证其他cpu core的cache失效的,然后会问你volatile的实现原理,要结合java内存模型来讲,可见性是如何实现的(内存屏障),synchronized锁和reentrantlock的区别以及内部怎么实现的: 常用的gc算法及优缺点,如何判断对象的存活性

2) mysql有哪些索引,底层数据结构是什么,画一下b+树的结构以及数据的插入过程,聚集索引的特点,如何做索引优化,给你一个sql语句select a,b,c from t where a<某个值 and b>某个值 and c = 1,如何建索引(可以是c,a,b或者c,b, a的联合索引,但要分析什么场景下分别用哪个);结合Innodb的实现说下数据库的隔离级别,分别是怎么解决脏读、不可重复读和幻读取的;对mysql最新版本的同步机制有没有了解,比如一个主节点和多个备份节点,mysql怎么保证可用性和性能;

3) redis有哪些数据结构,分别用在哪些场景,对redis的pipeline有没有了解,解决什么问题,redis采用了什么方式来节省内存

4) Spring IOC的理解以及IOC容器的初始化过程,Spring里的Bean是保存在哪里的,BeanFactory和FactoryBean的区别,Spring AOP怎么实现的(需要讲出来JDK动态代理和CGLib动态代理优缺点),头条还问了如果一个类的某个方法没有在接口里定义,这两种动态代理方式是怎么实现的;

5) 线程池有哪些实现类,ThreadPoolExecutor有哪些参数,讲下它的工作原理,在使用过程中有哪些经验(比如工作队列大小的设置,ThreadFactory和ExjectExcutionHandler)

6) 线程有哪些状态以及怎么转换的

7. 二面主要结合项目来问

1). GC的常用算法以及优缺点,项目中用的什么垃圾回收算法,怎么做GC调优,对G1收集器有没有了解(要说出G1的出现主要解决了什么问题,为什么CMS算法会有内存碎片)

在介绍GC算法的时候可能会提到GC Roots,面试官会问你哪些对象可以作为GC Roots,栈里面的局部变量表里有基本数据类型和引用类型,怎么找到引用类型;有个对象引用比如Hello, hello.sayHello()调用的时候怎么找到类里的sayHello()这个方法

2). 项目里有用到限流,具体怎么做的

3). 看你对Netty有了解,能不能讲下它的工作原理,netty里ChannelInBoundHandler和ChannelOutBoundHandler的区别,netty在读写数据的时候是先调用head还是tail handler,既然你知道NIO,有没有听说

JDK epoll的BUG,Netty是怎么解决的,如何解决TCP粘包和拆包的问题,为什么会出现粘包和拆包

4). 讲下你项目里做的数据库索引优化,如何去分析一条语句的执行性能,explain语句你会关注哪些字段

5). 分别在什么场景使用synchronized和Lock,ReentrantLock内部怎么实现的,多线程通信有哪些方式(要把JUC包下的常用实现类说出来,比如CountDownLatch, 信号量, 栅栏)

6). 如何实现分布式锁,一开始说了redis的实现,redis可能在锁超时后还没执行完任务,这个时候要怎么做,有没有更好的方式,后面说了用zookeeper的实现

7). 项目里有用到ElasticSearch,能介绍ES的工作原理吗,什么是正向索引和反向索引,如何对ES进行优化

8). 为什么会出现大量CLOSE_WAIT连接,能不能画一下TCP挥手的流程图介绍下,后面是怎么解决句柄泄露的问题

9). 写代码实现一个EnumSet(阿里),用数组或者链表实现一个阻塞队列(美团)

10). 哪些场景下会出现内存泄露(可以讲下HashMap,ThreadLocal,WeakHashMap,finalize),会问你ThreadLocal的原理以及为什么会有内存泄露

11). 如何获取Redis里所有的keys(可以先说下keys *命令,然后再介绍可能导致系统阻塞无法对外响应,再介绍更好的scan命令)

12). Java类加载机制,为什么要双亲委派

13). Spring Bean的作用域有哪些,单例是线程安全的吗,怎么保证线程安全

14). Java里的Exception信息是怎么保存的,有没有用到java8的一些特性, Lambda表达式是语法糖吗,怎么实现的,和匿名内部类有什么区别;

3. 三面,一般是技术总监或者某个部门的主管面

1). 简历里有提到有定位系统响应慢的经验,具体怎么做的

2). 如果有个节点一直在做FullGC,你要怎么快速定位并恢复环境

3). 如果要做一个秒杀系统,你会怎么设计,把能想到的点都说出来

4). 假设数据库里有100W条数据,要把他们全部加载到Redis里,你会怎么设计这个系统(这里可能是个坑,缓存一般保存的热点数据,要讲下分布式缓存、缓存击穿、雪崩、并发更新等问题)

5). ElasticSearch的分片机制,ES搜索过程是如何工作的,如果有很多网卡信息怎么做分片,如果一个Document有2个网卡呢

6). 用过哪些消息中间件,能不能说下Kafka的工作原理,如果保证分布式系统的数据的一致性,给Kafka发消息如何保证消息的幂等性

7). 如何对数据库做分库分表

4. 四面,基本上也是结合项目来问一些知识点,面试官一般会比较强势,会经常打断你说话,给你压力,这个时候千万不要慌,问的问题和上面差不多

你在项目中遇到的最难的一个问题是什么,自己对未来3-5年的一个规划

5. 五面,HR面,随便聊聊
Contents