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");

相关推荐
weixin_3077791316 小时前
MATLAB用到的符号计算数学引擎
开发语言·算法·matlab
sali-tec16 小时前
C# 基于halcon的视觉工作流-章40-OCR训练识别
开发语言·图像处理·算法·计算机视觉·c#·ocr
恒云客17 小时前
Rust开发环境配置
开发语言·后端·rust
ggaofeng17 小时前
用 Python 实现一个简化但可运行的 单点登录(SSO)系统
开发语言·python
用户81046613951017 小时前
Java-Scanner类讲解
java
laomocoder17 小时前
golang可观测-无侵入式agent技术原理
开发语言·后端·golang
web安全工具库17 小时前
Linux ls 命令进阶:从隐藏文件到递归显示,成为文件浏览大师
linux·运维·服务器·c语言·开发语言
**之火17 小时前
中止 Web 请求新方式 - AbortController API
开发语言·前端·javascript
come1123417 小时前
深入Spring Boot的核心——配置管理(指南四)
java·spring boot·后端
技术猴小猴17 小时前
如何使用Python实现UDP广播
开发语言·python·udp