当前位置: 首页 > news >正文

Java基础知识总结

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

特性StringStringBufferStringBuilder
可变性不可变可变可变
线程安全安全安全(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

操作ArrayListLinkedList
随机访问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

特性synchronizedReentrantLock
实现机制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");

http://www.xdnf.cn/news/1260973.html

相关文章:

  • Harbor 企业级实战:单机快速上手 × 高可用架构搭建 × HTTPS安全加固
  • 宝龙地产债务化解解决方案二:基于资产代币化与轻资产转型的战略重构
  • 微信小程序性能优化
  • 宝龙地产债务化解解决方案一:基于资产代币化与轻资产转型的战略重构
  • 【高等数学】第八章 向量代数与空间解析几何——第三节 平面及其方程
  • C语言中的数据结构--树
  • apache cgi测试
  • 安全合规1--实验:ARP欺骗、mac洪水攻击、ICMP攻击、TCP SYN Flood攻击
  • 操作系统-实验-进程
  • 以下是使用这款ePub编辑器将指定章节转换为TXT文本文档的操作方法
  • (已解决)IDEA突然无法使用Git功能
  • 手机拍照识别中模糊场景准确率↑37%:陌讯动态适配算法实战解析
  • hyper-v虚拟机启动失败:Virtual Pci Express Port无法打开电源,因为发生错误,找不到即插即用设备
  • SQL Server 2019搭建AlwaysOn高可用集群
  • Money Sums
  • 【优选算法】BFS解决拓扑排序
  • UE4/UE5 Android 超大(视频)文件打包/防拷贝方案
  • Linux 内存管理之page folios
  • node.js 学习笔记2 进程/线程、fs
  • (已解决)Mac 终端上配置代理
  • 人工智能与智能家居:家居生活的变革
  • GO的启动流程(GMP模型/内存)
  • Go语言实战案例:用net/http构建一个RESTful API
  • 关于csdn导入和导出
  • 服务器硬件电路设计之I2C问答(一):为什么I2C总线要加上拉电阻?
  • Vue框架进阶
  • DM8数据库服务正常,但是登录报错 [-70019]:没有匹配的可登录服务器
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘huggingface_hub’问题
  • proteus实现简易DS18B20温度计(stm32)
  • 《论文阅读》传统CoT方法和提出的CoT Prompting的区分