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

相关推荐
qq_4017004120 小时前
Qt键盘组合
开发语言·qt
失散1320 小时前
分布式专题——53 ElasticSearch高可用集群架构实战
java·分布式·elasticsearch·架构
lkbhua莱克瓦2420 小时前
Java入门——Java跨平台的原理
java·开发语言·笔记·github
song1502653729820 小时前
PLC控制编程,触摸屏程序开发设计解析
开发语言·javascript·ecmascript
float_com20 小时前
【java阶段练习】----- 学生管理系统
java
爱笑的源码基地20 小时前
基于Java+Spring Boot、Vue的B/S医院患者随访管理系统源码,支持二次开发,三级随访体系(出院/门诊随访)、智慧云库(表单配置)
java·vue.js·spring boot·源码·程序代码·随访系统·诊后回访
Charles_go20 小时前
C#7、如何处理异常
开发语言·c#
我曾遇到一束光20 小时前
Springboot3.X+security6.5+jdk21
java·开发语言
jtymyxmz20 小时前
1.1.4 Spring的下载及目录结构
java·后端·spring
Tipriest_20 小时前
C++ 图形中间件库Magnum详细介绍
开发语言·c++·magnum