2020年Java首场面试总结
一:面试遇到的问题
1:讲一下你最近做过的项目
2:说下synchronized和lock的区别,同时说下lock内部有什么方法
3:说下Java虚拟机的内存回收算法和回收原理
4:说下MySQL的优化
5:说下MySQL的索引和索引之间的区别、索引什么时候失效
6:讲下tomcat性能调优
7:说下怎样保证单例模式的线程安全
8:说下ArrayList和LinkedList的区别
9:讲下线程池的原理和几个参数
10:开启线程你了解几种方式
11:nginx你平时都是拿来作为什么用,同时怎样保证高可用
12:怎样确定一个链表里面是否有环,同时链表的最后一个节点指向的是什么
13:讲一下你了解的dockers
14:dockers是一个微型虚拟机吗?
15:讲一下redis的数据结构类型
16:Springboot的设计原理
17:springmvc默认是单例还是多例,为什么要这么设计
18:讲一下你了解的排序算法,同时说一下他们的优缺点
二:面试的问题解答
1:讲下最近的项目
这个问题没啥好说的,只要按照平时上班怎样做的项目,就怎么说就可以了,基本问题不太大。
2:说下synchronized和lock的区别,同时说下lock内部有什么方法
区别:
- Synchronized是关键字,内置语言实现,Lock是接口。
- Synchronized在线程发生异常时会自动释放锁,因此不会发生异常死锁。Lock异常时不会自动释放锁,所以需要在finally中实现释放锁。
- Lock是可以中断锁,Synchronized是非中断锁,必须等待线程执行完成释放锁。
- Lock可以使用读锁提高多线程读效率。
lock接口内的方法:
-
// 获取锁
void lock() -
// 如果当前线程未被中断,则获取锁
void lockInterruptibly() -
// 返回绑定到此 Lock 实例的新 Condition 实例
Condition newCondition() -
// 仅在调用时锁为空闲状态才获取该锁
boolean tryLock() -
// 如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁
boolean tryLock(long time, TimeUnit unit) -
// 释放锁
void unlock()
3:说下Java虚拟机的内存回收算法和回收原理
4:说下MySQL的优化
5:说下MySQL的索引和索引之间的区别、索引什么时候失效
6:讲下tomcat性能调优
7:说下怎样保证单例模式的线程安全
单例模式的线程安全
double check
public class SingletonClass {
private volatile static SingletonClass instance = null;
public static SingletonClass getInstance() {
if (instance == null) {
synchronized (SingletonClass.class) {
if(instance == null) {
instance = new SingletonClass();
}
}
}
return instance;
}
private SingletonClass() {
}
}
8:说下ArrayList和LinkedList的区别
- ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
- 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
- 理论上来说在做新增和删除操作add和remove时,LinedList比较占优势,因为ArrayList要移动数据。
9:讲下线程池的原理和几个参数
10:开启线程你了解几种方式
11:nginx你平时都是拿来作为什么用,同时怎样保证高可用
- nginx一般拿来作为图片服务器和负载均衡使用
- 负载均衡采用的算法有轮询算法、加权算法
nginx的用处和算法讲解
12:怎样确定一个链表里面是否有环,同时链表的最后一个节点指向的是什么
单向链表最后一个节点指向的为null
如何确定链表中是否有环
13:讲一下你了解的dockers
dockers容器化技术让我们在Linux上面的部署操作更加方便,不再需要去配置那些繁琐的配置文件,只需要通过镜像拉取操作就可以,然后通过dockers命令启动就可以运行,是一个集装箱应用。