4年经验Java面试,题目及答案
以下是4年工作经验程序员的Java模拟面试过程中涉及的问题和答案,由于问题较多,不可能把所有答案都整理完善,因此有些答案只贴出了链接,建议在电脑端打开本文进行阅读。
想观看视频版的,可以扫描下方二维码,进入哔哩哔哩观看。
1、HashMap原理
具体可以看这篇文章:
https://www.cnblogs.com/chengxiao/p/6059914.html
2、JDK1.7中HashMap死循环
可以看这篇:
https://www.jianshu.com/p/1e9cf0ac07f4
3、JDK1.8中HashMap扩容
可以看这篇:
https://blog.csdn.net/weixin_41884010/article/details/100699047
4、ConcurrentHashMap
可以看这篇:
https://blog.csdn.net/weixin_44460333/article/details/86770169
5、锁的粒度太细,有什么问题?
锁粒度太细,发生死锁的概率会更大
衍生问题:什么是死锁?怎么写一个死锁程序?
https://mp.weixin.qq.com/s/pDI4SZx-Hdi4u2MGj9h4gQ
6、线程池原理
可以看下这篇文章:
https://blog.51cto.com/14230003/2418026
7、线程池有哪些拒绝策略
ThreadPoolExecutor.AbortPolicy:
丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:
丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:
丢弃队列最前面的任务,然后重新提交被拒绝的任务
ThreadPoolExecutor.CallerRunsPolicy:
由调用线程(提交任务的线程)处理该任务
8、怎么停止线程
可以看这里:
https://www.cnblogs.com/lukelook/p/10001298.html
9、Thread类中的stop方法有什么问题
stop方法是已经被废弃的方法,不推荐使用。而且会对被锁定对象进行解锁,会出现数据不一致的情况,所以一般不用这个方法。
10、怎么理解线程安全
当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。——《Java并发编程实战》(这本书不错,Java并发编程领域必看的书籍,推荐看下)
11、局部变量会有线程安全的问题吗?
局部变量是线程安全的,因为局部变量是线程私有的,不存在数据竞争,这种实现线程安全的方法也叫“线程封闭”
12、ThreadLocal原理
简单来说就是,每个线程都有自己的ThreadLocalMap,这个Map的Key是ThreadLocal对象,value是这个ThreadLocal对象所设置的值。
详细的可以看这里:
https://www.cnblogs.com/luxiaoxun/p/8744826.html
13、并发编程里的可见性出现的原因
主要原因是CPU缓存
计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。
也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。
因为CPU缓存的存在,使得不同CPU上的线程看不到彼此数据的更新,所以才出现了可见性的问题。
14、volatile解决了什么问题
解决了可见性和指令重排问题,但不具有原子性,所以不能用于自增。
15、synchronized用在静态方法和非静态方法上,有什么区别?
修饰非静态方法==》对象锁
修饰静态方法==》其实是类锁,因为是静态方法,它把整个类锁起来了
16、reentrantLock跟synchronized有什么区别
可重入性:
从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。
锁的实现:
Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的,有什么区别,说白了就类似于操作系统来控制实现和用户自己敲代码实现的区别。前者的实现是比较难见到的,后者有直接的源码可供阅读。
性能的区别:
在Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized,其实synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术。都是试图在用户态就把加锁问题解决,避免进入内核态的线程阻塞。
功能区别:
便利性:很明显Synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally中声明释放锁。
锁的细粒度和灵活度:很明显ReenTrantLock优于Synchronized
ReenTrantLock独有的能力:
1.ReenTrantLock可以指定是公平锁还是非公平锁。而synchronized只能是非公平锁。所谓的公平锁就是先等待的线程先获得锁。
2.ReenTrantLock提供了一个Condition(条件)类,用来实现分组唤醒需要唤醒的线程们,而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。
3.ReenTrantLock提供了一种能够中断等待锁的线程的机制,通过lock.lockInterruptibly()来实现这个机制。
17、Java单例模式
可以看这篇:
https://blog.csdn.net/fd2025/article/details/79711198
18、事务的隔离级别
可以看这篇:
https://www.cnblogs.com/neal-ke/p/9052212.html
19、可重复读存在的问题
会存在幻读的问题
20、MySQL事务隔离怎么实现
MVCC 多版本并发控制
具体可以看这篇:
https://blog.csdn.net/SnailMann/article/details/94724197
21、MySQL中innodb引擎,主键索引和非主键索引在数据存储方面有什么差异
在 InnoDB 里,主键索引的叶子节点存的是整行数据。主键索引也被称为聚簇索引(clustered index)。非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。
22、MySQL引擎
23、Redis数据类型、数据结构
字符串(String)、哈希(hash)、列表(list)、集合(set)、有序集合(short set)
24、缓存同时批量失效
对key设置随机的过期时间,可以防止key在同一时间点同时失效。
25、缓存击穿
缓存击穿指的是使用不存在的key进行大量的高并发查询,这导致缓存无法命中,每次请求都要击穿到后端数据库系统进行查询,使数据库压力过大,甚至使数据库服务被压死。
一般有2种方法,一种是对不存在的值设置一个特殊值,这样就不会一直回源了;一种是将全量数据放到布隆过滤器里,回源前,先在布隆过滤器里查一下这个key存不存在,再决定要不要回源。
26、布隆过滤器原理
https://mp.weixin.qq.com/s/gAP7QN8_R-Ev8EMwrxHMVw
27、缓存并发
key失效,多个线程并发回源。
一般是通过分布式锁,来防止多个线程并发回源。
28、redis怎么实现分布式锁
可以看这篇:
https://www.cnblogs.com/wukongbubai/p/12393370.html
29、Redis是单线程还是多线程
Redis在执行命令的过程中是单线程的
Redis 6.0引进了多线程IO,不过执行命令依旧还是单线程的。
30、Redis淘汰策略
有8种:noeviction,volatile-lru,volatile-lfu,volatile-ttl,volatile-random,allkey-lru,allkeys-lfu,allkeys-random
31、Redis持久化
RDB、AOF
具体可以看这篇:
https://baijiahao.baidu.com/s?id=1654694618189745916
32、zookeeper节点类型
永久节点、临时节点、有序永久节点、有序临时节点
33、zookeeper实现分布式锁
具体可以看这篇:
https://blog.csdn.net/qiangcuo6087/article/details/79067136
34、倒排索引
具体可以看这篇:
https://www.cnblogs.com/cjsblog/p/10327673.html
35、微服务的介绍与微服务的好处
微服务的介绍跟微服务的好处可以看这篇:
https://www.cnblogs.com/xiao2shiqi/p/11298663.html
36、微服务的缺点
rpc调用比本地调用更耗时
可能会引入分布式事务
37、使用mq的过程中怎么解决消息重复消费的问题
主要是保证消息消费的幂等性
具体可以看这篇:
https://www.jianshu.com/p/172295e2e978