Java 面试题目和答案
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 种基本数据类型:
byte
、short
、int
、long
、float
、double
、char
、boolean
。 - 对应的包装类分别是:
Byte
、Short
、Integer
、Long
、Float
、Double
、Character
、Boolean
。
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
(如ArrayList
和LinkedList
)、Set
(如HashSet
)、Map
(如HashMap
)。
2. Java 集合框架
1. List 的接口和实现类及区别
List
接口表示有序的集合,允许重复元素。- 常用的实现类:
ArrayList
(基于数组,查询快)、LinkedList
(基于链表,增删快)。
2. TreeMap 的底层原理及是否可以存储 null
- TreeMap 是基于红黑树的实现,默认不允许
null
作为键,但可以存null
作为值。
3. Java 集合框架中的线程安全类
- 线程安全的集合有
Vector
、Hashtable
、ConcurrentHashMap
、Collections.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
(每次获取创建新实例)、request
、session
等。
5. 数据库
1. MySQL 索引、存储引擎和事务
- 索引 用于加速查询,如 B+ 树索引和哈希索引。
- 存储引擎:如
InnoDB
(支持事务)、MyISAM
(不支持事务)。 - 事务:用于保持数据一致性,四大特性是 ACID(原子性、一致性、隔离性、持久性)。
2. Redis 集群,哨兵,持久化,哈希槽
- Redis 集群 用于分布式环境下的数据存储。
- 哨兵 用于监控 Redis 实例,提供高可用性。
- 持久化:RDB 和 AOF 两种方式。
- 哈希槽:Redis 集群使用哈希槽将数据分布到不同节点。
3. 什么场景下使用 Redis
- 用于缓存、消息队列和分布式锁等场景。
4. Redis 内存淘汰策略及过程
- 内存淘汰策略:如
LRU
、LFU
、Random
等。
6. 网络与安全
1. HTTPS 通信过程
- 客户端向服务器请求 SSL 证书,服务器返回证书,双方交换密钥并建立加密连接。
2. 安全的加密算法
- 对称加密:如 AES。
- 非对称加密:如 RSA。
- 散列算法:如 SHA-256。
3. 国密算法
- 国密算法包括 SM1(对称加密)、SM2(非对称加密)、SM3(哈希)、SM4(对称加密)。
7. Kubernetes 和分布式系统
1. K8s 组件有哪些
- 主要组件包括:API Server、etcd、Controller Manager、Scheduler、Kubelet、Kube-proxy。
2. Redis 分布式锁
- 可以通过 Redis 实现分布式锁,利用
SET NX
和EXPIRE
命令。
3. Vert.x 响应式编程如何解决阻塞问题
- Vert.x 采用 事件循环模型,基于异步编程处理请求,避免阻塞。
8. 其他
1. Final 关键字的作用
- final 关键字用于声明常量、方法和类。
- 修饰变量:表示该变量的值不可更改。
- 修饰方法:表示该方法不能被子类重写。
- 修饰类:表示该类不能被继承。
2. 进程和线程的联系与区别
- 进程是操作系统中程序运行的基本单位,每个进程都有自己独立的内存空间。
- 线程是进程中的一个执行单元,一个进程可以包含多个线程,多个线程共享进程的内存空间。
- 区别:进程更独立,进程之间相互隔离;线程更轻量,共享数据,适合多任务并发处理。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 哈士奇本奇的小屋!