Java基础知识总结

发布于:2025-08-09 ⋅ 阅读:(18) ⋅ 点赞:(0)

Java面试高频知识点总结

📚 Java基础

1. 面向对象三大特性

// 封装示例
public class Person {
    private String name;  // 封装
    
    public String getName() { 
        return name; 
    }
}

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

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

2. == 和 equals() 的区别

  • ==:比较基本类型值或对象内存地址
  • equals():通常需要重写,用于比较对象内容
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+)

// 数组 + 链表/红黑树结构
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. 线程池核心参数

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. 单例模式(双重校验锁)

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. 工厂模式

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表达式

// 传统写法
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

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

3. Optional避免NPE

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

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


网站公告

今日签到

点亮在社区的每一天
去签到