Java基础知识总结

Java面试高频知识点总结

📚 Java基础

1. 面向对象三大特性

java 复制代码
// 封装示例
public class Person {
    private String name;  // 封装
    
    public String getName() { 
        return name; 
    }
}

// 继承示例
class Student extends Person { }

// 多态示例
Animal animal = new Dog();  // 父类引用指向子类对象

2. == 和 equals() 的区别

  • ==:比较基本类型值或对象内存地址
  • equals():通常需要重写,用于比较对象内容
java 复制代码
String s1 = new String("hello");
String s2 = new String("hello");

s1 == s2;      // false(不同对象)
s1.equals(s2); // true(内容相同)

3. String、StringBuffer、StringBuilder

特性 String StringBuffer StringBuilder
可变性 不可变 可变 可变
线程安全 安全 安全(synchronized) 不安全
性能 低(频繁操作) 中等
使用场景 少量字符串操作 多线程环境 单线程环境

📦 Java集合框架

1. HashMap原理(JDK8+)

java 复制代码
// 数组 + 链表/红黑树结构
static final int TREEIFY_THRESHOLD = 8;  // 链表转树阈值
static final int UNTREEIFY_THRESHOLD = 6; // 树转链表阈值

// put过程伪代码
1. 计算key的hash值
2. 如果table为空则初始化
3. 如果桶为空,直接插入
4. 如果桶不为空:
   - 键相同则更新值
   - 如果是树节点,树插入
   - 否则遍历链表插入
5. 链表长度>8时转为红黑树

2. ConcurrentHashMap线程安全实现

  • JDK7:分段锁(Segment)
  • JDK8+
    • Node + CAS + synchronized
    • 只锁定当前桶(链表头/树根)
    • 并发控制更细粒度

3. ArrayList vs LinkedList

操作 ArrayList LinkedList
随机访问 O(1) O(n)
头部插入 O(n) O(1)
内存占用 较小(连续内存) 较大(节点开销)
适用场景 读多写少 写多读少

🔁 多线程与并发

1. 线程状态转换

NEW RUNNABLE: start() RUNNABLE BLOCKED: 等待锁 BLOCKED 获得锁 WAITING: wait()/join() WAITING notify()/notifyAll() TIMED_WAITING: sleep(n) TIMED_WAITING 时间到 TERMINATED: run()结束

2. synchronized vs ReentrantLock

特性 synchronized ReentrantLock
实现机制 JVM层面 API层面
锁获取方式 自动获取释放 需要手动lock/unlock
公平性 非公平 可公平/非公平(构造函数指定)
条件变量 单一wait/notify 支持多个Condition
锁中断 不支持 支持lockInterruptibly()

3. 线程池核心参数

java 复制代码
ThreadPoolExecutor(
    int corePoolSize,     // 核心线程数
    int maximumPoolSize,  // 最大线程数
    long keepAliveTime,   // 空闲线程存活时间
    TimeUnit unit,        // 时间单位
    BlockingQueue<Runnable> workQueue, // 工作队列
    RejectedExecutionHandler handler   // 拒绝策略
)
四种拒绝策略:
  1. AbortPolicy:默认策略,直接抛异常
  2. CallerRunsPolicy:用调用者线程执行任务
  3. DiscardPolicy:静默丢弃任务
  4. DiscardOldestPolicy:丢弃队列最老任务

⚙️ JVM与性能调优

1. 内存区域划分

JVM内存区域

"方法区"

"堆"

"虚拟机栈"

"本地方法栈"

"程序计数器"

2. 垃圾回收算法

  • 标记-清除:产生内存碎片
  • 复制算法:适合新生代(Eden/Survivor)
  • 标记-整理:适合老年代
  • 分代收集:新生代(Minor GC) + 老年代(Full GC)

3. 常见GC收集器

收集器 区域 算法 特点
Serial 新生代 复制 单线程,简单高效
ParNew 新生代 复制 Serial的多线程版本
Parallel Scavenge 新生代 复制 吞吐量优先
CMS 老年代 标记-清除 低停顿,并发收集
G1 全堆 分Region+标记-整理 可预测停顿,JDK9默认

🧩 设计模式

1. 单例模式(双重校验锁)

java 复制代码
public class Singleton {
    private volatile static Singleton instance;
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        if (instance == null) {                     // 第一次校验
            synchronized (Singleton.class) {
                if (instance == null) {              // 第二次校验
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

2. 工厂模式

java 复制代码
interface Car {
    void drive();
}

class Tesla implements Car { /*...*/ }
class BMW implements Car { /*...*/ }

class CarFactory {
    public Car createCar(String type) {
        switch(type) {
            case "Tesla": return new Tesla();
            case "BMW": return new BMW();
            default: throw new IllegalArgumentException();
        }
    }
}

3. Spring中的设计模式

  • 工厂模式:BeanFactory
  • 代理模式:AOP实现
  • 单例模式:默认Bean作用域
  • 模板方法:JdbcTemplate
  • 观察者模式:ApplicationEvent

✨ Java 8+ 新特性

1. Lambda表达式

java 复制代码
// 传统写法
Collections.sort(list, new Comparator<String>() {
    public int compare(String s1, String s2) {
        return s1.length() - s2.length();
    }
});

// Lambda写法
Collections.sort(list, (s1, s2) -> s1.length() - s2.length());

2. Stream API

java 复制代码
List<String> result = list.stream()
    .filter(s -> s.startsWith("A"))
    .map(String::toUpperCase)
    .sorted()
    .collect(Collectors.toList());

3. Optional避免NPE

java 复制代码
Optional<User> user = userService.findById(id);
user.ifPresent(u -> System.out.println(u.getName()));

String name = user.map(User::getName)
                 .orElse("Unknown");

相关推荐
zuozewei5 分钟前
高可用改造之构建双活冗余的TDengine时序数据处理架构
java·架构·tdengine
嫩萝卜头儿10 分钟前
从零掌握 Java AWT:原理、实战与性能优化
java·开发语言·性能优化
zhoupenghui16815 分钟前
golang实现支持100万个并发连接(例如,HTTP长连接或WebSocket连接)系统架构设计详解
开发语言·后端·websocket·golang·系统架构·echo·100万并发
咸甜适中30 分钟前
Rust语言序列化和反序列化vec<u8>,serde库Serialize, Deserialize,bincode库(2025年最新解决方案详细使用)
开发语言·后端·rust
都叫我大帅哥41 分钟前
Java ZGC垃圾收集器:低延迟的终极武器,全面解析与实战指南
java·jvm
Jason?131 小时前
Unity基于Recoder的API写了一个随时录屏的工具
java·unity·游戏引擎
都叫我大帅哥1 小时前
🐇 RabbitMQ延时队列:让消息学会“踩点上班”的终极指南
java·rabbitmq
JiaHao汤1 小时前
Java 虚拟机之双亲委派机制
java·jvm·后端
咩?2 小时前
SEABORN库函数(第十八节课内容总结)
开发语言·python·matplotlib·seaborn
C4程序员2 小时前
北京JAVA基础面试30天打卡03
java·开发语言·面试