点击上方“全球Java架构师集中营”,选择“设为星标”

技术文章第一时间送达!

 

包含的模块:

本文分为十九个模块,分别是:Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM

640?wx_fmt=png

 

共包含 208 道面试题,本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单,下面一起进入主题吧。

 

一. Java 基础模块

1.JDK 和 JRE 有什么区别?

JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。

 

2.== 和 equals 的区别是什么?

== 解读:

基本类型:比较的是值是否相同;

 
  1. String x = "string";

  2. String y = "string";

  3. String z = new String("string");

  4. System.out.println(x==y); // true

  5. System.out.println(x==z); // false

  6. System.out.println(x.equals(y)); // true

  7. System.out.println(x.equals(z)); // true

代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。

 

equals 解读:

首先来看默认情况下 equals 比较一个有相同值的对象,代码如下:

 
  1. class Cat {

  2. public Cat(String name) {

  3. this.name = name;

  4. }

  5. private String name; 

  6. public String getName() {

  7. return name;

  8. public void setName(String name) {

  9. this.name = name;

  10. }

  11. }

  12. Cat c1 = new Cat("精彩猿笔记");

  13. Cat c2 = new Cat("精彩猿笔记");

  14. System.out.println(c1.equals(c2)); // false

输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:

 
  1. public boolean equals(Object obj) {

  2. return (this == obj);

  3. }

原来 equals 本质上就是 ==。

 
  1. String s1 = new String("精彩猿笔记");

  2. String s2 = new String("精彩猿笔记");

  3. System.out.println(s1.equals(s2)); // true

同样的,当我们进入 String 的 equals 方法,找到了答案,代码如下:

 
  1. public boolean equals(Object anObject) {

  2. if (this == anObject) {

  3. return true;

  4. }

  5. if (anObject instanceof String) {

  6. String anotherString = (String)anObject;

  7. int n = value.length;

  8. if (n == anotherString.value.length) {

  9. char v1[] = value;

  10. char v2[] = anotherString.value;

  11. int i = 0;

  12. while (n-- != 0) {

  13. if (v1[i] != v2[i])

  14. return false;

  15. i++;

  16. }

  17. return true;

  18. }

  19. }

  20. return false;

  21. }

 

 

3.两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

 
  1. String str1 = "精彩";

  2. String str2 = "笔记";

  3. System. out. println(String. format("str1:%d | str2:%d", str1. hashCode(),str2. hashCode()));

  4. System. out. println(str1. equals(str2));

执行的结果:

 

4.final 在 Java 中有什么作用?

final 修饰的类叫最终类,该类不能被继承。

5.Java 中的 Math. round(-1. 5) 等于多少?

 

6.String 属于基础的数据类型吗?

 

7.Java 中操作字符串都有哪些类?它们之间有什么区别?

StringBuffer和StringBuilder都继承自抽象类AbstractStringBuilder。

8.String str="i"与 String str=new String(“i”)一样吗?

 

9.如何将字符串反转?

 
  1. // StringBuffer reverse

  2. StringBuffer stringBuffer = new StringBuffer();

  3. stringBuffer. append("abcdefg");

  4. System. out. println(stringBuffer. reverse()); // gfedcba

  5. // StringBuilder reverse

  6. StringBuilder stringBuilder = new StringBuilder();

  7. stringBuilder. append("abcdefg");

  8. System. out. println(stringBuilder. reverse()); // gfedcba

 

10.String 类的常用方法都有那些?

indexOf():返回指定字符的索引。

11.抽象类必须要有抽象方法吗?

 
  1. abstract class Cat {

  2. public static void sayHi() {

  3. System. out. println("hi~");

  4. }

  5. }

上面代码,抽象类并没有抽象方法但完全可以正常运行。

 

12.普通类和抽象类有哪些区别?

普通类不能包含抽象方法,抽象类可以包含抽象方法。

13.抽象类能使用 final 修饰吗?

640?wx_fmt=png

 

14.接口和抽象类有什么区别?

实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。

 

15.Java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。16 位传输以字符为单位输入输出数据。

 

16.BIO、NIO、AIO 有什么区别?

BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。

 

17.Files的常用方法都有哪些?

Files. exists():检测文件路径是否存在。

 

二. Java 容器模块

18.Java 容器都有哪些?

Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:

 

Collection

       ArrayList

    Set

 

19.Collection 和 Collections 有什么区别?

Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如 List、Set 等。

20.List、Set、Map 之间的区别是什么?

640?wx_fmt=png

 

21. HashMap 和 Hashtable 有什么区别?

HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。

 

22.如何决定使用 HashMap 还是 TreeMap?

 

 

23.说一下 HashMap 的实现原理?

 

24.说一下 HashSet 的实现原理?

 

25.ArrayList 和 LinkedList 的区别是什么?

数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。

 

26.如何实现数组和 List 之间的转换?

数组转 List:使用 Arrays. asList(array) 进行转换。

 
  1. // list to array

  2. List<String> list = new ArrayList<String>();

  3. list. add("☞精◈彩◈猿◈笔◈记☜");

  4. list. add("的博客");

  5. list. toArray();

  6. // array to list

  7. String[] array = new String[]{"☞精◈彩◈猿◈笔◈记☜","的博客"};

  8. Arrays. asList(array);

 

27.ArrayList 和 Vector 的区别是什么?

线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。

 

Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。

29.在 Queue 中 poll()和 remove()有什么区别?

相同点:都是返回第一个元素,并在队列中删除返回的对象。

 
  1. Queue<String> queue = new LinkedList<String>();

  2. queue. offer("string"); // add

  3. System. out. println(queue. poll());

  4. System. out. println(queue. remove());

  5. System. out. println(queue. size());

 

30.哪些集合类是线程安全的?

 

31.迭代器 Iterator 是什么?

 

32.Iterator 怎么使用?有什么特点?

 
  1. List<String> list = new ArrayList<>();

  2. Iterator<String> it = list. iterator();

  3. while(it. hasNext()){

  4.   String obj = it. next();

  5.   System. out. println(obj);

  6. }

Iterator 的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。

 

33.Iterator 和 ListIterator 有什么区别?

Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。

34.怎么确保一个集合不能被修改?

 
  1. List<String> list = new ArrayList<>();

  2. list. add("x");

  3. Collection<String> clist = Collections. unmodifiableCollection(list);

  4. clist. add("y"); // 运行时此行报错

  5. System. out. println(list. size());

 

 

三. Java 多线程模块

35.并行和并发有什么区别?

并行:多个处理器或多核处理器同时处理多个任务。

640?wx_fmt=png

 

36.线程和进程的区别?

 

37.守护线程是什么?

 

38.多线程有几种实现方式?

 

  • 继承Thread类

  • 实现Runnable接口

  • 实现Callable接口通过FutureTask包装器来创建Thread线程

  • 通过线程池创建线程,使用线程池接口ExecutorService结合Callable、Future实现有返回结果的多线程。

 

 

39.说一下 Runnable和 Callable有什么区别?

 

40.线程有哪些状态?

初始(NEW):新创建了一个线程对象,但还没有调用start()方法。

41.sleep() 和 wait() 有什么区别?

类的不同:sleep() 来自 Thread,wait() 来自 Object。

42.notify()和 notifyAll()有什么区别?

 

43.线程的 run() 和 start() 有什么区别?

 

44.创建线程池有哪几种方式?

newSingleThreadExecutor():它的特点在于工作线程数目被限制为 1,操作一个无界的工作队列,所以它保证了所有任务的都是被顺序执行,最多会有一个任务处于活动状态,并且不允许使用者改动线程池实例,因此可以避免其改变线程数目;

45.线程池都有哪些状态?

RUNNING:这是最正常的状态,接受新的任务,处理等待队列中的任务。

46.线程池中 submit() 和 execute() 方法有什么区别?

execute():只能执行 Runnable 类型的任务。

 

47.在 Java 程序中怎么保证多线程的运行安全?

方法一:使用安全类,比如 Java. util. concurrent 下的类。

 
  1. Lock lock = new ReentrantLock();

  2. lock. lock();

  3. try {

  4.     System. out. println("获得锁");

  5. } catch (Exception e) {

  6.     // TODO: handle exception

  7. } finally {

  8.     System. out. println("释放锁");

  9.     lock. unlock();

  10. }

48.多线程中 synchronized 锁升级的原理是什么?

 

49.什么是死锁?

 

50.怎么防止死锁?

尽量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。

51.ThreadLocal 是什么?有哪些使用场景?

 

52.说一下 synchronized 底层实现原理?

 

53.synchronized 和 volatile 的区别是什么?

volatile 是变量修饰符;synchronized 是修饰类、方法、代码段。

54.synchronized 和 Lock 有什么区别?

synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。

55.synchronized 和 ReentrantLock 区别是什么?

ReentrantLock 使用起来比较灵活,但是必须有释放锁的配合动作;

56.说一下 atomic 的原理?

···

 

四. Java 反射模块

57.什么是反射?

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

 

58.什么是 Java 序列化?什么情况下需要序列化?

 

想把的内存中的对象状态保存到一个文件中或者数据库中时候;

59.动态代理是什么?有哪些应用?

 

60.怎么实现动态代理?

···

 

五. Java 对象拷贝模块

61.为什么要使用克隆?

克隆的对象可能包含一些已经修改过的属性,而 new 出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠克隆方法了。

 

62.如何实现对象克隆?

实现 Cloneable 接口并重写 Object 类中的 clone() 方法。

63.深拷贝和浅拷贝区别是什么?

浅拷贝:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。

 

六. Java Web模块

64.JSP 和 servlet 有什么区别?

JSP 是 servlet 技术的扩展,本质上就是 servlet 的简易方式。servlet 和 JSP 最主要的不同点在于,servlet 的应用逻辑是在 Java 文件中,并且完全从表示层中的 html 里分离开来,而 JSP 的情况是 Java 和 html 可以组合成一个扩展名为 JSP 的文件。JSP 侧重于视图,servlet 主要用于控制逻辑。

 

65.JSP 有哪些内置对象?作用分别是什么?

request:封装客户端的请求,其中包含来自 get 或 post 请求的参数;

66.说一下 JSP 的 4 种作用域?

page:代表与一个页面相关的对象和属性。

67.session 和 cookie 有什么区别?

存储位置不同:session 存储在服务器端;cookie 存储在浏览器端。

68.说一下 session 的工作原理?

 

69.如果客户端禁止 cookie 能实现 session 还能用吗?

 

70.spring mvc 和 struts 的区别是什么?

拦截级别:struts2 是类级别的拦截;spring mvc 是方法级别的拦截。

71.如何避免 SQL 注入?

 

72.什么是 XSS 攻击,如何避免?

 

73.什么是 CSRF 攻击,如何避免?

验证请求来源地址;

 

七. Java 异常模块

74.throw 和 throws 的区别?

throw:是真实抛出一个异常。

75.final、finally、finalize 有什么区别?

final:是修饰符,如果修饰类,此类不能被继承;如果修饰方法和变量,则表示此方法和此变量不能在被改变,只能使用。

76.try-catch-finally 中哪个部分可以省略?

 

77.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

 

78.常见的异常类有哪些?

NullPointerException 空指针异常

 

八. 网络模块

79.http 响应码 301 和 302 代表的是什么?有什么区别?

301:永久重定向;302:暂时重定向。

 

80.forward 和 redirect 的区别?

forward 是转发 和 redirect 是重定向:

81.简述 tcp 和 udp的区别?

tcp 面向连接,udp 面向非连接即发送数据前不需要建立链接;

82.tcp 为什么要三次握手,两次不行吗?为什么?

第一次握手:A给B打电话说,你可以听到我说话吗?

640?wx_fmt=png

如果采用两次握手,那么只要服务器发出确认数据包就会建立连接,但由于客户端此时并未响应服务器端的请求,那此时服务器端就会一直在等待客户端,这样服务器端就白白浪费了一定的资源。若采用三次握手,服务器端没有收到来自客户端的再此确认,则就会知道客户端并没有要求建立请求,就不会浪费服务器的资源。

 

83.说一下 tcp 粘包是怎么产生的?

发送端粘包:发送端需要等缓冲区满才发送出去,造成粘包;

 

物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。

85.get 和 post 请求有哪些区别?

get 请求会被浏览器主动缓存,而 post 不会。

86.如何实现跨域?

服务器端运行跨域 设置 CORS 等于 *;

87.说一下 JSONP 实现原理?

···

 

九. 设计模式模块

88.说一下你熟悉的设计模式?

单例模式:保证被创建一次,节省系统开销。

89.简单工厂和抽象工厂有什么区别?

简单工厂:用来生产同一等级结构中的任意产品,对于增加新的产品,无能为力。

 

十. Spring/Spring MVC模块

90.为什么要使用 spring?

spring 提供 ioc 技术,容器会帮你管理依赖的对象,从而不需要自己创建和管理依赖对象了,更轻松的实现了程序的解耦。

91.解释一下什么是 aop?

 

92.解释一下什么是 ioc?

 

93.spring 有哪些主要模块?

spring core:框架的最基础部分,提供 ioc 和依赖注入特性。

94.spring 常用的注入方式有哪些?

setter 属性注入

95.spring 中的 bean 是线程安全的吗?

有状态就是有数据存储功能。

96.spring 支持几种 bean 的作用域?

singleton:spring ioc 容器中只存在一个 bean 实例,bean 以单例模式存在,是系统默认值;

 

97.spring 自动装配 bean 有哪些方式?

no:默认值,表示没有自动装配,应使用显式 bean 引用进行装配。

98.spring 事务实现方式有哪些?

声明式事务:声明式事务也有两种实现方式,基于 xml 配置文件的方式和注解方式(在类上添加 @Transaction 注解)。

99.说一下 spring 的事务隔离?

ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就用什么;

 

100.说一下 spring mvc 运行流程?

spring mvc 先将请求发送给 DispatcherServlet。

101.spring mvc 有哪些组件?

前置控制器 DispatcherServlet。

102.@RequestMapping 的作用是什么?

 

103.@Autowired 的作用是什么?

···

 

十一. Spring Boot/Spring Cloud模块

104.什么是 spring boot?

spring boot 是为 spring 服务的,是用来简化新 spring 应用的初始搭建以及开发过程的。

 

105.为什么要用 spring boot?

配置简单

106.spring boot 核心配置文件是什么?

bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,且 boostrap 里面的属性不能被覆盖;

107.spring boot 配置文件有哪几种类型?它们有什么区别?

spring. RabbitMQ. port=5672

yml 配置如下:

 
  1. spring:

  2.     RabbitMQ:

  3.         port: 5672

 

 

108.spring boot 有哪些方式可以实现热部署?

使用 devtools 启动热部署,添加 devtools 库,在配置文件中把 spring. devtools. restart. enabled 设置为 true;

109.jpa 和 hibernate 有什么区别?

 

110.什么是 spring cloud?

 

111.spring cloud 断路器的作用是什么?

 

112.spring cloud 的核心组件有哪些?

Eureka:服务注册于发现。

 

十二. Hibernate模块

113.为什么要使用 hibernate?

hibernate 是对 jdbc 的封装,大大简化了数据访问层的繁琐的重复性代码。

114.什么是 ORM 框架?

 

115.hibernate 中如何在控制台查看打印的 SQL 语句?

 

116.hibernate 有几种查询方式?

 

117.hibernate 实体类可以被定义为 final 吗?

 

118.在 hibernate 中使用 Integer 和 int 做映射有什么区别?

 

119.hibernate 是如何工作的?

读取并解析配置文件。

120.get()和 load()的区别?

 

121.说一下 hibernate 的缓存机制?

 

122.hibernate 对象有哪些状态?

临时/瞬时状态:直接 new 出来的对象,该对象还没被持久化(没保存在数据库中),不受 Session 管理。

123.在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?

getCurrentSession 会绑定当前线程,而 openSession 则不会。

124.hibernate 实体类必须要有无参构造函数吗?为什么?

···

 

十三. MyBatis模块

125.MyBatis 中 #{}和 ${}的区别是什么?

#{}是预编译处理,${}是字符替换。在使用 #{}时,MyBatis 会将 SQL 中的 #{}替换成“?”,配合 PreparedStatement 的 set 方法赋值,这样可以有效的防止 SQL 注入,保证程序的运行安全。

 

126.MyBatis 有几种分页方式?

分页方式:逻辑分页和物理分页。

127.RowBounds 是一次性查询全部结果吗?为什么?

128.MyBatis 逻辑分页和物理分页的区别是什么?

逻辑分页是一次性查询很多数据,然后再在结果中检索分页的数据。这样做弊端是需要消耗大量的内存、有内存溢出的风险、对数据库压力较大。

129.MyBatis 是否支持延迟加载?延迟加载的原理是什么?

 

130.说一下 MyBatis 的一级缓存和二级缓存?

一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,它的声明周期是和 SQLSession 一致的,有多个 SQLSession 或者分布式的环境中数据库操作,可能会出现脏数据。当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认一级缓存是开启的。

 

131.MyBatis 和 hibernate 的区别有哪些?

灵活性:MyBatis 更加灵活,自己可以写 SQL 语句,使用起来比较方便。

132.MyBatis 有哪些执行器(Executor)?

SimpleExecutor:每执行一次 update 或 select 就开启一个 Statement 对象,用完立刻关闭 Statement 对象;

133.MyBatis 分页插件的实现原理是什么?

 

134.MyBatis 如何编写一个自定义插件?

自定义插件实现原理:

MyBatis 自定义插件针对 MyBatis 四大对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)进行拦截:

 
  1. public interface Interceptor {   

  2.    Object intercept(Invocation invocation) throws Throwable;       

  3.    Object plugin(Object target);    

  4.    void setProperties(Properties properties);

  5. }

setProperties 方法是在 MyBatis 进行配置插件的时候可以配置自定义相关属性,即:接口实现对象的参数配置;

 
  1. @Intercepts({@Signature(type = Executor. class, method = "query",

  2.         args = {MappedStatement. class, Object. class, RowBounds. class, ResultHandler. class})})

  3. public class TestInterceptor implements Interceptor {

  4.    public Object intercept(Invocation invocation) throws Throwable {

  5.      Object target = invocation. getTarget(); //被代理对象

  6.      Method method = invocation. getMethod(); //代理方法

  7.      Object[] args = invocation. getArgs(); //方法参数

  8.      // do something . . . . . .  方法拦截前执行代码块

  9.      Object result = invocation. proceed();

  10.      // do something . . . . . . . 方法拦截后执行代码块

  11.      return result;

  12.    }

  13.    public Object plugin(Object target) {

  14.      return Plugin. wrap(target, this);

  15.    }

  16. }

 

 

十四. RabbitMQ模块

135.RabbitMQ 的使用场景有哪些?

抢购活动,削峰填谷,防止系统崩塌。

136.RabbitMQ 有哪些重要的角色?

生产者:消息的创建者,负责创建和推送数据到消息服务器;

137.RabbitMQ 有哪些重要的组件?

Channel(信道):消息推送使用的通道。

138.RabbitMQ 中 vhost 的作用是什么?

 

139.RabbitMQ 的消息是怎么发送的?

 

140.RabbitMQ 怎么保证消息的稳定性?

提供了事务的功能。

141.RabbitMQ 怎么避免消息丢失?

把消息持久化磁盘,保证服务器重启消息不丢失。

142.要保证消息持久化成功的条件有哪些?

声明队列必须设置持久化 durable 设置为 true.

 

143.RabbitMQ 持久化有什么缺点?

 

144.RabbitMQ 有几种广播类型?

direct(默认方式):最基础最简单的模式,发送方把消息发送给订阅方,如果有多个订阅者,默认采取轮询的方式进行消息发送。

145.RabbitMQ 怎么实现延迟消息队列?

通过消息过期后进入死信交换器,再由交换器转发到延迟消费队列,实现延迟功能;

146.RabbitMQ 集群有什么用?

高可用:某个服务器出现问题,整个 RabbitMQ 还可以继续使用;

147.RabbitMQ 节点的类型有哪些?

磁盘节点:消息会存储到磁盘。

148.RabbitMQ 集群搭建需要注意哪些问题?

各节点之间使用“–link”连接,此属性不能忽略。

149.RabbitMQ 每个节点是其他节点的完整拷贝吗?为什么?

存储空间的考虑:如果每个节点都拥有所有队列的完全拷贝,这样新增节点不但没有新增存储空间,反而增加了更多的冗余数据;

150.RabbitMQ 集群中唯一一个磁盘节点崩溃了会发生什么情况?

不能创建队列

 

151.RabbitMQ 对集群节点停止顺序有要求吗?

···

 

十五. Kafka

152.kafka 可以脱离 zookeeper 单独使用吗?为什么?

kafka 不能脱离 zookeeper 单独使用,因为 kafka 使用 zookeeper 管理和协调 kafka 的节点服务器。

 

153.kafka 有几种数据保留的策略?

 

154.kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 kafka 将如何处理?

 

155.什么情况会导致 kafka 运行变慢?

cpu 性能瓶颈

156.使用 kafka 集群需要注意什么?

···

 

十六. Zookeeper模块

157.zookeeper 是什么?

zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 google chubby 的开源实现,是 hadoop 和 hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

 

158.zookeeper 都有哪些功能?

集群管理:监控节点存活状态、运行请求等。

159.zookeeper 有几种部署模式?

单机部署:一台集群上运行;

160.zookeeper 怎么保证主从节点的状态同步?

 

161.集群中为什么要有主节点?

 

162.集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗?

 

163.说一下 zookeeper 的通知机制?

···

 

十七. MySQL模块

164.数据库的三范式是什么?

第一范式(1NF):强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。

165.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几?

表类型如果是 MyISAM ,那 id 就是 8。

 

166.如何获取当前数据库版本?

 

167.说一下 ACID 是什么?

Atomicity(原子性):一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。

168.char 和 varchar 的区别是什么?

char(n) :固定长度类型,比如订阅 char(10),当你输入"abc"三个字符的时候,它们占的空间还是 10 个字节,其他 7 个是空字节。

varchar(n) :可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。

 

169.float 和 double 的区别是什么?

float 最多可以存储 8 位的十进制数,并在内存中占 4 字节。

170.MySQL 的内连接、左连接、右连接有什么区别?

 

171.MySQL 索引是怎么实现的?

 

172.怎么验证 MySQL 的索引是否满足需求?

 

173.说一下数据库的事务隔离?

transaction-isolation = REPEATABLE-READ

可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。

READ-UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)。

 

174.说一下 MySQL 常用的引擎?

InnoDB 引擎:InnoDB 引擎提供了对数据库 acid 事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count(*) from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。

175.说一下 MySQL 的行锁和表锁?

表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。

176.说一下乐观锁和悲观锁?

乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。

 

177.MySQL 问题排查都有哪些手段?

使用 show processlist 命令查看当前所有连接信息。

178.如何做 MySQL 的性能优化?

为搜索字段创建索引。

 

十八. Redis模块

179.Redis 是什么?都有哪些使用场景?

Redis 是一个使用 C 语言开发的高速缓存数据库。

记录帖子点赞数、点击数、评论数;

180.Redis 有哪些功能?

数据缓存功能

181.Redis 和 memcache 有什么区别?

存储方式不同:memcache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小;Redis 有部份存在硬盘上,这样能保证数据的持久性。

182.Redis 为什么是单线程的?

 

183.什么是缓存穿透?怎么解决?

缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

184.Redis 支持的数据类型有哪些?

 

185.Redis 支持的 Java 客户端都有哪些?

 

186.jedis 和 Redisson 有哪些区别?

jedis:提供了比较全面的 Redis 命令的支持。

187.怎么保证缓存和数据库数据的一致性?

合理设置缓存的过期时间。

188.Redis 持久化有几种方式?

RDB(Redis Database):指定的时间间隔能对你的数据进行快照存储。

189.Redis 怎么实现分布式锁?

 

190.Redis 分布式锁有什么缺陷?

 

191.Redis 如何做内存优化?

 

192.Redis 淘汰策略有哪些?

volatile-lru:从已设置过期时间的数据集(server. db[i]. expires)中挑选最近最少使用的数据淘汰。

193.Redis 常见的性能问题有哪些?该如何解决?

···

 

十九. JVM模块

194.说一下 JVM 的主要组成部分?及其作用?

类加载器(ClassLoader)

 

195.说一下 JVM 运行时数据区?

程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;

196.说一下堆栈的区别?

功能方面:堆是用来存放对象的,栈是用来执行程序的。

197.队列和栈是什么?有什么区别?

队列和栈都是被用来预存储数据的。

198.什么是双亲委派模型?

启动类加载器(Bootstrap ClassLoader),是虚拟机自身的一部分,用来加载Java_HOME/lib/目录中的,或者被 -Xbootclasspath 参数所指定的路径中并且被虚拟机识别的类库;

 

199.说一下类装载的执行过程?

加载:根据查找路径找到相应的 class 文件然后导入;

200.怎么判断对象是否可以被回收?

引用计数器:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题;

201.Java 中都有哪些引用类型?

强引用:发生 gc 的时候不会被回收。

202.说一下 JVM 有哪些垃圾回收算法?

标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。

203.说一下 JVM 有哪些垃圾回收器?

Serial:最早的单线程串行垃圾回收器。

204.详细介绍一下 CMS 垃圾回收器?

 

205.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

新生代回收器:Serial、ParNew、Parallel Scavenge

 

206.简述分代垃圾回收器是怎么工作的?

把 Eden + From Survivor 存活的对象放入 To Survivor 区;

 

207.说一下 JVM 调优的工具?

jconsole:用于对 JVM 中的内存、线程和类等进行监控;

208.常用的 JVM 调优的参数都有哪些?

-Xms2g:初始化推大小为 2g;

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐