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

Java语言程序开发笔记

划重点!

1. 内存中的秘密:堆、栈、方法区(非堆)

很多同学搞不清楚对象到底在哪,这里画个简图:

· 栈 (Stack):线程私有,存放局部变量、方法调用栈帧。方法执行完立即弹出。
· 堆 (Heap):所有 new 出来的对象、数组。垃圾回收的主战场。
· 方法区 (Method Area):存储类结构信息(字段、方法字节码)、静态变量、常量池。

```java
Person p = new Person();
// p 在栈上(局部变量),指向堆上的 Person 对象
// Person.class 的类信息在方法区
```

⭐ 关键误区:

· 你以为 String 是基本类型?错,它是对象。
· == 比较基本类型是值,比较对象是地址。想比内容用 .equals()。

2. 异常处理不只是 try-catch

2.1 分类体系

· Error:JVM内部错误(如栈溢出),程序无法处理。
· Exception:
· RuntimeException(非受检):如 NullPointerException,ArithmeticException。编译器不强制处理。
· Checked Exception(受检):如 IOException,SQLException。必须处理或声明 throws。

2.2 实战级写法

```java
try (FileInputStream fis = new FileInputStream("test.txt")) {
// 自动关闭资源(try-with-resources,Java7+)
} catch (FileNotFoundException e) {
System.out.println("文件不存在,请检查路径");
e.printStackTrace(); // 打印栈轨迹,便于排错
} catch (IOException e) {
// 多个catch按子类到父类排列
}
```

⭐ 最佳实践:不要吞掉异常(catch(e){} 留空),这会让线上问题无法排查。

---

3. 集合框架:别只会用 ArrayList

3.1 体系脉络

```
Iterable → Collection → List/Set/Queue

Map(与Collection同级,不是子接口)
```

3.2 底层数据结构对比

实现类 底层结构 特点 线程安全
ArrayList 动态数组 随机访问快,增删慢(除非末尾) 否
LinkedList 双向链表 增删快(两端),随机访问慢 否
HashSet HashMap(玄幻?) 不重复,无序,依赖 hashCode/equals 否
TreeSet 红黑树 有序(Comparable/Comparator) 否
HashMap 数组+链表/红黑树 key-value,允许null 否
Hashtable 类似,但方法同步 较慢,不允许null key 是

3.3 重点:HashMap 的 put 过程(面试高频)

1. 计算 key.hashCode(),再扰动得到桶下标 (n-1) & hash。
2. 若桶为空,直接放。
3. 若不为空,通过 equals() 判断 key 是否相同 → 覆盖 value;否则以链表/红黑树方式挂到后面。
4. 当链表长度超过 TREEIFY_THRESHOLD(8) 且数组长度 ≥64 → 转为红黑树(提升查找效率 O(log n))。

⭐ 重写 equals 必须重写 hashCode,否则在 HashMap 中会找不到相同内容的 key。

---

4. 泛型:编译期的保护伞

```java
// 避免这样(原始类型)
List list = new ArrayList();
list.add("hello");
list.add(123); // 编译通过,但取出时会 ClassCastException

// 应该这样
List<String> list = new ArrayList<>();
list.add("world");
// list.add(123); // 编译错误,类型安全
```

4.1 通配符上下界

· <? extends T>:T 或 T 的子类(读取时可转为 T,不能写入)
· <? super T>:T 或 T 的父类(可写入 T 类型,读取时只能用 Object)

示例:方法参数需要 只读 一个数字列表 -> public void sum(List<? extends Number> list)。

---

5. Lambda 与 Stream:写代码像写SQL

5.1 函数式接口(只有一个抽象方法)

常见的:Predicate<T>,Function<T,R>,Consumer<T>。

5.2 Lambda 简化

```java
// 原匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("run");
}
}).start();

// Lambda 写法
new Thread(() -> System.out.println("run")).start();
```

5.3 Stream 流式操作(不改变原数据源)

```java
List<Student> list = getStudents();
// 筛选出成绩≥90的学生,按分数降序,取前3名姓名
List<String> top3 = list.stream()
.filter(s -> s.getScore() >= 90)
.sorted((a,b) -> b.getScore() - a.getScore())
.limit(3)
.map(Student::getName)
.collect(Collectors.toList());
```

⭐ 惰性求值:filter/map 等中间操作不会立即执行,遇到 collect 或 forEach 才触发。

---

6. 多线程基础:锁的粗浅理解

6.1 创建线程的两种正确方式

· 继承 Thread(不推荐,单继承受限)
· 实现 Runnable(推荐)

6.2 可见性问题与 volatile

多个线程共享一个 boolean 标志时,加上 volatile 保证可见性(禁止指令重排),但它不保证原子性。

6.3 synchronized 用法

· 实例方法 -> 锁当前对象 this
· 静态方法 -> 锁 Class 对象
· 同步代码块:synchronized(lockObj){}

6.4 简单死锁示例(能看懂并避免)

线程A持有锁1,等待锁2;线程B持有锁2,等待锁1 → 卡死。解决方式:按固定顺序申请锁。

---

7. 实用小贴士

1. equals 与 ==:永远用 "常量".equals(变量) 避免空指针。
2. 字符串拼接:循环内不要用 +,用 StringBuilder。
3. 尽早返回:减少嵌套 if,提高可读性。
4. 日志打印:线上用 log.info("用户:{}", user) 而非 System.out.println。

http://www.gsyq.cn/news/1476927.html

相关文章:

  • 2026年百度代理商服务口碑排名,山东热门等公司上榜 - myqiye
  • 西门子S7:西门子CPU模块、西门子PLC模块销售、西门子S71200模块、西门子S71500模块、西门子S7200模块选择指南 - 优质品牌商家
  • 靠谱的耐辐射镜头厂家
  • 智能饮食助手——开发方案设计
  • Python+pyecharts 制作 B 站同款世界人口动态排序柱状轮播图(1960-2024 完整版)
  • leetcode数据结构与算法1~4
  • 2026年Q2建筑工程地基基础检测机构实测评测:建筑工程地基基础检测/房屋安全鉴定/房屋完损检测/房屋检测/房屋消防检测/选择指南 - 优质品牌商家
  • TensorRT模型转换避坑指南:trtexec处理动态Batch、多精度与工作空间设置的实战详解
  • 教学机租赁口碑哪家好?爱校哥,服务响应迅速,售后保障完善 - 工业品牌热点
  • 导师默许的 AI 论文辅助神器!6 个国内写作站点,轻松搞定参考文献与初稿
  • GitHub开源项目日报 · 2026年6月5日 · 自进化AI助手与记忆系统成为本周焦点
  • 手把手教你用VMware vSphere 7.0搭建家庭实验室:从ESXi安装到vCenter配置全流程
  • CSDN AI营销卡片跳转权限全维度解读,官网直跳已开放,小程序仍需企业资质认证(附审核时效倒计时)
  • Android系统级Root技术深度解析:Magisk架构设计与安全加固实践指南
  • 不止于预测:用CausalML的DragonNet和SHAP给你的策略效果归因
  • 告别轮询!用HAL库中断搞定STM32F407的CAN收发,CubeMX配置一步到位
  • CSDN AI写稿产能红线预警(附压测日志截图与Prompt工程补偿方案)
  • 别光背公式了!用Python和NumPy动手验证Jensen不等式(附代码)
  • 我把AI调教成我的专属发稿助手,过程比结果有意思
  • IT培训机构招生引流失效的真相,CSDN AI如何补上最后一环?——基于17家机构AB测试的硬核结论
  • 【稀缺首发】SaaS企业AI营销选型红宝书(CSDN版):覆盖11类细分赛道验证结论,仅开放72小时免费领取完整评估模板
  • 你的照片为什么在不同设备上‘变色’?一文讲透伽马校正与色彩管理(附手机/电脑屏幕实测)
  • 别再乱用Qt模态对话框了!WindowModal和ApplicationModal的实际场景选择指南
  • RT-Thread BSP架构师视角:我是如何为GD32系列设计一套通用BSP框架的
  • Sketch MeaXure:如何彻底解决设计标注的三大痛点问题
  • 2026液态硅胶表带开模技术拆解与实力供应商指南:液态硅胶开模、液态硅胶手表带开模、TPU手表带、固态硅胶手表带开模选择指南 - 优质品牌商家
  • 魔兽争霸3终极优化指南:5分钟解决宽屏适配、地图加载与帧率锁定三大难题
  • 终极实战指南:彻底解决ComfyUI-SUPIR内存访问冲突与系统崩溃问题
  • 2026定制焊料选型技术解析:焊环、粘带焊料、膏状助焊剂285、金基焊料、钎焊材料、钛基焊料、钯基焊料、银焊膏选择指南 - 优质品牌商家
  • DS18B20 vs LM335:用STM32实测两种温度传感器,精度、电路和代码到底差多少?