vlambda博客
学习文章列表

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引擎

4年经验Java面试,题目及答案

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