# Java
# 1. Java 基础
# 1.1 关键字
static
: 静态变量与静态方法,静态代码块。final
: 常量、不可继承的类、不可重写的方法。abstract
: 抽象类与抽象方法。synchronized
: 用于实现同步的关键字,方法与代码块级别。volatile
: 保证变量的可见性与有序性。
# 1.2 面向对象编程(OOP)
- 封装:通过访问修饰符(
private
、protected
、public
、default
)来控制类的成员变量和方法的访问范围,隐藏实现细节。 - 继承:
extends
关键字,单继承与多态性。 - 多态:方法重载(编译时多态)与重写(运行时多态)。
- 抽象类与接口:区别与适用场景;Java 8 中接口的默认方法与静态方法。
# 1.3 重载与重写
- 方法重载:同类中方法名相同,但参数不同。
- 方法重写:子类重写父类方法,注意重写时的限制条件(如返回类型、访问修饰符)。
# 1.4 内存模型
- 堆和栈:对象存储在堆中,方法调用和局部变量存储在栈中。
- 方法区:用于存储已加载类的元数据、常量池等。
- 栈内存溢出与堆内存溢出:典型场景及解决办法。
# 1.5 对象与类
- 对象的创建过程:通过构造函数创建对象,类加载和对象初始化。
- 构造函数:默认构造函数、带参构造函数、构造函数重载。
- 静态代码块与实例代码块:初始化顺序的区别。
# 2. 常用类与 API
# 2.1 String
、StringBuilder
、StringBuffer
String
: 不可变对象的设计,每次修改都会创建新的对象。常见方法(substring
、indexOf
、split
等)。StringBuilder
vsStringBuffer
:StringBuilder
非线程安全,性能优于StringBuffer
,StringBuffer
线程安全。
# 2.2 包装类与基本数据类型
- 包装类:
Integer
、Double
等类用于将基本数据类型转换为对象类型。 - 自动装箱与拆箱:Java 自动将基本类型转换为对应的包装类对象(装箱),或从包装类转换回基本类型(拆箱)。
- 包装类的常见方法(如
Integer.parseInt
、Double.valueOf
)。
# 2.3 BigDecimal
- 用于精确的浮点数计算,避免
float
和double
在高精度计算中的误差。
# 2.4 日期与时间
- Java 8 中的
LocalDate
、LocalDateTime
:替代过时的Date
和Calendar
,提供更清晰和线程安全的时间日期操作。 - Java 8 中的
Instant
、Duration
、Period
类的使用。
# 3. 集合框架(Java Collections Framework)
# 3.1 集合接口
List
:ArrayList
:基于数组,查询速度快,但插入和删除效率低。LinkedList
:基于双向链表,插入和删除效率高,但查询速度较慢。
Set
:HashSet
:基于HashMap
实现,元素无序,不允许重复。TreeSet
:基于红黑树实现,元素有序,不允许重复。
Map
:HashMap
:基于哈希表实现,允许null
键和值,线程不安全。TreeMap
:基于红黑树实现,键有序,不允许null
键,线程不安全。LinkedHashMap
:HashMap
的子类,按插入顺序或访问顺序保存元素。
Queue
:LinkedList
:作为队列实现时,支持 FIFO(先进先出)操作。PriorityQueue
:元素按优先级排序的队列。
# 3.2 集合框架的底层实现
HashMap
:基于数组和链表(Java 8 以后引入红黑树)实现,当链表长度超过一定阈值时转为红黑树以提高效率。ArrayList
vsLinkedList
:ArrayList
:基于动态数组,适合随机访问,增删效率低。LinkedList
:基于双向链表,适合频繁插入和删除操作,随机访问效率低。
# 3.3 集合的遍历方式
Iterator
:通过hasNext()
和next()
方法遍历集合,支持fail-fast
机制,检测并发修改。- 增强
for
循环:简化遍历代码,更具可读性,但不能修改集合元素。
# 4. 异常处理
# 4.1 异常分类
Checked Exception
(检查异常):如IOException
、SQLException
,编译时必须处理。Unchecked Exception
(非检查异常):如NullPointerException
、ArrayIndexOutOfBoundsException
。
# 4.2 自定义异常
- 通过继承
Exception
(检查异常)或RuntimeException
(非检查异常)实现自定义异常。
# 4.3 异常处理机制
try-catch-finally
:捕获并处理异常,finally
中的代码无论是否有异常都会执行。throws
:用于方法声明,表示该方法可能抛出某些异常。
# 5. 多线程与并发
# 5.1 线程基础
- 创建线程的方式:
- 继承
Thread
类并重写run()
方法。 - 实现
Runnable
接口,并将其传递给Thread
实例。 - 使用
Callable
接口与Future
获取异步计算结果。
- 继承
# 5.2 线程同步
synchronized
:用于锁定代码块或方法,保证同一时刻只有一个线程可以访问同步块。wait()
、notify()
、notifyAll()
:用于线程间通信,wait()
使线程等待,notify()
唤醒一个等待的线程,notifyAll()
唤醒所有等待的线程。
# 5.3 高级并发工具
ReentrantLock
:比synchronized
更灵活的锁机制,支持公平锁和非公平锁。volatile
:用于保证变量的可见性,即当一个线程修改变量时,其他线程能够立即看到。
# 5.4 线程池
- 使用
ExecutorService
创建和管理线程池。 - 线程池的核心参数:核心线程数、最大线程数、队列长度、拒绝策略。
# 6. 内存模型与垃圾回收
# 6.1 JVM 内存模型
- 堆:存储所有对象实例,分为年轻代和老年代。
- 栈:存储方法调用和局部变量。
- 方法区:存储类的结构、常量池、静态变量和方法代码。
# 6.2 垃圾回收机制
- 标记-清除算法:标记出不再使用的对象并清除。
- 复制算法:将存活的对象复制到新区域,清除原区域。
- 标记-整理算法:标记出存活的对象并将其压缩到内存的一端。
# 6.3 常见垃圾回收器
- Serial GC:单线程垃圾回收,适合小型应用。
- Parallel GC:多线程垃圾回收,适合高吞吐量应用。
- CMS GC:并发标记清除,减少停顿时间。
- G1 GC:将堆分成多个区域,以避免全堆扫描,适用于大内存应用。
# 6.4 类加载机制
- 双亲委派模型:类加载器按层级委派加载类,防止重复加载类。
# 7. 泛型与反射
# 7.1 泛型
- 泛型类与泛型方法:通过
<T>
来声明泛型,使得代码更加通用。 - 通配符:
? extends
:表示类型的上界,可以接收该类或其子类。? super
:表示类型的下界,可以接收该类或其父类。
# 7.2 反射机制
Class
对象:每个类在运行时都有一个Class
对象,可以通过该对象获取类的信息。Method
、Field
:反射允许在运行时访问类的方法和属性。- 反射的应用:常用于框架实现,如 Spring 中的依赖注入。
# 8. Java 8 新特性
# 8.1 Lambda 表达式
- 使用
()->{}
语法简化匿名类实现,减少样板代码,尤其适用于函数式编程场景。
# 8.2 Stream API
filter
、map
、reduce
、collect
:用于对集合进行高效的链式操作。- 并行流:通过
parallelStream()
来并行处理数据。
# 8.3 Optional
类
- 通过
Optional
避免NullPointerException
,提供orElse()
等方法处理空值。
# 8.4 方法引用
- 使用
::
来引用已有方法,简化 Lambda 表达式的使用。