java 面试题整理
Java基础
1. ==和equals()的区别
==比较两个对象的引用是否指向同一个内存地址(基本数据类型比较值)equals()是Object类的方法,默认实现与==相同,但通常被重写用于比较对象的内容
2. String、StringBuilder和StringBuffer的区别
- String:不可变字符序列,线程安全
- StringBuilder:可变字符序列,非线程安全,性能高
- StringBuffer:可变字符序列,线程安全(方法加synchronized),性能稍低
3. final关键字的作用
- final变量:常量,只能赋值一次
- final方法:不能被子类重写
- final类:不能被继承
4. 面向对象的三大特性
- 封装:隐藏内部实现,提供公共访问方式
- 继承:子类继承父类特征和行为
- 多态:同一操作作用于不同对象,产生不同结果
5. 抽象类和接口的区别
| 特性 | 抽象类 | 接口 |
|---|---|---|
| 方法 | 可以有具体方法 | Java8前只能是抽象方法 |
| 变量 | 无限制 | 默认public static final |
| 实现 | 单继承 | 多实现 |
| 构造器 | 可以有 | 不能有 |
| 设计目的 | 代码复用 | 定义规范 |
6. 重载(Overload)和重写(Override)的区别
- 重载:同一类中,方法名相同但参数不同(类型、数量、顺序)
- 重写:子类中,方法名、参数列表与父类相同,覆盖父类实现
7. ArrayList和LinkedList的区别
| 特性 | ArrayList | LinkedList |
|---|---|---|
| 底层 | 动态数组 | 双向链表 |
| 随机访问 | O(1) | O(n) |
| 插入删除 | O(n) | O(1) |
| 空间 | 预留空间 | 每个元素额外空间 |
8. HashMap的工作原理
- 基于哈希表实现,使用数组+链表+红黑树(JDK8)
- 通过key的hashCode计算数组下标
- 解决哈希冲突:链表法,当链表长度>8时转为红黑树
- 扩容机制:默认负载因子0.75,扩容为原容量2倍
9. 创建线程的几种方式
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口(可返回结果)
- 使用线程池(Executor框架)
10. volatile关键字的作用
- 保证变量的可见性:一个线程修改后立即对其他线程可见
- 禁止指令重排序:防止JVM优化导致执行顺序改变
- 不保证原子性(如i++操作仍需同步)
JVM
1. Java内存区域划分
- 程序计数器:线程私有,当前线程执行的字节码行号
- 虚拟机栈:线程私有,存储栈帧(局部变量表、操作数栈等)
- 本地方法栈:为Native方法服务
- 堆:线程共享,存放对象实例
- 方法区:线程共享,存储类信息、常量、静态变量等
2. 垃圾回收算法有哪些
- 标记-清除:标记无用对象后清除,会产生内存碎片
- 复制算法:将内存分为两块,存活对象复制到另一块
- 标记-整理:标记后让存活对象向一端移动
- 分代收集:新生代(复制算法)、老年代(标记-清除/整理)
3. 类加载过程
- 加载:获取类的二进制字节流
- 验证:确保Class文件符合规范
- 准备:为静态变量分配内存并设置默认值
- 解析:将符号引用转为直接引用
- 初始化:执行类构造器
<clinit>()方法
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自有木兮丶