# Java

# 1. Java 基础

# 1.1 关键字

  • static: 静态变量与静态方法,静态代码块。
  • final: 常量、不可继承的类、不可重写的方法。
  • abstract: 抽象类与抽象方法。
  • synchronized: 用于实现同步的关键字,方法与代码块级别。
  • volatile: 保证变量的可见性与有序性。

# 1.2 面向对象编程(OOP)

  • 封装:通过访问修饰符(privateprotectedpublicdefault)来控制类的成员变量和方法的访问范围,隐藏实现细节。
  • 继承extends 关键字,单继承与多态性。
  • 多态:方法重载(编译时多态)与重写(运行时多态)。
  • 抽象类与接口:区别与适用场景;Java 8 中接口的默认方法与静态方法。

# 1.3 重载与重写

  • 方法重载:同类中方法名相同,但参数不同。
  • 方法重写:子类重写父类方法,注意重写时的限制条件(如返回类型、访问修饰符)。

# 1.4 内存模型

  • 堆和栈:对象存储在堆中,方法调用和局部变量存储在栈中。
  • 方法区:用于存储已加载类的元数据、常量池等。
  • 栈内存溢出与堆内存溢出:典型场景及解决办法。

# 1.5 对象与类

  • 对象的创建过程:通过构造函数创建对象,类加载和对象初始化。
  • 构造函数:默认构造函数、带参构造函数、构造函数重载。
  • 静态代码块与实例代码块:初始化顺序的区别。

# 2. 常用类与 API

# 2.1 StringStringBuilderStringBuffer

  • String: 不可变对象的设计,每次修改都会创建新的对象。常见方法(substringindexOfsplit 等)。
  • StringBuilder vs StringBuffer: StringBuilder 非线程安全,性能优于 StringBufferStringBuffer 线程安全。

# 2.2 包装类与基本数据类型

  • 包装类IntegerDouble 等类用于将基本数据类型转换为对象类型。
  • 自动装箱与拆箱:Java 自动将基本类型转换为对应的包装类对象(装箱),或从包装类转换回基本类型(拆箱)。
  • 包装类的常见方法(如 Integer.parseIntDouble.valueOf)。

# 2.3 BigDecimal

  • 用于精确的浮点数计算,避免 floatdouble 在高精度计算中的误差。

# 2.4 日期与时间

  • Java 8 中的 LocalDateLocalDateTime:替代过时的 DateCalendar,提供更清晰和线程安全的时间日期操作。
  • Java 8 中的 InstantDurationPeriod 类的使用。

# 3. 集合框架(Java Collections Framework)

# 3.1 集合接口

  • List
    • ArrayList:基于数组,查询速度快,但插入和删除效率低。
    • LinkedList:基于双向链表,插入和删除效率高,但查询速度较慢。
  • Set
    • HashSet:基于 HashMap 实现,元素无序,不允许重复。
    • TreeSet:基于红黑树实现,元素有序,不允许重复。
  • Map
    • HashMap:基于哈希表实现,允许 null 键和值,线程不安全。
    • TreeMap:基于红黑树实现,键有序,不允许 null 键,线程不安全。
    • LinkedHashMapHashMap 的子类,按插入顺序或访问顺序保存元素。
  • Queue
    • LinkedList:作为队列实现时,支持 FIFO(先进先出)操作。
    • PriorityQueue:元素按优先级排序的队列。

# 3.2 集合框架的底层实现

  • HashMap:基于数组和链表(Java 8 以后引入红黑树)实现,当链表长度超过一定阈值时转为红黑树以提高效率。
  • ArrayList vs LinkedList
    • ArrayList:基于动态数组,适合随机访问,增删效率低。
    • LinkedList:基于双向链表,适合频繁插入和删除操作,随机访问效率低。

# 3.3 集合的遍历方式

  • Iterator:通过 hasNext()next() 方法遍历集合,支持 fail-fast 机制,检测并发修改。
  • 增强 for 循环:简化遍历代码,更具可读性,但不能修改集合元素。

# 4. 异常处理

# 4.1 异常分类

  • Checked Exception(检查异常):如 IOExceptionSQLException,编译时必须处理。
  • Unchecked Exception(非检查异常):如 NullPointerExceptionArrayIndexOutOfBoundsException

# 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 对象,可以通过该对象获取类的信息。
  • MethodField:反射允许在运行时访问类的方法和属性。
  • 反射的应用:常用于框架实现,如 Spring 中的依赖注入。

# 8. Java 8 新特性

# 8.1 Lambda 表达式

  • 使用 ()->{} 语法简化匿名类实现,减少样板代码,尤其适用于函数式编程场景。

# 8.2 Stream API

  • filtermapreducecollect:用于对集合进行高效的链式操作。
  • 并行流:通过 parallelStream() 来并行处理数据。

# 8.3 Optional

  • 通过 Optional 避免 NullPointerException,提供 orElse() 等方法处理空值。

# 8.4 方法引用

  • 使用 :: 来引用已有方法,简化 Lambda 表达式的使用。
最近更新: 9/24/2024, 10:36:04 PM
备案号:粤ICP备2023124211号-1
Copyright © 2023-2024 StarChenTech All Rights Reserved.