JAVA基础常见面试题
1. volitate关键字的作用。
这个关键字能保证可见性、有序性,不能保证原子性。
可见性:一个线程修改了这个变量, 另一个线程是立刻可见的。
内存模型,程序运行后,线程会从内存拷贝一份副本到缓存中,线程会先读写副本,副本在操作执行完成后在对内存进行同步。
有volitate关键字后能达到两种效果:
a. 一个线程修改了副本(缓存)的变量后, 会立刻引起副本到内存的更新
b. 一个线程副本对内存更新后, 会立刻导致其他线程的副本失效。
volatile 保证内存可见性,其实是用到了 CPU 保证缓存一致性的 MESI 协议
有序性: 禁止CPU进行指令的重排序优化。
有序性的解释:
针对饿汉式的单例模式:
class Singleton{
private volitate static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if(instance==null) { // step 1
synchronized (Singleton.class) {
if(instance==null) // step 2
instance = new Singleton(); //step 3
}
}
return instance;
}
}
如果不添加volitate, 会出现这样的情况,new 是分为三个步骤完成的。
1. 分配内存空间
2. 初始化内存空间
3. 将instance指向内存空间。
不添加volitate, 可能会导致2和3的顺序有可能会被CPU重新排序优化。
优化的结果是, 一个线程进入到step3后, 另一个线程进入了step1, 但是CPU优化,执行了new的第一步和第三步,第二步未执行,但instance已经不是null
此时,第二个线程拿到了一个没有初始化完成的instance,在使用的时候会导致问题。 所以必须得添加volitate
原子性:一个操作不能被CPU中途暂停重新调度。比如a=1是原子的, 但是a++不是原子操作。 volitate不能保证原子性,synchronized可以保证原子性,另外还有一些原子数的类可以保证。
java的内存模型: 内存, 缓存。每个线程会拷贝副本到缓存中。
2. 对OOM和内存泄漏 参考 https://blog.csdn.net/weixin_30532837/article/details/101807244
OOM有几种:
a. 栈溢出 , 一个函数调用自己, 会导致栈溢出。发生区域:java虚拟机栈或本地方法栈
java.lang.StackOverflowError
public class StackOverFlowErrorDemo {
public static void main(String[] args) {
stackOverFlowError();
}
public static void stackOverFlowError(){
stackOverFlowError();
}
}
b。 堆溢出。 new 一个很大的对象,会导致堆溢出
如下:
java.lang.OutOfMemoryError: Java heap space
public class JavaHeapSpaceDemo {
static class OOMObject{
}
public static void main(String[] args) {
List<OOMObject> list = new ArrayList<>();
while (true){
list.add(new OOMObject());
}
}
}
c. GC回收时间过长,例如98%的时间来做回收,仅回收2%的内存。
java.lang.OutOfMemoryError: GC overhead limit exceeded
/**
* -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m
*/
public class GCoverheadDemo {
public static void main(String[] args) {
int i = 0;
List<String> list = new ArrayList<>();
while (true) {
list.add(String.valueOf(++i).intern());
}
}
}
d. java.lang.OutOfMemoryError: Direct buffer memory
原因:直接内存不足
写NIO程序经常使用ByteBuffer来读取或写入数据,这是一种基于通道与缓冲区的I/O方式
ByteBuffer.allocate() 分配JVM堆内存,属于GC管辖范围,需要拷贝所以速度相对较慢
ByteBuffer.allocateDirect() 分配操作系统本地内存,不属于GC管辖范围,不需要内存拷贝所以速度相对较快
/**
* -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m
*/
public class DirectBufferMemoryDemo {
public static void main(String[] args) throws InterruptedException {
System.out.println("maxDirectMemory : " + sun.misc.VM.maxDirectMemory() / 1024 / 1024 + "MB");
TimeUnit.SECONDS.sleep(1);
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(6 * 1024 * 1024);
}
}
e. java.lang.OutOfMemoryError : unable to create new native thread
一个应用进程创建了多个线程,超过系统承载极限,Linux默认允许单个进程可以创建的线程数1024
/**
* 一个应用进程创建了多个线程,超过系统承载极限,Linux默认是1024
*/
public class UnableCreateNewThreadDemo {
public static void main(String[] args) {
for (int i = 0; ; i++) {
new Thread(() -> {
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}, String.valueOf(i)).start();
}
}
f. java.lang.OutOfMemoryError: Metaspace
java8使用Metaspace代替永久代,与永久代最大的区别是:元空间并不在虚拟机内存中,而是使用本地内存。
永久代(java8使用Metaspace)存放的信息:
虚拟机加载的类信息
常量池
静态变量
即时编译后的代码
/**
* 不断生成类往元空间推,类占据的空间总是会超过Metaspace的大小
* -XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=8m
*/
public class MetaspaceOOMDemo {
static class OOMTest {
}
public static void main(String[] args) {
int i = 0; //模拟计数多少次后发生了异常
try {
while (true) {
i++;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOMTest.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(o, args);
}
});
enhancer.create();
}
} catch (Throwable e) {
System.out.println(i + "次后发送了异常");
e.printStackTrace();
}
}
}
扩展:
单例模式如何创建多个实例, 通过反射机制可以。
3. java中的4中引用类型
4. java中class的4中修饰类型的区别。 public private protect default
| 类内部 | 本包 | 子女 | 外部 | |
| public | 是 | 是 | 是 | 是 |
| private | 是 | 否 | 否 | 否 |
| protect | 是 | 是 | 是 | 否 |
| default | 是 | 是 | 否 | 否 |
5. 反射机制
参考https://blog.csdn.net/qq998701/article/details/95452543
程序运行时,我们能够获取所有类的属性,并调用所有类及对象的方法。 我们把这种动态获取类的属性及调用对象方法的机制叫做反射。
反射可以有三种方式:
a. 通过.class获取类对象
Class class1 = Person.class
b. 通过对象实例来获取
Person person = new Person()
Class class2 = person.class
c. 通过包名来获取
Class class3 = Class.forName("day07.Person");
6. classLoader 机制。参考https://blog.csdn.net/stypace/article/details/40613953
class Loader 负责读取java的字节码,并将字节码转换为class的实例。
classLoader分为4种:
三种系统提供的:
引导类的classloader
扩展类的classloader
系统类的classloader
用户自定义的classloader
classloader的双亲委托模式,
在classloader加载时,会先请求他的parent来加载, 如果parent不能加载时,才会由自身来完成加载,如果都不能完成加载,则加载失败。
这样做的好处是,安全性会提高,java的核心类不会被修改。
classloader加载后,会在缓存中记录该加载信息,相同的类仅加载一次。以后在生成实例时,即可根据加载信息来完成加载。
7. 为什么在object中定义wait和notify操作,而不是在Thread中。
wait和notify是一种线程通信机制。所有的对象都可以进行这种通信,这个与Thread中的synchronzied是有区别的。
8. java的IO流 https://www.cnblogs.com/QQ846300233/p/6046388.html
分为字符流和字节流。 区别, 字符流实际上是字节流在读取时,读一下码表,按字符来读取,可以处理的范围有限,仅能处理文本数据。
而字节流可以处理的范围更多, 图片、二进制都可以处理。
字节流: InputStream outputStream
字符流: Reader 、 Writer
9. BIO , NIO, AIO的区别 及各自的应用场景 https://blog.csdn.net/u010310183/article/details/81700405BIO
-
- 同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
-
NIO
- 同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。可以监听来自多个客户端的IO事件
- 多路复用器,可以监听来自多个客户端的IO事件:
- 若服务端监听到客户端连接请求,便为其建立通信套接字(java中就是通道),然后返回继续监听,若同时有多个客户端连接请求到来也可以全部收到,依次为它们都建立通信套接字。
- 若服务端监听到来自已经创建了通信套接字的客户端发送来的数据,就会调用对应接口处理接收到的数据,若同时有多个客户端发来数据也可以依次进行处理。
- 监听多个客户端的连接请求和接收数据请求同时还能监听自己时候有数据要发送。
-
AIO
- AIO(NIO.2):异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
10. 什么是死锁, 如何检测死锁, 编写一个可能导致死锁的程序, 如果解决死锁。
11. hashmap的工作原理
12. hashmap与hashtable的区别
hashmap线程不安全, hashtable是线程安全的。
hashmap中null可以作为key, hashtable 不允许
hash计算方式不同, hashmap为hashcode的二次hash, hashtable直接用hashcode来求模。
- 开放定址法(线性探测再散列,二次探测再散列,伪随机探测再散列)
- 再哈希法
- 链地址法
- 建立一个公共溢出区
Java中hashmap的解决办法就是采用的链地址法。
hashcode的计算方式:
hashcode GC后地址发生变化后,hashcode不会发生变化, 原因是一旦计算过hashcode,将会放入到头部中。
复制如下内容:
https://www.cnblogs.com/cocoxu1992/p/10460994.html
18.java 容器都有哪些?
19.Collection 和 Collections 有什么区别?
20.List、Set、Map 之间的区别是什么?
21.HashMap 和 Hashtable 有什么区别?
22.如何决定使用 HashMap 还是 TreeMap?
HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
23.说一下 HashMap 的实现原理?
计算key的hashcode,进行二次hash,然后插入到数组中。 底层使用数组+链表+红黑树来实现。
底层的链表长度不超过8,使用链表, 如果超过8,则转换为红黑树来存储,红黑树查找性能更高。
它首先会比较hashCode值,如果相同会看是不是实现了Comparable接口。
如果不幸既相等又没有实现Comparable。红黑树是通过类名排序实现的,退化为O(n)
首先和hashcode碰撞次数的泊松分布有关,主要是为了寻找一种时间和空间的平衡。在负载因子0.75(HashMap默认)的情况下,单个hash槽内元素个数为8的概率小于百万分之一,将7作为一个分水岭,等于7时不做转换,大于等于8才转红黑树,小于等于6才转链表。链表中元素个数为8时的概率已经非常小,再多的就更少了,所以原作者在选择链表元素个数时选择了8,是根据概率统计而选择的。
24.说一下 HashSet 的实现原理?
25.ArrayList 和 LinkedList 的区别是什么?
1. ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。
2. 对于随机访问,ArrayList优于LinkedList
3. 对于插入和删除操作,LinkedList优于ArrayList
4. LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
https://www.cnblogs.com/nnngu/p/8234568.html
26.如何实现数组和 List 之间的转换?
数组转list: Arrays.asList()
list转数组:list.toArray()
https://blog.csdn.net/andyzhaojianhui/article/details/49664553
27.ArrayList 和 Vector 的区别是什么?
https://blog.csdn.net/u011419651/article/details/83831156
28.Array 和 ArrayList 有何区别?
https://www.cnblogs.com/yonyong/p/9323546.html
29.在 Queue 中 poll()和 remove()有什么区别?
https://blog.csdn.net/qq_36101933/article/details/83145869
30.哪些集合类是线程安全的?
https://www.cnblogs.com/huangdabing/p/9249233.html
31.迭代器 Iterator 是什么?
32.Iterator 怎么使用?有什么特点?
java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,公共基类Collection提供iterator()方法。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
33.Iterator 和 ListIterator 有什么区别?
Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List,见名知意,Set并不能使用ListIterator
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
https://www.cnblogs.com/xujian2014/p/5846128.html
34.怎么确保一个集合不能被修改?
https://blog.csdn.net/timchen525/article/details/80517517
35.并行和并发有什么区别?
并发:指应用能够交替执行不同的任务,其实并发有点类似于多线程的原理,多线程并非是同时执行多个任务,如果你开两个线程执行,就是在你几乎不可能察觉到的速度不断去切换这两个任务,已达到"同时执行效果",其实并不是的,只是计算机的速度太快,我们无法察觉到而已.
就类似于你,吃一口饭喝一口水,以正常速度来看,完全能够看的出来,当你把这个过程以n倍速度执行时..可以想象一下.
并行:指应用能够同时执行不同的任务,例:吃饭的时候可以边吃饭边打电话,这两件事情可以同时执行
36.线程和进程的区别?
https://www.cnblogs.com/cocoxu1992/p/10468317.html
37.守护线程是什么?
守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程,这是它的作用——而其他的线程只有一种,那就是用户线程。所以java里线程分2种,
1、守护线程,比如垃圾回收线程,就是最典型的守护线程。
2、用户线程,就是应用程序里的自定义线程。
守护线程
1、守护线程,专门用于服务其他的线程,如果其他的线程(即用户自定义线程)都执行完毕,连main线程也执行完毕,那么jvm就会退出(即停止运行)——此时,连jvm都停止运行了,守护线程当然也就停止执行了。
2、再换一种说法,如果有用户自定义线程存在的话,jvm就不会退出——此时,守护线程也不能退出,也就是它还要运行,干嘛呢,就是为了执行垃圾回收的任务啊。
用户自定义线程
1、应用程序里的线程,一般都是用户自定义线程。
2、用户也可以在应用程序代码自定义守护线程,只需要调用Thread类的设置方法设置一下即可。
38.创建线程有哪几种方式?
39.说一下 runnable 和 callable 有什么区别?
40.线程有哪些状态?
41.sleep() 和 wait() 有什么区别?
42.notify()和 notifyAll()有什么区别?
43.线程的 run()和 start()有什么区别?
44.创建线程池有哪几种方式?
45.线程池都有哪些状态?
46.线程池中 submit()和 execute()方法有什么区别?
47.在 java 程序中怎么保证多线程的运行安全?
48.多线程锁的升级原理是什么?
49.什么是死锁?
死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。例如,在某一个计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。
死锁产生的原因:
1. 系统资源的竞争 :系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。
2. 进程运行推进顺序不合适:进程在运行过程中,请求和释放资源的顺序不当,会导致死锁。
50.怎么防止死锁?
https://www.cnblogs.com/bopo/p/9228834.html
51.ThreadLocal 是什么?有哪些使用场景?
https://www.cnblogs.com/chenkeyu/p/7623653.html
52.说一下 synchronized 底层实现原理?
https://www.cnblogs.com/paddix/p/5367116.html
53.synchronized 和 volatile 的区别是什么?
https://www.cnblogs.com/ouyxy/p/7242563.html
54.synchronized 和 Lock 有什么区别?
55.synchronized 和 ReentrantLock 区别是什么?
56.说一下 atomic 的原理?
https://blog.csdn.net/weixin_41846500/article/details/86636498
四、反射
57.什么是反射?
58.什么是 java 序列化?什么情况下需要序列化?
59.动态代理是什么?有哪些应用?
60.怎么实现动态代理?
五、对象拷贝
61.为什么要使用克隆?
62.如何实现对象克隆?
63.深拷贝和浅拷贝区别是什么?
六、Java Web
64.jsp 和 servlet 有什么区别?
65.jsp 有哪些内置对象?作用分别是什么?
66.说一下 jsp 的 4 种作用域?
67.session 和 cookie 有什么区别?
68.说一下 session 的工作原理?
69.如果客户端禁止 cookie 能实现 session 还能用吗?
70.spring mvc 和 struts 的区别是什么?
71.如何避免 sql 注入?
72.什么是 XSS 攻击,如何避免?
73.什么是 CSRF 攻击,如何避免?
七、异常
74.throw 和 throws 的区别?
a.throws出现在方法函数头;而throw出现在函数体。
b.throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
c.两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
75.final、finally、finalize 有什么区别?
a.final修饰符(关键字)。被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承。因此一个类不能既被abstract声明,又被final声明。将变量或方法声明为final,可以保证他们在使用的过程中不被修改。被声明为final的变量必须在声明时给出变量的初始值,而在以后的引用中只能读取。被final声明的方法也同样只能使用,即不能方法重写。
b.finally是在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出、捕获,finally块都会被执行。try块中的内容是在无异常时执行到结束。catch块中的内容,是在try块内容发生catch所声明的异常时,跳转到catch块中执行。finally块则是无论异常是否发生,都会执行finally块的内容,所以在代码逻辑中有需要无论发生什么都必须执行的代码,就可以放在finally块中。
c.finalize是方法名。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者被执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。
76.try-catch-finally 中哪个部分可以省略?
catch部分可以省略,也可以有多个。
77.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
会,finally语句块一定会执行。
78.常见的异常类有哪些?
省略……
八、网络
79.http 响应码 301 和 302 代表的是什么?有什么区别?
80.forward 和 redirect 的区别?
81.简述 tcp 和 udp的区别?
82.tcp 为什么要三次握手,两次不行吗?为什么?
83.说一下 tcp 粘包是怎么产生的?
84.OSI 的七层模型都有哪些?
85.get 和 post 请求有哪些区别?
86.如何实现跨域?
87.说一下 JSONP 实现原理?
九、设计模式
88.说一下你熟悉的设计模式?
89.简单工厂和抽象工厂有什么区别?
十、Spring/Spring MVC
90.为什么要使用 spring?
91.解释一下什么是 aop?
92.解释一下什么是 ioc?
93.spring 有哪些主要模块?
94.spring 常用的注入方式有哪些?
95.spring 中的 bean 是线程安全的吗?
96.spring 支持几种 bean 的作用域?
97.spring 自动装配 bean 有哪些方式?
98.spring 事务实现方式有哪些?
99.说一下 spring 的事务隔离?
100.说一下 spring mvc 运行流程?
101.spring mvc 有哪些组件?
102.@RequestMapping 的作用是什么?
103.@Autowired 的作用是什么?
十一、Spring Boot/Spring Cloud
104.什么是 spring boot?
105.为什么要用 spring boot?
106.spring boot 核心配置文件是什么?
107.spring boot 配置文件有哪几种类型?它们有什么区别?
108.spring boot 有哪些方式可以实现热部署?
109.jpa 和 hibernate 有什么区别?
110.什么是 spring cloud?
111.spring cloud 断路器的作用是什么?
112.spring cloud 的核心组件有哪些?
十二、Hibernate
113.为什么要使用 hibernate?
114.什么是 ORM 框架?
115.hibernate 中如何在控制台查看打印的 sql 语句?
116.hibernate 有几种查询方式?
117.hibernate 实体类可以被定义为 final 吗?
118.在 hibernate 中使用 Integer 和 int 做映射有什么区别?
119.hibernate 是如何工作的?
120.get()和 load()的区别?
121.说一下 hibernate 的缓存机制?
122.hibernate 对象有哪些状态?
123.在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
124.hibernate 实体类必须要有无参构造函数吗?为什么?
十三、Mybatis
125.mybatis 中 #{}和 ${}的区别是什么?
126.mybatis 有几种分页方式?
127.RowBounds 是一次性查询全部结果吗?为什么?
128.mybatis 逻辑分页和物理分页的区别是什么?
129.mybatis 是否支持延迟加载?延迟加载的原理是什么?
130.说一下 mybatis 的一级缓存和二级缓存?
https://www.cnblogs.com/yuluoxingkong/p/8205858.html
131.mybatis 和 hibernate 的区别有哪些?
132.mybatis 有哪些执行器(Executor)?
133.mybatis 分页插件的实现原理是什么?
134.mybatis 如何编写一个自定义插件?
十四、RabbitMQ
135.rabbitmq 的使用场景有哪些?
136.rabbitmq 有哪些重要的角色?
137.rabbitmq 有哪些重要的组件?
138.rabbitmq 中 vhost 的作用是什么?
139.rabbitmq 的消息是怎么发送的?
140.rabbitmq 怎么保证消息的稳定性?
141.rabbitmq 怎么避免消息丢失?
142.要保证消息持久化成功的条件有哪些?
143.rabbitmq 持久化有什么缺点?
144.rabbitmq 有几种广播类型?
145.rabbitmq 怎么实现延迟消息队列?
146.rabbitmq 集群有什么用?
147.rabbitmq 节点的类型有哪些?
148.rabbitmq 集群搭建需要注意哪些问题?
149.rabbitmq 每个节点是其他节点的完整拷贝吗?为什么?
150.rabbitmq 集群中唯一一个磁盘节点崩溃了会发生什么情况?
151.rabbitmq 对集群节点停止顺序有要求吗?
十五、Kafka
152.kafka 可以脱离 zookeeper 单独使用吗?为什么?
153.kafka 有几种数据保留的策略?
154.kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 kafka 将如何处理?
155.什么情况会导致 kafka 运行变慢?
156.使用 kafka 集群需要注意什么?
十六、Zookeeper
157.zookeeper 是什么?
158.zookeeper 都有哪些功能?
159.zookeeper 有几种部署模式?
160.zookeeper 怎么保证主从节点的状态同步?
161.集群中为什么要有主节点?
162.集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗?
163.说一下 zookeeper 的通知机制?
十七、MySql
164.数据库的三范式是什么?
165.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
166.如何获取当前数据库版本?
167.说一下 ACID 是什么?
168.char 和 varchar 的区别是什么?
169.float 和 double 的区别是什么?
170.mysql 的内连接、左连接、右连接有什么区别?
171.mysql 索引是怎么实现的?
172.怎么验证 mysql 的索引是否满足需求?
173.说一下数据库的事务隔离?
174.说一下 mysql 常用的引擎?
175.说一下 mysql 的行锁和表锁?
176.说一下乐观锁和悲观锁?
177.mysql 问题排查都有哪些手段?
178.如何做 mysql 的性能优化?
十八、Redis
179.redis 是什么?都有哪些使用场景?
180.redis 有哪些功能?
181.redis 和 memecache 有什么区别?
182.redis 为什么是单线程的?
183.什么是缓存穿透?怎么解决?
184.redis 支持的数据类型有哪些?
185.redis 支持的 java 客户端都有哪些?
186.jedis 和 redisson 有哪些区别?
187.怎么保证缓存和数据库数据的一致性?
188.redis 持久化有几种方式?
189.redis 怎么实现分布式锁?
190.redis 分布式锁有什么缺陷?
191.redis 如何做内存优化?
192.redis 淘汰策略有哪些?
193.redis 常见的性能问题有哪些?该如何解决?
十九、JVM
194.说一下 jvm 的主要组成部分?及其作用?
195.说一下 jvm 运行时数据区?
196.说一下堆栈的区别?
197.队列和栈是什么?有什么区别?
198.什么是双亲委派模型?
199.说一下类加载的执行过程?
200.怎么判断对象是否可以被回收?
201.java 中都有哪些引用类型?
202.说一下 jvm 有哪些垃圾回收算法?
203.说一下 jvm 有哪些垃圾回收器?
204.详细介绍一下 CMS 垃圾回收器?
205.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
206.简述分代垃圾回收器是怎么工作的?
207.说一下 jvm 调优的工具?
208.常用的 jvm 调优的参数都有哪些?

浙公网安备 33010602011771号