<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>翻车防御工事 on 洛克里亚的五度 博客</title>
    <link>https://lv-blog.pages.dev/tags/%E7%BF%BB%E8%BD%A6%E9%98%B2%E5%BE%A1%E5%B7%A5%E4%BA%8B/</link>
    <description>Recent content in 翻车防御工事 on 洛克里亚的五度 博客</description>
    <generator>Hugo</generator>
    <language>zh</language>
    <lastBuildDate>Thu, 09 Jul 2026 22:15:46 +0800</lastBuildDate>
    <atom:link href="https://lv-blog.pages.dev/tags/%E7%BF%BB%E8%BD%A6%E9%98%B2%E5%BE%A1%E5%B7%A5%E4%BA%8B/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>JAVA程序员防翻车指南</title>
      <link>https://lv-blog.pages.dev/posts/programming/java%E7%A8%8B%E5%BA%8F%E5%91%98%E9%98%B2%E7%BF%BB%E8%BD%A6%E6%8C%87%E5%8D%97/</link>
      <pubDate>Thu, 09 Jul 2026 22:15:46 +0800</pubDate>
      <guid>https://lv-blog.pages.dev/posts/programming/java%E7%A8%8B%E5%BA%8F%E5%91%98%E9%98%B2%E7%BF%BB%E8%BD%A6%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;h2 id=&#34;一基础类型与字面量1-10&#34;&gt;一、基础类型与字面量（1-10）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;int&lt;/code&gt; 最大值 &lt;code&gt;2,147,483,647&lt;/code&gt;（2³¹-1），最小值 &lt;code&gt;-2,147,483,648&lt;/code&gt;（-2³¹）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;long&lt;/code&gt; 最大值 &lt;code&gt;9,223,372,036,854,775,807&lt;/code&gt;（2⁶³-1），字面量加 &lt;code&gt;L&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;float&lt;/code&gt; 字面量必须加 &lt;code&gt;f&lt;/code&gt;，否则默认 &lt;code&gt;double&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;short&lt;/code&gt; 范围 &lt;code&gt;-32,768 ~ 32,767&lt;/code&gt;，&lt;code&gt;byte&lt;/code&gt; 范围 &lt;code&gt;-128 ~ 127&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;字面量下划线：&lt;code&gt;1_000_000&lt;/code&gt; 等于 &lt;code&gt;1000000&lt;/code&gt;，仅 Java 7+&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0x&lt;/code&gt; 开头是十六进制，&lt;code&gt;0b&lt;/code&gt; 开头是二进制，&lt;code&gt;0&lt;/code&gt; 开头是八进制（容易误判）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;char&lt;/code&gt; 占 2 字节，&lt;code&gt;Character.SIZE&lt;/code&gt; = 16，但 Unicode 扩展字符需 2 个 char（surrogate pair）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;boolean&lt;/code&gt; 只有 &lt;code&gt;true/false&lt;/code&gt;，不能和 0/1 互转（和 C 不同）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Integer.valueOf(127) == Integer.valueOf(127)&lt;/code&gt; 为 &lt;code&gt;true&lt;/code&gt;，&lt;code&gt;128&lt;/code&gt; 为 &lt;code&gt;false&lt;/code&gt;（缓存池 -128~127）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Integer.parseInt(&amp;quot;&amp;quot;)&lt;/code&gt; 抛 &lt;code&gt;NumberFormatException&lt;/code&gt;，&lt;code&gt;Integer.parseInt(null)&lt;/code&gt; 也抛&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;二运算符与表达式11-18&#34;&gt;二、运算符与表达式（11-18）&lt;/h2&gt;
&lt;ol start=&#34;11&#34;&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;&lt;/code&gt; 和 &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 区别：&lt;code&gt;&amp;amp;&lt;/code&gt; 两边都执行（位运算或逻辑与），&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 短路&lt;/li&gt;
&lt;li&gt;&lt;code&gt;|&lt;/code&gt; 和 &lt;code&gt;||&lt;/code&gt; 同理，&lt;code&gt;||&lt;/code&gt; 短路&lt;/li&gt;
&lt;li&gt;&lt;code&gt;^&lt;/code&gt; 按位异或，&lt;code&gt;~&lt;/code&gt; 按位取反（包含符号位）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; 算术右移（补符号位），&lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt; 无符号右移（补 0）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;i++&lt;/code&gt; 和 &lt;code&gt;++i&lt;/code&gt; 的字节码区别：前者先加载后自增，后者先自增后加载&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+=&lt;/code&gt; 隐式类型转换：&lt;code&gt;short s = 1; s += 1;&lt;/code&gt; 合法，&lt;code&gt;s = s + 1;&lt;/code&gt; 编译错误&lt;/li&gt;
&lt;li&gt;三元运算符 &lt;code&gt;? :&lt;/code&gt; 必须返回相同类型，否则自动类型提升&lt;/li&gt;
&lt;li&gt;字符串拼接用 &lt;code&gt;+&lt;/code&gt; 在循环内会生成大量 &lt;code&gt;StringBuilder&lt;/code&gt;，循环外编译器自动优化&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;三string-相关19-28&#34;&gt;三、String 相关（19-28）&lt;/h2&gt;
&lt;ol start=&#34;19&#34;&gt;
&lt;li&gt;&lt;code&gt;String&lt;/code&gt; 不可变，底层 &lt;code&gt;char[]&lt;/code&gt; 被 &lt;code&gt;final&lt;/code&gt; 修饰且不暴露修改方法&lt;/li&gt;
&lt;li&gt;字符串常量池在堆中（Java 8+），&lt;code&gt;intern()&lt;/code&gt; 手动入池&lt;/li&gt;
&lt;li&gt;&lt;code&gt;new String(&amp;quot;abc&amp;quot;)&lt;/code&gt; 创建 2 个对象（常量池 + 堆），&lt;code&gt;&amp;quot;abc&amp;quot;&lt;/code&gt; 只创建 1 个（若池中没有）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;String.equals()&lt;/code&gt; 比较内容，&lt;code&gt;==&lt;/code&gt; 比较引用地址&lt;/li&gt;
&lt;li&gt;&lt;code&gt;String.compareTo()&lt;/code&gt; 按字典序比较，返回差值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;String.format()&lt;/code&gt; 使用 &lt;code&gt;%s&lt;/code&gt; &lt;code&gt;%d&lt;/code&gt; &lt;code&gt;%f&lt;/code&gt; 占位符&lt;/li&gt;
&lt;li&gt;&lt;code&gt;substring()&lt;/code&gt; 在 Java 7 前共享 &lt;code&gt;char[]&lt;/code&gt;，Java 7+ 创建新数组（解决内存泄漏）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;split()&lt;/code&gt; 参数是正则，&lt;code&gt;.&lt;/code&gt; 需转义为 &lt;code&gt;\\.&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;replace()&lt;/code&gt; 替换所有字符，&lt;code&gt;replaceAll()&lt;/code&gt; 支持正则&lt;/li&gt;
&lt;li&gt;&lt;code&gt;StringBuilder&lt;/code&gt; 线程不安全，&lt;code&gt;StringBuffer&lt;/code&gt; 线程安全（方法加 &lt;code&gt;synchronized&lt;/code&gt;），但慢&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;四equals-与-hashcode29-34&#34;&gt;四、equals 与 hashCode（29-34）&lt;/h2&gt;
&lt;ol start=&#34;29&#34;&gt;
&lt;li&gt;重写 &lt;code&gt;equals&lt;/code&gt; 必须重写 &lt;code&gt;hashCode&lt;/code&gt;，否则 &lt;code&gt;HashMap&lt;/code&gt;/&lt;code&gt;HashSet&lt;/code&gt; 失效&lt;/li&gt;
&lt;li&gt;&lt;code&gt;equals&lt;/code&gt; 必须满足：自反、对称、传递、一致、非空（&lt;code&gt;x.equals(null)&lt;/code&gt; 返回 &lt;code&gt;false&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hashCode&lt;/code&gt; 相等的两个对象 &lt;code&gt;equals&lt;/code&gt; 不一定相等（哈希冲突）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Objects.equals(a, b)&lt;/code&gt; 自动判空，避免 &lt;code&gt;null.equals()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Arrays.deepEquals()&lt;/code&gt; 比较多维数组，&lt;code&gt;Arrays.equals()&lt;/code&gt; 只比较一维&lt;/li&gt;
&lt;li&gt;&lt;code&gt;List.equals()&lt;/code&gt; 要求顺序相同，&lt;code&gt;Set.equals()&lt;/code&gt; 仅要求元素相同（顺序无关）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;五异常处理35-44&#34;&gt;五、异常处理（35-44）&lt;/h2&gt;
&lt;ol start=&#34;35&#34;&gt;
&lt;li&gt;&lt;code&gt;try-catch-finally&lt;/code&gt; 中 &lt;code&gt;finally&lt;/code&gt; 在 &lt;code&gt;return&lt;/code&gt; 之前执行，但返回值已在 &lt;code&gt;finally&lt;/code&gt; 前计算好&lt;/li&gt;
&lt;li&gt;&lt;code&gt;finally&lt;/code&gt; 中有 &lt;code&gt;return&lt;/code&gt; 会覆盖 &lt;code&gt;try&lt;/code&gt;/&lt;code&gt;catch&lt;/code&gt; 的返回值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;finally&lt;/code&gt; 中修改返回的引用对象内容会生效（如 &lt;code&gt;List.add()&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;不要在 &lt;code&gt;finally&lt;/code&gt; 中写 &lt;code&gt;return&lt;/code&gt;，也不要在其中抛出异常（会掩盖原始异常）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;try-with-resources&lt;/code&gt; 要求资源实现 &lt;code&gt;AutoCloseable&lt;/code&gt;，关闭顺序：先声明的后关闭&lt;/li&gt;
&lt;li&gt;受检异常（&lt;code&gt;Exception&lt;/code&gt; 子类）必须 &lt;code&gt;try-catch&lt;/code&gt; 或 &lt;code&gt;throws&lt;/code&gt;，&lt;code&gt;RuntimeException&lt;/code&gt; 非受检&lt;/li&gt;
&lt;li&gt;异常链：&lt;code&gt;catch (SQLException e) { throw new RuntimeException(e); }&lt;/code&gt; 保留堆栈&lt;/li&gt;
&lt;li&gt;&lt;code&gt;printStackTrace()&lt;/code&gt; 不应用在生产日志中，用 &lt;code&gt;log.error(&amp;quot;msg&amp;quot;, e)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Throwable&lt;/code&gt; 包括 &lt;code&gt;Error&lt;/code&gt; 和 &lt;code&gt;Exception&lt;/code&gt;，&lt;code&gt;Error&lt;/code&gt; 不应该捕获（如 &lt;code&gt;OutOfMemoryError&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;finally&lt;/code&gt; 中关闭资源时可能抛异常，要用 &lt;code&gt;try-catch&lt;/code&gt; 包裹或使用 &lt;code&gt;try-with-resources&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;六集合框架45-62&#34;&gt;六、集合框架（45-62）&lt;/h2&gt;
&lt;ol start=&#34;45&#34;&gt;
&lt;li&gt;&lt;code&gt;ArrayList&lt;/code&gt; 初始容量 10，扩容 1.5 倍（&lt;code&gt;oldCapacity + (oldCapacity &amp;gt;&amp;gt; 1)&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ArrayList&lt;/code&gt; 随机访问 O(1)，中间插入删除 O(n)，&lt;code&gt;LinkedList&lt;/code&gt; 相反&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LinkedList&lt;/code&gt; 实现了 &lt;code&gt;Deque&lt;/code&gt;，可作为队列/栈使用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HashMap&lt;/code&gt; 容量为 2 的幂，默认 16，负载因子 0.75，扩容 2 倍&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HashMap&lt;/code&gt; 索引计算：&lt;code&gt;(n - 1) &amp;amp; hash&lt;/code&gt;，&lt;code&gt;hash = key.hashCode() ^ (h &amp;gt;&amp;gt;&amp;gt; 16)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Java 8+ &lt;code&gt;HashMap&lt;/code&gt; 链表长度 &amp;gt; 8 且容量 &amp;gt;= 64 时转红黑树，&amp;lt; 6 时退化为链表&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HashMap&lt;/code&gt; 的 &lt;code&gt;key&lt;/code&gt; 为 &lt;code&gt;null&lt;/code&gt; 时，hash 值为 0，存在 &lt;code&gt;table[0]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ConcurrentHashMap&lt;/code&gt; 分段锁（Java 7）→ &lt;code&gt;synchronized&lt;/code&gt; + CAS（Java 8+）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Hashtable&lt;/code&gt; 线程安全但全表锁，已淘汰&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TreeMap&lt;/code&gt; 基于红黑树，有序（按 key 自然序或 Comparator）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LinkedHashMap&lt;/code&gt; 按插入顺序或访问顺序（&lt;code&gt;accessOrder=true&lt;/code&gt; 可实现 LRU）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HashSet&lt;/code&gt; 底层是 &lt;code&gt;HashMap&lt;/code&gt;，&lt;code&gt;TreeSet&lt;/code&gt; 底层是 &lt;code&gt;TreeMap&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PriorityQueue&lt;/code&gt; 小顶堆，&lt;code&gt;Comparator.reverseOrder()&lt;/code&gt; 可转大顶堆&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ArrayDeque&lt;/code&gt; 优于 &lt;code&gt;Stack&lt;/code&gt;（&lt;code&gt;Stack&lt;/code&gt; 已废弃，&lt;code&gt;ArrayDeque&lt;/code&gt; 线程不安全但更快）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Collections.synchronizedList()&lt;/code&gt; 包装为线程安全，但迭代时仍需手动同步&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CopyOnWriteArrayList&lt;/code&gt; 读多写少场景，写时复制整个数组&lt;/li&gt;
&lt;li&gt;&lt;code&gt;List.of()&lt;/code&gt; / &lt;code&gt;Set.of()&lt;/code&gt;（Java 9+）返回不可变集合，不能增删改&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ArrayList.subList()&lt;/code&gt; 返回视图，对子列表操作会影响原列表，反之亦然&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;七并发与线程63-80&#34;&gt;七、并发与线程（63-80）&lt;/h2&gt;
&lt;ol start=&#34;63&#34;&gt;
&lt;li&gt;创建线程的三种方式：&lt;code&gt;Thread&lt;/code&gt;、&lt;code&gt;Runnable&lt;/code&gt;、&lt;code&gt;Callable&lt;/code&gt;（有返回值）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start()&lt;/code&gt; 启动线程，&lt;code&gt;run()&lt;/code&gt; 只是普通方法调用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;synchronized&lt;/code&gt; 可锁实例方法、静态方法（锁 Class）、代码块&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wait()&lt;/code&gt; 释放锁，&lt;code&gt;sleep()&lt;/code&gt; 不释放锁，&lt;code&gt;yield()&lt;/code&gt; 让出 CPU 但不释放锁&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wait()&lt;/code&gt;/&lt;code&gt;notify()&lt;/code&gt; 必须在 &lt;code&gt;synchronized&lt;/code&gt; 块中调用，否则抛 &lt;code&gt;IllegalMonitorStateException&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;notify()&lt;/code&gt; 随机唤醒一个，&lt;code&gt;notifyAll()&lt;/code&gt; 唤醒全部&lt;/li&gt;
&lt;li&gt;死锁四条件：互斥、请求与保持、不可抢占、循环等待&lt;/li&gt;
&lt;li&gt;破坏死锁：按固定顺序加锁、&lt;code&gt;tryLock()&lt;/code&gt; 超时、使用 &lt;code&gt;ReentrantLock&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;volatile&lt;/code&gt; 保证可见性和有序性（禁止指令重排），不保证原子性&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AtomicInteger&lt;/code&gt; 用 CAS 实现原子操作，&lt;code&gt;incrementAndGet()&lt;/code&gt; 底层是 &lt;code&gt;Unsafe.compareAndSwapInt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ThreadLocal&lt;/code&gt; 用完后必须 &lt;code&gt;remove()&lt;/code&gt;，否则线程池复用导致内存泄漏&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ThreadLocal&lt;/code&gt; 底层是 &lt;code&gt;ThreadLocalMap&lt;/code&gt;，key 是弱引用，value 是强引用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ExecutorService&lt;/code&gt; 用 &lt;code&gt;shutdown()&lt;/code&gt; 优雅关闭，&lt;code&gt;shutdownNow()&lt;/code&gt; 立即关闭&lt;/li&gt;
&lt;li&gt;线程池核心参数：核心线程数、最大线程数、存活时间、阻塞队列、拒绝策略&lt;/li&gt;
&lt;li&gt;四种拒绝策略：&lt;code&gt;AbortPolicy&lt;/code&gt;（抛异常）、&lt;code&gt;CallerRunsPolicy&lt;/code&gt;（调用者执行）、&lt;code&gt;DiscardPolicy&lt;/code&gt;（丢弃）、&lt;code&gt;DiscardOldestPolicy&lt;/code&gt;（丢弃最旧）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CachedThreadPool&lt;/code&gt; 最大线程数 &lt;code&gt;Integer.MAX_VALUE&lt;/code&gt;，容易 OOM，慎用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FixedThreadPool&lt;/code&gt; 使用无界队列，任务积压可能导致 OOM&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Future.get()&lt;/code&gt; 阻塞，&lt;code&gt;CompletableFuture&lt;/code&gt; 异步回调更灵活&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;八io-与-nio81-88&#34;&gt;八、I/O 与 NIO（81-88）&lt;/h2&gt;
&lt;ol start=&#34;81&#34;&gt;
&lt;li&gt;&lt;code&gt;File&lt;/code&gt; 只是路径抽象，不表示真实文件，&lt;code&gt;exists()&lt;/code&gt; 判断是否存在&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FileInputStream&lt;/code&gt; 读取字节，&lt;code&gt;FileReader&lt;/code&gt; 读取字符（默认编码可能乱码）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BufferedReader&lt;/code&gt; 用 &lt;code&gt;readLine()&lt;/code&gt; 按行读取，&lt;code&gt;Files.readAllLines()&lt;/code&gt; 更简洁&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InputStreamReader&lt;/code&gt; 可指定字符集：&lt;code&gt;new InputStreamReader(new FileInputStream(&amp;quot;a.txt&amp;quot;), StandardCharsets.UTF_8)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;try-with-resources&lt;/code&gt; 自动关闭多个资源，用分号分隔&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Path&lt;/code&gt;/&lt;code&gt;Paths&lt;/code&gt;/&lt;code&gt;Files&lt;/code&gt;（Java 7+）替代 &lt;code&gt;File&lt;/code&gt;，&lt;code&gt;Files.walk()&lt;/code&gt; 遍历目录树&lt;/li&gt;
&lt;li&gt;NIO 核心：&lt;code&gt;Channel&lt;/code&gt; + &lt;code&gt;Buffer&lt;/code&gt; + &lt;code&gt;Selector&lt;/code&gt;（多路复用）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ByteBuffer&lt;/code&gt; 读写切换需调用 &lt;code&gt;flip()&lt;/code&gt;，&lt;code&gt;clear()&lt;/code&gt; 清空，&lt;code&gt;compact()&lt;/code&gt; 压缩&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;九jvm-与内存89-95&#34;&gt;九、JVM 与内存（89-95）&lt;/h2&gt;
&lt;ol start=&#34;89&#34;&gt;
&lt;li&gt;JVM 内存区域：堆、栈、方法区（元空间）、程序计数器、本地方法栈&lt;/li&gt;
&lt;li&gt;堆分代：年轻代（Eden + S0 + S1）→ 老年代，默认比例 8:1:1&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OutOfMemoryError&lt;/code&gt; 常见原因：堆 OOM、元空间 OOM、直接内存 OOM、栈溢出&lt;/li&gt;
&lt;li&gt;栈溢出 &lt;code&gt;StackOverflowError&lt;/code&gt;，递归过深或无终止条件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;System.gc()&lt;/code&gt; 仅建议 GC，不保证执行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;finalize()&lt;/code&gt; 已废弃（Java 9+），对象自救不靠谱&lt;/li&gt;
&lt;li&gt;类加载器：Bootstrap（rt.jar）→ Extension → Application，双亲委派模型&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十日期与时间96-100&#34;&gt;十、日期与时间（96-100）&lt;/h2&gt;
&lt;ol start=&#34;96&#34;&gt;
&lt;li&gt;&lt;code&gt;java.util.Date&lt;/code&gt; 可变、线程不安全，已废弃，用 &lt;code&gt;java.time.*&lt;/code&gt;（Java 8+）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LocalDate&lt;/code&gt; / &lt;code&gt;LocalTime&lt;/code&gt; / &lt;code&gt;LocalDateTime&lt;/code&gt; 不含时区，&lt;code&gt;ZonedDateTime&lt;/code&gt; 含时区&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Instant&lt;/code&gt; 时间戳（秒/纳秒），&lt;code&gt;Duration&lt;/code&gt; 计算时间差，&lt;code&gt;Period&lt;/code&gt; 计算日期差&lt;/li&gt;
&lt;li&gt;格式化用 &lt;code&gt;DateTimeFormatter&lt;/code&gt; 线程安全，替代 &lt;code&gt;SimpleDateFormat&lt;/code&gt;（线程不安全）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LocalDateTime.now()&lt;/code&gt; 获取当前时间，&lt;code&gt;parse(&amp;quot;2026-07-09&amp;quot;)&lt;/code&gt; 按 ISO 标准解析&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十一语法糖与常见坑101-110&#34;&gt;十一、语法糖与常见坑（101-110）&lt;/h2&gt;
&lt;ol start=&#34;101&#34;&gt;
&lt;li&gt;泛型编译期擦除，运行时无泛型信息（&lt;code&gt;List&amp;lt;String&amp;gt;&lt;/code&gt; 和 &lt;code&gt;List&amp;lt;Integer&amp;gt;&lt;/code&gt; 在运行时相同）&lt;/li&gt;
&lt;li&gt;可变参数本质是数组，&lt;code&gt;public void method(String... args)&lt;/code&gt; 可传数组或逗号分隔&lt;/li&gt;
&lt;li&gt;枚举 &lt;code&gt;enum&lt;/code&gt; 默认继承 &lt;code&gt;Enum&lt;/code&gt;，不能被继承，构造器私有&lt;/li&gt;
&lt;li&gt;匿名内部类持有外部类引用（&lt;code&gt;this$0&lt;/code&gt;），可能导致内存泄漏&lt;/li&gt;
&lt;li&gt;接口默认方法 &lt;code&gt;default&lt;/code&gt;，静态方法 &lt;code&gt;static&lt;/code&gt;，接口中变量默认 &lt;code&gt;public static final&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;抽象类可有构造器，接口无构造器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;switch&lt;/code&gt; 支持 &lt;code&gt;byte&lt;/code&gt;/&lt;code&gt;short&lt;/code&gt;/&lt;code&gt;char&lt;/code&gt;/&lt;code&gt;int&lt;/code&gt;/&lt;code&gt;String&lt;/code&gt;/&lt;code&gt;enum&lt;/code&gt;，不支持 &lt;code&gt;long&lt;/code&gt;/&lt;code&gt;float&lt;/code&gt;/&lt;code&gt;double&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;break&lt;/code&gt; 跳出循环，&lt;code&gt;continue&lt;/code&gt; 跳过本次，&lt;code&gt;return&lt;/code&gt; 结束方法&lt;/li&gt;
&lt;li&gt;标签 &lt;code&gt;label:&lt;/code&gt; 可跳出外层循环，但不推荐使用&lt;/li&gt;
&lt;li&gt;数组协变：&lt;code&gt;String[]&lt;/code&gt; 是 &lt;code&gt;Object[]&lt;/code&gt; 的子类，但集合泛型不变&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十二网络与反射111-118&#34;&gt;十二、网络与反射（111-118）&lt;/h2&gt;
&lt;ol start=&#34;111&#34;&gt;
&lt;li&gt;&lt;code&gt;URL&lt;/code&gt; 和 &lt;code&gt;URI&lt;/code&gt; 区别：URI 是标识符，URL 是定位符（包含协议）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HttpURLConnection&lt;/code&gt; 原生 HTTP 客户端，但 Apache HttpClient / OkHttp 更常用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Socket&lt;/code&gt; 阻塞 I/O，&lt;code&gt;ServerSocket&lt;/code&gt; 监听端口，&lt;code&gt;accept()&lt;/code&gt; 阻塞等待连接&lt;/li&gt;
&lt;li&gt;反射 &lt;code&gt;Class.forName()&lt;/code&gt; 初始化类，&lt;code&gt;ClassLoader.loadClass()&lt;/code&gt; 不初始化&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Method.invoke()&lt;/code&gt; 性能差，但反射能绕过私有访问（&lt;code&gt;setAccessible(true)&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Proxy.newProxyInstance()&lt;/code&gt; 动态代理只能代理接口，CGLIB 可代理类&lt;/li&gt;
&lt;li&gt;注解保留策略：&lt;code&gt;SOURCE&lt;/code&gt;（源码）、&lt;code&gt;CLASS&lt;/code&gt;（字节码）、&lt;code&gt;RUNTIME&lt;/code&gt;（运行时）&lt;/li&gt;
&lt;li&gt;序列化实现 &lt;code&gt;Serializable&lt;/code&gt; 接口，&lt;code&gt;serialVersionUID&lt;/code&gt; 用于版本兼容，不声明则自动生成&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十三设计原则与模式119-123&#34;&gt;十三、设计原则与模式（119-123）&lt;/h2&gt;
&lt;ol start=&#34;119&#34;&gt;
&lt;li&gt;单例双重检查需 &lt;code&gt;volatile&lt;/code&gt;，防止指令重排导致半初始化对象被读取&lt;/li&gt;
&lt;li&gt;工厂模式解耦，策略模式消除 if-else，观察者模式事件驱动&lt;/li&gt;
&lt;li&gt;依赖倒置：依赖抽象而非具体实现&lt;/li&gt;
&lt;li&gt;开闭原则：对扩展开放，对修改封闭&lt;/li&gt;
&lt;li&gt;里氏替换：子类可以替换父类出现的地方&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十四linux-与常用命令124-128&#34;&gt;十四、Linux 与常用命令（124-128）&lt;/h2&gt;
&lt;ol start=&#34;124&#34;&gt;
&lt;li&gt;&lt;code&gt;nohup java -jar app.jar &amp;amp;&lt;/code&gt; 后台运行，输出到 &lt;code&gt;nohup.out&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jps&lt;/code&gt; 查看 Java 进程，&lt;code&gt;jstack&lt;/code&gt; 打印线程堆栈，&lt;code&gt;jmap&lt;/code&gt; 查看堆内存，&lt;code&gt;jstat&lt;/code&gt; 监控 GC&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kill -15&lt;/code&gt; 优雅关闭（SIGTERM），&lt;code&gt;kill -9&lt;/code&gt; 强制杀死（SIGKILL）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tail -f app.log&lt;/code&gt; 实时查看日志，&lt;code&gt;grep -C 10 &amp;quot;error&amp;quot; app.log&lt;/code&gt; 显示上下文&lt;/li&gt;
&lt;li&gt;&lt;code&gt;netstat -tlnp&lt;/code&gt; 查看端口占用，&lt;code&gt;lsof -i:8080&lt;/code&gt; 查看指定端口&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十五数据库与-jdbc129-133&#34;&gt;十五、数据库与 JDBC（129-133）&lt;/h2&gt;
&lt;ol start=&#34;129&#34;&gt;
&lt;li&gt;&lt;code&gt;PreparedStatement&lt;/code&gt; 防 SQL 注入，占位符 &lt;code&gt;?&lt;/code&gt;，编译一次执行多次&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Statement&lt;/code&gt; 拼接字符串有注入风险，不用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ResultSet&lt;/code&gt; 游标从 1 开始，&lt;code&gt;next()&lt;/code&gt; 移动指针，&lt;code&gt;getString(1)&lt;/code&gt; 按索引取&lt;/li&gt;
&lt;li&gt;事务隔离级别：读未提交、读已提交、可重复读、串行化&lt;/li&gt;
&lt;li&gt;连接池用 HikariCP（默认）、Druid，不要手动创建连接&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十六maven--gradle134-137&#34;&gt;十六、Maven / Gradle（134-137）&lt;/h2&gt;
&lt;ol start=&#34;134&#34;&gt;
&lt;li&gt;Maven 生命周期：&lt;code&gt;clean&lt;/code&gt; → &lt;code&gt;compile&lt;/code&gt; → &lt;code&gt;test&lt;/code&gt; → &lt;code&gt;package&lt;/code&gt; → &lt;code&gt;install&lt;/code&gt; → &lt;code&gt;deploy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;provided&lt;/code&gt; 作用域表示运行时由容器提供（如 servlet-api）&lt;/li&gt;
&lt;li&gt;依赖传递：&lt;code&gt;compile&lt;/code&gt; 传递，&lt;code&gt;test&lt;/code&gt; 不传递，&lt;code&gt;provided&lt;/code&gt; 不传递&lt;/li&gt;
&lt;li&gt;版本冲突用 &lt;code&gt;dependencyManagement&lt;/code&gt; 锁定版本，或用 &lt;code&gt;exclude&lt;/code&gt; 排除&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十七工具与调试138-142&#34;&gt;十七、工具与调试（138-142）&lt;/h2&gt;
&lt;ol start=&#34;138&#34;&gt;
&lt;li&gt;&lt;code&gt;System.out.println()&lt;/code&gt; 性能差，生产用日志框架（SLF4J + Logback）&lt;/li&gt;
&lt;li&gt;日志级别：ERROR &amp;gt; WARN &amp;gt; INFO &amp;gt; DEBUG &amp;gt; TRACE&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assert&lt;/code&gt; 默认禁用，需 &lt;code&gt;-ea&lt;/code&gt; 开启，生产慎用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Objects.requireNonNull()&lt;/code&gt; 判空抛 &lt;code&gt;NullPointerException&lt;/code&gt;，比手动 &lt;code&gt;if&lt;/code&gt; 简洁&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Optional&lt;/code&gt; 用来表示可能为 null 的返回值，不要用作字段或参数&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十八编码规范与常识143-150&#34;&gt;十八、编码规范与常识（143-150）&lt;/h2&gt;
&lt;ol start=&#34;143&#34;&gt;
&lt;li&gt;包名全小写，类名大驼峰，方法/变量小驼峰，常量全大写 + 下划线&lt;/li&gt;
&lt;li&gt;方法名用动词（&lt;code&gt;getUser&lt;/code&gt;），变量名用名词（&lt;code&gt;userName&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;布尔变量用 &lt;code&gt;is&lt;/code&gt; / &lt;code&gt;has&lt;/code&gt; / &lt;code&gt;can&lt;/code&gt; 开头（&lt;code&gt;isDeleted&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;一个 &lt;code&gt;.java&lt;/code&gt; 文件只能有一个 &lt;code&gt;public&lt;/code&gt; 类，文件名必须和 &lt;code&gt;public&lt;/code&gt; 类名一致&lt;/li&gt;
&lt;li&gt;构造器不能 &lt;code&gt;static&lt;/code&gt;，不能被 &lt;code&gt;final&lt;/code&gt; 修饰&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static&lt;/code&gt; 块在类加载时执行一次，&lt;code&gt;{}&lt;/code&gt; 实例块在构造器前执行&lt;/li&gt;
&lt;li&gt;匿名对象（&lt;code&gt;new User()&lt;/code&gt;）用完即抛，适合单次使用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;永远不要在线上环境用 &lt;code&gt;System.out&lt;/code&gt; 打印大对象，更不要用 &lt;code&gt;e.printStackTrace()&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
  </channel>
</rss>
