当前位置: 首页 > 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.lryc.cn/news/613752.html

相关文章:

  • 若依前后端分离版学习笔记(七)—— Mybatis,分页,数据源的配置及使用
  • php防注入和XSS过滤参考代码
  • linux-LVM 逻辑卷管理
  • 嵌入式硬件接口总结
  • Linux文档压缩打包与安装
  • 解决苍穹外卖项目中 MyBatis - Plus 版本冲突问题
  • 基于大数据的地铁客流数据分析预测系统 Python+Django+Vue.js
  • Java学习进阶--集合体系结构
  • 0_外设学习_ESP8266+云流转(no 0基础)
  • Vue 项目安全设置方案:XSS/CSRF 防护指南
  • UE4/UE5 Android 超大(视频)文件打包/防拷贝方案
  • 【开源工具】网络交换机批量配置生成工具开发全解:从原理到实战(附完整Python源码)
  • 小孙学变频学习笔记(十三)电动机参数的自动测量 矢量控制的转速反馈
  • 如何永久删除三星手机中的照片?
  • OpenBMC中libgpio架构与驱动交互全解析:从硬件映射到应用控制
  • 数据库表字段命名建议和最佳实践
  • 二十八天(数据结构:图的补充)
  • Deepoc具身智能开发板赋能采摘机器人的技术突破与应用实践
  • Android Studio第一个kotlin项目“Hello Android”
  • 机械学习--SVM 算法
  • Kotlin反射
  • Android 安全编程:Kotlin 如何从语言层保障安全性
  • 机械学习--k-means
  • 移动端网页调试实战,网络请求延迟与超时问题全链路排查指南
  • Java枚举类从入门到精通
  • gmssl私钥文件格式
  • 软件销售跟进思路
  • 弱电+机房+设备+运维资料合集方案(Word+PPT)
  • ORACLE物化视图快速刷新失败原因查找
  • 分治-快排-215.数组中的第k个最大元素-力扣(LeetCode)