Java语言程序开发笔记
划重点1. 内存中的秘密堆、栈、方法区非堆很多同学搞不清楚对象到底在哪这里画个简图· 栈 (Stack)线程私有存放局部变量、方法调用栈帧。方法执行完立即弹出。· 堆 (Heap)所有 new 出来的对象、数组。垃圾回收的主战场。· 方法区 (Method Area)存储类结构信息字段、方法字节码、静态变量、常量池。javaPerson p new Person();// p 在栈上局部变量指向堆上的 Person 对象// Person.class 的类信息在方法区⭐ 关键误区· 你以为 String 是基本类型错它是对象。· 比较基本类型是值比较对象是地址。想比内容用 .equals()。2. 异常处理不只是 try-catch2.1 分类体系· ErrorJVM内部错误如栈溢出程序无法处理。· Exception· RuntimeException非受检如 NullPointerExceptionArithmeticException。编译器不强制处理。· Checked Exception受检如 IOExceptionSQLException。必须处理或声明 throws。2.2 实战级写法javatry (FileInputStream fis new FileInputStream(test.txt)) {// 自动关闭资源try-with-resourcesJava7} catch (FileNotFoundException e) {System.out.println(文件不存在请检查路径);e.printStackTrace(); // 打印栈轨迹便于排错} catch (IOException e) {// 多个catch按子类到父类排列}⭐ 最佳实践不要吞掉异常catch(e){} 留空这会让线上问题无法排查。---3. 集合框架别只会用 ArrayList3.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_THRESHOLD8 且数组长度 ≥64 → 转为红黑树提升查找效率 O(log n)。⭐ 重写 equals 必须重写 hashCode否则在 HashMap 中会找不到相同内容的 key。---4. 泛型编译期的保护伞java// 避免这样原始类型List list new ArrayList();list.add(hello);list.add(123); // 编译通过但取出时会 ClassCastException// 应该这样ListString list new ArrayList();list.add(world);// list.add(123); // 编译错误类型安全4.1 通配符上下界· ? extends TT 或 T 的子类读取时可转为 T不能写入· ? super TT 或 T 的父类可写入 T 类型读取时只能用 Object示例方法参数需要 只读 一个数字列表 - public void sum(List? extends Number list)。---5. Lambda 与 Stream写代码像写SQL5.1 函数式接口只有一个抽象方法常见的PredicateTFunctionT,RConsumerT。5.2 Lambda 简化java// 原匿名内部类new Thread(new Runnable() {Overridepublic void run() {System.out.println(run);}}).start();// Lambda 写法new Thread(() - System.out.println(run)).start();5.3 Stream 流式操作不改变原数据源javaListStudent list getStudents();// 筛选出成绩≥90的学生按分数降序取前3名姓名ListString 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。