Java 面试题目和答案

1. Java 基础

1. JDK 和 JRE 的区别

  • JDK (Java Development Kit) 是 Java 的开发工具包,包含了编译器、JRE 以及开发调试 Java 应用程序所需的工具。
  • JRE (Java Runtime Environment) 是 Java 运行时环境,包含了 Java 虚拟机(JVM)和标准类库,只用于运行 Java 程序。

2. Java 的 char 类型是否可以存储汉字,原因是什么?

  • 可以。Java 中的 char 类型占用两个字节,使用 Unicode 编码,因此可以表示任何语言的字符,包括汉字。

3. Java 基本数据类型和包装类

  • Java 共有 8 种基本数据类型:byteshortintlongfloatdoublecharboolean
  • 对应的包装类分别是:ByteShortIntegerLongFloatDoubleCharacterBoolean

4. 进程和线程的联系

  • 进程是程序执行的基本单位,每个进程有独立的内存空间。
  • 线程是进程的一个子任务,多个线程共享同一个进程的内存空间,线程更轻量级。

5. 多线程的应用场景

  • 用于提升性能的场景,如处理大数据、实时游戏开发、Web 服务器处理并发请求等。

6. sleep 和 wait 的区别

  • sleep() 属于 Thread 类,wait() 属于 Object 类。
  • sleep() 不会释放锁,而 wait() 会释放锁以供其他线程使用。

7. volatile 的原理

  • volatile 关键字确保变量的可见性。每次线程读取 volatile 变量时,都会从主内存中读取最新值,而不是从缓存中读取。

8. 可重入锁

  • 可重入锁 (ReentrantLock) 允许一个线程多次获得同一个锁,避免出现死锁。

9. Java 多线程的 CyclicBarrier

  • CyclicBarrier 是一个同步屏障,允许一组线程互相等待,直到所有线程都到达屏障点。

10. 重载和重写的区别

  • **重载 (Overloading)**:同一类中有多个同名方法,但参数不同。
  • **重写 (Overriding)**:子类对父类的已有方法进行重新定义。

11. 抽象类和接口的区别

  • 抽象类可以有方法的实现,也可以有成员变量。
  • 接口只能包含抽象方法和常量,Java 8 之后允许包含默认方法和静态方法。

12. TCP 和 UDP 的区别

  • TCP 是面向连接的协议,提供可靠的数据传输。
  • UDP 是无连接的协议,传输速度快但不保证可靠性。

13. 常用 Collection

  • 常用的集合类有:List(如 ArrayListLinkedList)、Set(如 HashSet)、Map(如 HashMap)。

2. Java 集合框架

1. List 的接口和实现类及区别

  • List 接口表示有序的集合,允许重复元素。
  • 常用的实现类:ArrayList(基于数组,查询快)、LinkedList(基于链表,增删快)。

2. TreeMap 的底层原理及是否可以存储 null

  • TreeMap 是基于红黑树的实现,默认不允许 null 作为键,但可以存 null 作为值。

3. Java 集合框架中的线程安全类

  • 线程安全的集合有 VectorHashtableConcurrentHashMapCollections.synchronizedList()

4. left join 和 join 的区别

  • left join 会返回左表所有记录及匹配的右表记录,没有匹配则右表部分为 null
  • inner join 只返回两张表中都存在匹配的记录。

3. 并发与多线程

1. 如何解决 SpringBoot 中的循环依赖问题

  • 使用 三级缓存 进行 Bean 的提前曝光,Spring 的 ObjectFactory 实现对象的循环引用处理。

4. Spring 生态系统

1. Spring Boot 和 Spring 的联系

  • Spring Boot 是基于 Spring 的简化配置框架,目的是让 Spring 应用程序开发更简单和高效。

2. Spring Cloud 和 Spring Boot 的联系

  • Spring Cloud 基于 Spring Boot,用于构建分布式系统和微服务架构。

3. Spring Boot 和 Spring MVC 的区别

  • Spring Boot 是 Spring 的增强,提供了默认配置和简化开发工具。
  • Spring MVC 是 Spring 的 Web 模块,用于构建 Web 应用。

4. IOC 注入方式和注入流程

  • 注入方式有:构造函数注入Setter 方法注入字段注入
  • 注入流程:Spring 创建 Bean 对象并处理依赖关系,再注入属性。

5. 怎么注入 Bean

  • 使用 @Autowired@Resource 或 XML 配置注入。

6. Bean 的生命周期和作用域

  • 生命周期:实例化、属性赋值、初始化、使用、销毁。
  • 作用域singleton(单例)、prototype(每次获取创建新实例)、requestsession 等。

5. 数据库

1. MySQL 索引、存储引擎和事务

  • 索引 用于加速查询,如 B+ 树索引和哈希索引。
  • 存储引擎:如 InnoDB(支持事务)、MyISAM(不支持事务)。
  • 事务:用于保持数据一致性,四大特性是 ACID(原子性、一致性、隔离性、持久性)。

2. Redis 集群,哨兵,持久化,哈希槽

  • Redis 集群 用于分布式环境下的数据存储。
  • 哨兵 用于监控 Redis 实例,提供高可用性。
  • 持久化:RDB 和 AOF 两种方式。
  • 哈希槽:Redis 集群使用哈希槽将数据分布到不同节点。

3. 什么场景下使用 Redis

  • 用于缓存、消息队列和分布式锁等场景。

4. Redis 内存淘汰策略及过程

  • 内存淘汰策略:如 LRULFURandom 等。

6. 网络与安全

1. HTTPS 通信过程

  • 客户端向服务器请求 SSL 证书,服务器返回证书,双方交换密钥并建立加密连接。

2. 安全的加密算法

  • 对称加密:如 AES。
  • 非对称加密:如 RSA。
  • 散列算法:如 SHA-256。

3. 国密算法

  • 国密算法包括 SM1(对称加密)、SM2(非对称加密)、SM3(哈希)、SM4(对称加密)。

7. Kubernetes 和分布式系统

1. K8s 组件有哪些

  • 主要组件包括:API ServeretcdController ManagerSchedulerKubeletKube-proxy

2. Redis 分布式锁

  • 可以通过 Redis 实现分布式锁,利用 SET NXEXPIRE 命令。

3. Vert.x 响应式编程如何解决阻塞问题

  • Vert.x 采用 事件循环模型,基于异步编程处理请求,避免阻塞。

8. 其他

1. Final 关键字的作用

  • final 关键字用于声明常量、方法和类。
    • 修饰变量:表示该变量的值不可更改。
    • 修饰方法:表示该方法不能被子类重写。
    • 修饰类:表示该类不能被继承。

2. 进程和线程的联系与区别

  • 进程是操作系统中程序运行的基本单位,每个进程都有自己独立的内存空间。
  • 线程是进程中的一个执行单元,一个进程可以包含多个线程,多个线程共享进程的内存空间。
  • 区别:进程更独立,进程之间相互隔离;线程更轻量,共享数据,适合多任务并发处理。