[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-config":3,"primary-menu":20,"tags-cloud":109,"tagposts-java-2":293},{"config":4,"socialLinks":19},{"title":5,"subtitle":6,"logoUrl":7,"faviconUrl":8,"footerText":9,"beianIcp":10,"beianPublicSecurity":9,"seoDescription":11,"seoKeywords":12,"homepageTitle":13,"homepageSubtitle":14,"analyticsHeadCode":15,"planetQrcodeUrl":16,"planetIntroHtml":9,"planetCtaText":17,"updatedAt":18},"编码世界","用编码改变世界","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002F2026\u002F09\u002F2f277021172f43f6bb34e1c115760b7f.png","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002F2026\u002F09\u002Fdcbad022e68c4a729a5dc4997a9bba8a.png","","苏ICP备2026073884号","编码世界（mashangan.com）是面向 Java 后端与 Go 语言的系统化编程教程站：提供\nMyBatis Plus、Lombok、Java 8、IDEA、Docker 等原创图文教程，以及 JVM、并发、\nSpring、MySQL、Redis、消息队列、计算机网络等大厂面试八股题库，另有可落地的\n项目实战系列，帮你从入门到精通。","编码世界,Java教程,Go语言教程,Docker教程,MyBatis Plus教程,Lombok教程, Java 8新特性,IDEA教程,Java面试题,八股文,JVM面试题,Java并发面试题, MySQL面试题,Redis面试题,Spring面试题,消息队列面试题,高并发,分库分表, Netty面试题,计算机网络面试题,AI Agent,RAG,程序员学习路线","Java全栈系统化编程教程","覆盖 MyBatis Plus、Lombok、Java 8、IDEA、Go、Docker 等原创图文教程，配套大厂面试八股题库，从入门到精通，持续更新","\u003Cscript>\nvar _hmt = _hmt || [];\n(function() {\n  var hm = document.createElement(\"script\");\n  hm.src = \"https:\u002F\u002Fhm.baidu.com\u002Fhm.js?f00af7e56d956c02e11efed4131379b0\";\n  var s = document.getElementsByTagName(\"script\")[0]; \n  s.parentNode.insertBefore(hm, s);\n})();\n\u003C\u002Fscript>\n","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002F2026\u002F09\u002Fc1a8f5de46584d3eb0bc762c180a5db9.png","扫码加入知识星球","2026-10-05T13:09:51.904487Z",[],{"metadata":21,"spec":24,"menuItems":35},{"name":22,"creationTimestamp":23},"primary","2026-09-12T06:13:55.024154Z",{"displayName":25,"menuItems":26},"主菜单",[27,28,29,30,31,32,33,34],"88c3f10b-321c-4092-86a8-70db00251b74","menu-item-izrtmxer","c4c814d1-0c2c-456b-8c96-4864965fee94","menu-item-tags","menu-item-column","menu-item-tools","menu-item-zsxq","menu-item-ocrxlczu",[36,45,55,64,73,82,91,100],{"displayName":37,"metadata":38,"spec":40,"status":43,"children":44},"首页",{"name":27,"creationTimestamp":39},"2026-09-12T06:13:54.422830Z",{"displayName":37,"href":41,"priority":42,"menuName":22},"\u002F",0,{"displayName":37,"href":41},[],{"displayName":46,"metadata":47,"spec":49,"status":53,"children":54},"Java面试八股",{"name":28,"creationTimestamp":48},"2026-09-13T09:42:02.854891Z",{"displayName":46,"href":50,"target":51,"priority":52,"menuName":22},"\u002Fjava-interview","_self",1,{"displayName":46,"href":50},[],{"displayName":56,"metadata":57,"spec":59,"status":62,"children":63},"文章",{"name":29,"creationTimestamp":58},"2026-09-12T06:13:54.457307Z",{"displayName":56,"href":60,"priority":61,"menuName":22},"\u002Farchives",2,{"displayName":56,"href":60},[],{"displayName":65,"metadata":66,"spec":68,"status":71,"children":72},"标签",{"name":30,"creationTimestamp":67},"2026-10-07T00:42:42.754151Z",{"displayName":65,"href":69,"priority":70,"menuName":22},"\u002Ftags",3,{"displayName":65,"href":69},[],{"displayName":74,"metadata":75,"spec":77,"status":80,"children":81},"项目实战",{"name":31,"creationTimestamp":76},"2026-09-14T00:35:08.138170Z",{"displayName":74,"href":78,"target":51,"priority":79,"menuName":22},"\u002Fcolumn",4,{"displayName":74,"href":78},[],{"displayName":83,"metadata":84,"spec":86,"status":89,"children":90},"在线工具",{"name":32,"creationTimestamp":85},"2026-09-14T00:35:08.171474Z",{"displayName":83,"href":87,"target":51,"priority":88,"menuName":22},"\u002Ftools",5,{"displayName":83,"href":87},[],{"displayName":92,"metadata":93,"spec":95,"status":98,"children":99},"知识星球",{"name":33,"creationTimestamp":94},"2026-09-14T00:35:08.199145Z",{"displayName":92,"href":96,"target":51,"priority":97,"menuName":22},"\u002Fzsxq",6,{"displayName":92,"href":96},[],{"displayName":101,"metadata":102,"spec":104,"status":107,"children":108},"特价云服务",{"name":34,"creationTimestamp":103},"2026-09-25T15:30:59.201614Z",{"displayName":101,"href":105,"target":51,"priority":106,"menuName":22},"\u002Fserver",7,{"displayName":101,"href":105},[],[110,117,124,131,138,145,152,159,166,172,178,184,191,197,203,209,215,221,227,233,239,245,251,257,263,269,275,281,287],{"metadata":111,"spec":113,"postCount":116},{"name":112},"tag-04980744",{"displayName":114,"slug":115},"面试题","interview",118,{"metadata":118,"spec":120,"postCount":123},{"name":119},"tag-93f725a0",{"displayName":121,"slug":122},"Java","java",68,{"metadata":125,"spec":127,"postCount":130},{"name":126},"tag-05b6053c",{"displayName":128,"slug":129},"Docker","docker",43,{"metadata":132,"spec":134,"postCount":137},{"name":133},"tag-1cba77c3",{"displayName":135,"slug":136},"IDEA","idea",32,{"metadata":139,"spec":141,"postCount":144},{"name":140},"tag-116a0109",{"displayName":142,"slug":143},"数字孪生","digital-twin",19,{"metadata":146,"spec":148,"postCount":151},{"name":147},"tag-a2fb95ac",{"displayName":149,"slug":150},"MyBatis Plus","mybatis-plus",18,{"metadata":153,"spec":155,"postCount":158},{"name":154},"tag-cc6220f9",{"displayName":156,"slug":157},"Lombok","lombok",15,{"metadata":160,"spec":162,"postCount":165},{"name":161},"tag-2a2d595e",{"displayName":163,"slug":164},"Spring","spring",10,{"metadata":167,"spec":169,"postCount":165},{"name":168},"tag-1d8a4975",{"displayName":170,"slug":171},"消息队列","mq",{"metadata":173,"spec":175,"postCount":165},{"name":174},"tag-17245299",{"displayName":176,"slug":177},"并发","concurrency",{"metadata":179,"spec":181,"postCount":165},{"name":180},"tag-4921c0e2",{"displayName":182,"slug":183},"AI","ai",{"metadata":185,"spec":187,"postCount":190},{"name":186},"tag-53bb7900",{"displayName":188,"slug":189},"卫星仿真","satellite",9,{"metadata":192,"spec":194,"postCount":88},{"name":193},"tag-62377bcf",{"displayName":195,"slug":196},"Spring Cloud","spring-cloud",{"metadata":198,"spec":200,"postCount":88},{"name":199},"tag-81c3b080",{"displayName":201,"slug":202},"MySQL","mysql",{"metadata":204,"spec":206,"postCount":88},{"name":205},"tag-86a1b907",{"displayName":207,"slug":208},"Redis","redis",{"metadata":210,"spec":212,"postCount":88},{"name":211},"tag-18897dcf",{"displayName":213,"slug":214},"Elasticsearch","elasticsearch",{"metadata":216,"spec":218,"postCount":88},{"name":217},"tag-6ce80d8e",{"displayName":219,"slug":220},"JVM","jvm",{"metadata":222,"spec":224,"postCount":88},{"name":223},"tag-aa4e1b8c",{"displayName":225,"slug":226},"Dubbo","dubbo",{"metadata":228,"spec":230,"postCount":88},{"name":229},"tag-9e30c249",{"displayName":231,"slug":232},"Netty","netty",{"metadata":234,"spec":236,"postCount":88},{"name":235},"tag-2199ace5",{"displayName":237,"slug":238},"ZooKeeper","zookeeper",{"metadata":240,"spec":242,"postCount":88},{"name":241},"tag-7c298a76",{"displayName":243,"slug":244},"设计模式","design-pattern",{"metadata":246,"spec":248,"postCount":88},{"name":247},"tag-6cf6cea9",{"displayName":249,"slug":250},"高可用","high-availability",{"metadata":252,"spec":254,"postCount":88},{"name":253},"tag-918786ab",{"displayName":255,"slug":256},"分库分表","sharding",{"metadata":258,"spec":260,"postCount":88},{"name":259},"tag-91e02cd2",{"displayName":261,"slug":262},"计算机网络","network",{"metadata":264,"spec":266,"postCount":88},{"name":265},"tag-dd302f94",{"displayName":267,"slug":268},"操作系统","os",{"metadata":270,"spec":272,"postCount":88},{"name":271},"tag-1b359d87",{"displayName":273,"slug":274},"Tomcat","tomcat",{"metadata":276,"spec":278,"postCount":79},{"name":277},"tag-f0d71b77",{"displayName":279,"slug":280},"MyBatis","mybatis",{"metadata":282,"spec":284,"postCount":52},{"name":283},"tag-a118a308",{"displayName":285,"slug":286},"时序数据库","tsdb",{"metadata":288,"spec":290,"postCount":42},{"name":289},"tag-34d1f91f",{"displayName":291,"slug":292},"Go","go",{"page":61,"size":294,"total":123,"items":295,"first":309,"last":309,"hasNext":304,"hasPrevious":304,"totalPages":79},20,[296,335,364,393,422,451,486,515,544,573,602,631,660,689,723,752,780,807,834,861],{"metadata":297,"spec":300,"status":311,"categories":316,"tags":328},{"name":298,"creationTimestamp":299},"post-jc-iterator-fail-fast-6950a006","2026-09-13T10:00:55.410836Z",{"title":301,"slug":302,"cover":9,"excerpt":303,"publishTime":305,"categories":306,"tags":308,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"什么是 fail-fast 机制？","jc-iterator-fail-fast",{"raw":9,"autoGenerate":304},true,"2026-09-13T10:00:55.460328Z",[307],"java-collection",[119,112],false,"PUBLIC",{"permalink":312,"excerpt":313,"lastModifyTime":314,"phase":315},"\u002Farchives\u002Fjc-iterator-fail-fast","一、定义 在用迭代器遍历集合时，如果集合结构被修改（增\u002F删），迭代器会立即抛出 ConcurrentModificationException，这就是 fail-fast。 二、实现原理 集合内部维护 modCount 记录结构修改次数。迭代器创建时记录 expectedModCount = mod","2026-09-16T09:13:48.072882Z","PUBLISHED",[317],{"metadata":318,"spec":323,"status":326,"postCount":88},{"name":307,"creationTimestamp":319,"labels":320,"annotations":321},"2026-09-13T09:13:25.521651Z",{"haloweb.section":115},{"tutorial.halo.run\u002Fstatus":322},"updating",{"displayName":324,"slug":307,"cover":9,"description":325,"priority":165,"hideFromList":309,"preventParentPostCascadeQuery":309},"Java 集合面试题","Java 集合框架面试题：HashMap、ConcurrentHashMap 等核心容器的结构与源码原理。",{"permalink":327,"postCount":88,"visiblePostCount":88},"\u002Fcategories\u002Fjava-collection",[329,332],{"metadata":330,"spec":331},{"name":119},{"displayName":121,"slug":122},{"metadata":333,"spec":334},{"name":112},{"displayName":114,"slug":115},{"metadata":336,"spec":339,"status":346,"categories":350,"tags":357},{"name":337,"creationTimestamp":338},"post-jc-set-impl-56908363","2026-09-13T10:00:55.238233Z",{"title":340,"slug":341,"cover":9,"excerpt":342,"publishTime":343,"categories":344,"tags":345,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"HashSet 和 TreeSet 的区别？","jc-set-impl",{"raw":9,"autoGenerate":304},"2026-09-13T10:00:55.284648Z",[307],[112,119],{"permalink":347,"excerpt":348,"lastModifyTime":349,"phase":315},"\u002Farchives\u002Fjc-set-impl","一、底层实现 HashSet：内部是 HashMap，元素作为 HashMap 的 key，value 是固定 Object。 TreeSet：内部是 TreeMap，基于红黑树。 二、对比 维度 HashSet TreeSet 有序性 无序 自然排序或定制排序 元素要求 重写 equals\u002Fhas","2026-09-16T09:13:47.112793Z",[351],{"metadata":352,"spec":355,"status":356,"postCount":88},{"name":307,"creationTimestamp":319,"labels":353,"annotations":354},{"haloweb.section":115},{"tutorial.halo.run\u002Fstatus":322},{"displayName":324,"slug":307,"cover":9,"description":325,"priority":165,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":327,"postCount":88,"visiblePostCount":88},[358,361],{"metadata":359,"spec":360},{"name":112},{"displayName":114,"slug":115},{"metadata":362,"spec":363},{"name":119},{"displayName":121,"slug":122},{"metadata":365,"spec":368,"status":375,"categories":379,"tags":386},{"name":366,"creationTimestamp":367},"post-jc-hashmap-concurrent-64bd43b8","2026-09-13T10:00:55.033490Z",{"title":369,"slug":370,"cover":9,"excerpt":371,"publishTime":372,"categories":373,"tags":374,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"ConcurrentHashMap 如何保证线程安全？","jc-hashmap-concurrent",{"raw":9,"autoGenerate":304},"2026-09-13T10:00:55.084097Z",[307],[119,112],{"permalink":376,"excerpt":377,"lastModifyTime":378,"phase":315},"\u002Farchives\u002Fjc-hashmap-concurrent","一、JDK 1.7：分段锁 内部是 Segment 数组，每个 Segment 是一个小 HashMap，put 时只锁当前 Segment，并发度 = Segment 数（默认 16）。 二、JDK 1.8：CAS + synchronized 数组节点为空时，用 CAS 插入，无锁。 节点不为空","2026-09-16T09:13:46.058129Z",[380],{"metadata":381,"spec":384,"status":385,"postCount":88},{"name":307,"creationTimestamp":319,"labels":382,"annotations":383},{"haloweb.section":115},{"tutorial.halo.run\u002Fstatus":322},{"displayName":324,"slug":307,"cover":9,"description":325,"priority":165,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":327,"postCount":88,"visiblePostCount":88},[387,390],{"metadata":388,"spec":389},{"name":119},{"displayName":121,"slug":122},{"metadata":391,"spec":392},{"name":112},{"displayName":114,"slug":115},{"metadata":394,"spec":397,"status":404,"categories":408,"tags":415},{"name":395,"creationTimestamp":396},"post-jc-hashmap-principle-21acf5b7","2026-09-13T10:00:54.826428Z",{"title":398,"slug":399,"cover":9,"excerpt":400,"publishTime":401,"categories":402,"tags":403,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"HashMap 的底层实现原理？","jc-hashmap-principle",{"raw":9,"autoGenerate":304},"2026-09-13T10:00:54.884321Z",[307],[112,119],{"permalink":405,"excerpt":406,"lastModifyTime":407,"phase":315},"\u002Farchives\u002Fjc-hashmap-principle","一、数据结构 JDK 1.8 后 HashMap = 数组 + 链表 + 红黑树。 数组是主体，通过 (n-1) & hash 定位桶。 哈希冲突时，同桶元素挂成链表。 链表长度 ≥ 8 且数组长度 ≥ 64 时，链表转红黑树；节点数 ≤ 6 时转回链表。 二、put 流程 计算 key 的 has","2026-09-16T09:13:44.648455Z",[409],{"metadata":410,"spec":413,"status":414,"postCount":88},{"name":307,"creationTimestamp":319,"labels":411,"annotations":412},{"haloweb.section":115},{"tutorial.halo.run\u002Fstatus":322},{"displayName":324,"slug":307,"cover":9,"description":325,"priority":165,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":327,"postCount":88,"visiblePostCount":88},[416,419],{"metadata":417,"spec":418},{"name":112},{"displayName":114,"slug":115},{"metadata":420,"spec":421},{"name":119},{"displayName":121,"slug":122},{"metadata":423,"spec":426,"status":433,"categories":437,"tags":444},{"name":424,"creationTimestamp":425},"post-jc-arraylist-vs-linkedlist-064907ec","2026-09-13T10:00:54.635697Z",{"title":427,"slug":428,"cover":9,"excerpt":429,"publishTime":430,"categories":431,"tags":432,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"ArrayList 和 LinkedList 的区别？","jc-arraylist-vs-linkedlist",{"raw":9,"autoGenerate":304},"2026-09-13T10:00:54.707259Z",[307],[119,112],{"permalink":434,"excerpt":435,"lastModifyTime":436,"phase":315},"\u002Farchives\u002Fjc-arraylist-vs-linkedlist","一、底层结构 ArrayList：基于动态数组，连续内存存储。 LinkedList：基于双向链表，节点分散存储。 二、性能对比 操作 ArrayList LinkedList 随机访问 O(1) O(n) 尾部追加 O(1)（均摊） O(1) 中间插入\u002F删除 O(n)（需移动元素） O(1)（定位","2026-09-16T09:13:43.711113Z",[438],{"metadata":439,"spec":442,"status":443,"postCount":88},{"name":307,"creationTimestamp":319,"labels":440,"annotations":441},{"haloweb.section":115},{"tutorial.halo.run\u002Fstatus":322},{"displayName":324,"slug":307,"cover":9,"description":325,"priority":165,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":327,"postCount":88,"visiblePostCount":88},[445,448],{"metadata":446,"spec":447},{"name":119},{"displayName":121,"slug":122},{"metadata":449,"spec":450},{"name":112},{"displayName":114,"slug":115},{"metadata":452,"spec":455,"status":463,"categories":467,"tags":479},{"name":453,"creationTimestamp":454},"post-jb-interface-vs-abstract-de319222","2026-09-13T10:00:54.430321Z",{"title":456,"slug":457,"cover":9,"excerpt":458,"publishTime":459,"categories":460,"tags":462,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"接口和抽象类有什么区别？","jb-interface-vs-abstract",{"raw":9,"autoGenerate":304},"2026-09-13T10:00:54.500384Z",[461],"java-basic",[112,119],{"permalink":464,"excerpt":465,"lastModifyTime":466,"phase":315},"\u002Farchives\u002Fjb-interface-vs-abstract","一、核心区别 维度 抽象类 接口 关键字 abstract class interface 继承 单继承 多实现 构造方法 有 无 成员变量 任意 仅 public static final 方法实现 可有抽象\u002F具体方法 默认方法、静态方法（JDK 8+） 设计目的 \"is-a\" 共性抽取 \"can","2026-09-16T09:13:43.230261Z",[468],{"metadata":469,"spec":473,"status":476,"postCount":478},{"name":461,"creationTimestamp":470,"labels":471,"annotations":472},"2026-09-13T09:13:25.495129Z",{"haloweb.section":115},{"tutorial.halo.run\u002Fstatus":322},{"displayName":474,"slug":461,"cover":9,"description":475,"priority":106,"hideFromList":309,"preventParentPostCascadeQuery":309},"Java 基础面试题","Java 基础面试题：语言特性、面向对象、异常体系、泛型、反射与常用 API。",{"permalink":477,"postCount":478,"visiblePostCount":478},"\u002Fcategories\u002Fjava-basic",8,[480,483],{"metadata":481,"spec":482},{"name":112},{"displayName":114,"slug":115},{"metadata":484,"spec":485},{"name":119},{"displayName":121,"slug":122},{"metadata":487,"spec":490,"status":497,"categories":501,"tags":508},{"name":488,"creationTimestamp":489},"post-jb-overload-vs-override-76d8b85a","2026-09-13T10:00:54.236416Z",{"title":491,"slug":492,"cover":9,"excerpt":493,"publishTime":494,"categories":495,"tags":496,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"重载（overload）和重写（override）的区别？","jb-overload-vs-override",{"raw":9,"autoGenerate":304},"2026-09-13T10:00:54.292575Z",[461],[119,112],{"permalink":498,"excerpt":499,"lastModifyTime":500,"phase":315},"\u002Farchives\u002Fjb-overload-vs-override","一、定义 重载：同一个类中，方法名相同，参数列表（类型\u002F个数\u002F顺序）不同。与返回值无关。 重写：子类重新实现父类的方法，方法签名（名称、参数、返回值）必须一致。 二、对比 维度 重载 重写 位置 同类 父子类 参数列表 必须不同 必须相同 返回值 可不同 相同或协变 权限 可不同 不能更严格 绑定时","2026-09-16T09:13:41.019008Z",[502],{"metadata":503,"spec":506,"status":507,"postCount":478},{"name":461,"creationTimestamp":470,"labels":504,"annotations":505},{"haloweb.section":115},{"tutorial.halo.run\u002Fstatus":322},{"displayName":474,"slug":461,"cover":9,"description":475,"priority":106,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":477,"postCount":478,"visiblePostCount":478},[509,512],{"metadata":510,"spec":511},{"name":119},{"displayName":121,"slug":122},{"metadata":513,"spec":514},{"name":112},{"displayName":114,"slug":115},{"metadata":516,"spec":519,"status":526,"categories":530,"tags":537},{"name":517,"creationTimestamp":518},"post-jb-final-keyword-80890cb4","2026-09-13T10:00:54.018756Z",{"title":520,"slug":521,"cover":9,"excerpt":522,"publishTime":523,"categories":524,"tags":525,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"final 关键字有哪些用法？","jb-final-keyword",{"raw":9,"autoGenerate":304},"2026-09-13T10:00:54.080507Z",[461],[119,112],{"permalink":527,"excerpt":528,"lastModifyTime":529,"phase":315},"\u002Farchives\u002Fjb-final-keyword","一、修饰类 final 修饰的类不能被继承，如 String、Math。常用于工具类或不希望被扩展的类。 二、修饰方法 final 方法不能被子类重写，防止子类改变父类行为。构造方法隐式为 final。 三、修饰变量 成员变量：必须在声明时、构造方法或初始化块中赋值，赋值后不可改。 局部变量：使用前","2026-09-16T09:13:42.613292Z",[531],{"metadata":532,"spec":535,"status":536,"postCount":478},{"name":461,"creationTimestamp":470,"labels":533,"annotations":534},{"haloweb.section":115},{"tutorial.halo.run\u002Fstatus":322},{"displayName":474,"slug":461,"cover":9,"description":475,"priority":106,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":477,"postCount":478,"visiblePostCount":478},[538,541],{"metadata":539,"spec":540},{"name":119},{"displayName":121,"slug":122},{"metadata":542,"spec":543},{"name":112},{"displayName":114,"slug":115},{"metadata":545,"spec":548,"status":555,"categories":559,"tags":566},{"name":546,"creationTimestamp":547},"post-jb-string-immutable-6381213f","2026-09-13T10:00:53.805615Z",{"title":549,"slug":550,"cover":9,"excerpt":551,"publishTime":552,"categories":553,"tags":554,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"String 为什么是不可变的？","jb-string-immutable",{"raw":9,"autoGenerate":304},"2026-09-13T10:00:53.873603Z",[461],[112,119],{"permalink":556,"excerpt":557,"lastModifyTime":558,"phase":315},"\u002Farchives\u002Fjb-string-immutable","一、不可变的体现 String 内部用 final char[]（JDK 9 后是 byte[]）存储字符，且没有提供修改内部数组的方法，一旦创建内容就不能改。所谓\"修改\"其实是创建新对象。 二、设计原因 字符串常量池复用：相同字面量共享同一对象，节省内存。 线程安全：不可变对象天然线程安全，多线程","2026-09-16T09:13:41.662582Z",[560],{"metadata":561,"spec":564,"status":565,"postCount":478},{"name":461,"creationTimestamp":470,"labels":562,"annotations":563},{"haloweb.section":115},{"tutorial.halo.run\u002Fstatus":322},{"displayName":474,"slug":461,"cover":9,"description":475,"priority":106,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":477,"postCount":478,"visiblePostCount":478},[567,570],{"metadata":568,"spec":569},{"name":112},{"displayName":114,"slug":115},{"metadata":571,"spec":572},{"name":119},{"displayName":121,"slug":122},{"metadata":574,"spec":577,"status":584,"categories":588,"tags":595},{"name":575,"creationTimestamp":576},"post-jb-int-vs-integer-5ddd4c42","2026-09-13T10:00:53.622572Z",{"title":578,"slug":579,"cover":9,"excerpt":580,"publishTime":581,"categories":582,"tags":583,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"int 和 Integer 有什么区别？","jb-int-vs-integer",{"raw":9,"autoGenerate":304},"2026-09-13T10:00:53.684952Z",[461],[119,112],{"permalink":585,"excerpt":586,"lastModifyTime":587,"phase":315},"\u002Farchives\u002Fjb-int-vs-integer","一、本质区别 int 是 Java 的 8 种基本数据类型之一，直接存数值，占 4 字节，默认值 0。 Integer 是 int 的包装类，是对象，存的是指向堆中对象的引用，默认值 null。 二、自动装箱与拆箱 Integer a = 10;          \u002F\u002F 自动装箱：Integer.v","2026-09-16T09:13:40.094479Z",[589],{"metadata":590,"spec":593,"status":594,"postCount":478},{"name":461,"creationTimestamp":470,"labels":591,"annotations":592},{"haloweb.section":115},{"tutorial.halo.run\u002Fstatus":322},{"displayName":474,"slug":461,"cover":9,"description":475,"priority":106,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":477,"postCount":478,"visiblePostCount":478},[596,599],{"metadata":597,"spec":598},{"name":119},{"displayName":121,"slug":122},{"metadata":600,"spec":601},{"name":112},{"displayName":114,"slug":115},{"metadata":603,"spec":606,"status":613,"categories":617,"tags":624},{"name":604,"creationTimestamp":605},"post-why-override-equals-and-hashcode-4d166dda","2026-09-13T09:11:40.565423Z",{"title":607,"slug":608,"cover":9,"excerpt":609,"publishTime":610,"categories":611,"tags":612,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"为什么重写 equals 时一定要重写 hashCode？","why-override-equals-and-hashcode",{"raw":9,"autoGenerate":304},"2026-09-13T09:11:40.612965Z",[461],[112,119],{"permalink":614,"excerpt":615,"lastModifyTime":616,"phase":315},"\u002Farchives\u002Fwhy-override-equals-and-hashcode","一、先说结论 这是 Java 的通用约定：如果两个对象通过 equals 比较相等，那么它们的 hashCode 必须相同。只重写 equals 不重写 hashCode，会破坏这个约定，导致对象在 HashMap、HashSet 等集合中行为异常。 二、HashMap 的存取过程 HashMap ","2026-09-16T09:13:39.635536Z",[618],{"metadata":619,"spec":622,"status":623,"postCount":478},{"name":461,"creationTimestamp":470,"labels":620,"annotations":621},{"haloweb.section":115},{"tutorial.halo.run\u002Fstatus":322},{"displayName":474,"slug":461,"cover":9,"description":475,"priority":106,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":477,"postCount":478,"visiblePostCount":478},[625,628],{"metadata":626,"spec":627},{"name":112},{"displayName":114,"slug":115},{"metadata":629,"spec":630},{"name":119},{"displayName":121,"slug":122},{"metadata":632,"spec":635,"status":642,"categories":646,"tags":653},{"name":633,"creationTimestamp":634},"post-string-stringbuilder-stringbuffer-0b7b9e93","2026-09-13T09:11:40.343284Z",{"title":636,"slug":637,"cover":9,"excerpt":638,"publishTime":639,"categories":640,"tags":641,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"String、StringBuilder 和 StringBuffer 的区别？","string-stringbuilder-stringbuffer",{"raw":9,"autoGenerate":304},"2026-09-13T09:11:40.408558Z",[461],[119,112],{"permalink":643,"excerpt":644,"lastModifyTime":645,"phase":315},"\u002Farchives\u002Fstring-stringbuilder-stringbuffer","一、可变性不同 String 是不可变类，内部用 final 修饰字符数组。对字符串做拼接实际上会创建新的 String 对象。 StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder，内容可变，拼接时直接修改内部数组。 二、线程安全不同 St","2026-09-16T09:13:39.164827Z",[647],{"metadata":648,"spec":651,"status":652,"postCount":478},{"name":461,"creationTimestamp":470,"labels":649,"annotations":650},{"haloweb.section":115},{"tutorial.halo.run\u002Fstatus":322},{"displayName":474,"slug":461,"cover":9,"description":475,"priority":106,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":477,"postCount":478,"visiblePostCount":478},[654,657],{"metadata":655,"spec":656},{"name":119},{"displayName":121,"slug":122},{"metadata":658,"spec":659},{"name":112},{"displayName":114,"slug":115},{"metadata":661,"spec":664,"status":671,"categories":675,"tags":682},{"name":662,"creationTimestamp":663},"post-double-equals-vs-equals-03a956b5","2026-09-13T09:11:40.146587Z",{"title":665,"slug":666,"cover":9,"excerpt":667,"publishTime":668,"categories":669,"tags":670,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"== 和 equals 的区别是什么？","double-equals-vs-equals",{"raw":9,"autoGenerate":304},"2026-09-13T09:11:40.197516Z",[461],[112,119],{"permalink":672,"excerpt":673,"lastModifyTime":674,"phase":315},"\u002Farchives\u002Fdouble-equals-vs-equals","一、== 的作用 == 是 Java 的运算符，它的比较规则取决于两边的类型： 基本数据类型（byte、short、int、long、float、double、char、boolean）：比较的是字面值是否相等。 引用数据类型：比较的是两个引用是否指向堆中的同一个对象（即内存地址是否相同）。 int","2026-09-16T09:13:38.582777Z",[676],{"metadata":677,"spec":680,"status":681,"postCount":478},{"name":461,"creationTimestamp":470,"labels":678,"annotations":679},{"haloweb.section":115},{"tutorial.halo.run\u002Fstatus":322},{"displayName":474,"slug":461,"cover":9,"description":475,"priority":106,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":477,"postCount":478,"visiblePostCount":478},[683,686],{"metadata":684,"spec":685},{"name":112},{"displayName":114,"slug":115},{"metadata":687,"spec":688},{"name":119},{"displayName":121,"slug":122},{"metadata":690,"spec":693,"status":702,"categories":705,"tags":716},{"name":691,"creationTimestamp":692},"post-what-is-lombok-eacf45e9","2026-09-12T08:29:54.692339Z",{"title":694,"slug":695,"cover":696,"excerpt":697,"publishTime":699,"categories":700,"tags":701,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"Lombok 主要作用是什么？它是干嘛的？","what-is-lombok","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002F2026\u002F09\u002F922b2acb7905478591abdef83076dd88.png",{"raw":698,"autoGenerate":309},"Lombok 是一个超酷的 Java 库，它能让你的 Java 代码变得简洁、高效，还能帮你省去很多繁琐的工作，堪称偷懒神器，企业级开发必备。","2026-09-12T08:29:54.750221Z",[157],[154,119],{"permalink":703,"excerpt":698,"lastModifyTime":704,"phase":315},"\u002Farchives\u002Fwhat-is-lombok","2026-09-30T03:52:57.675213Z",[706],{"metadata":707,"spec":710,"status":714,"postCount":158},{"name":157,"creationTimestamp":708,"annotations":709},"2026-09-12T08:22:44.622640Z",{"tutorial.halo.run\u002Fstatus":322},{"displayName":711,"slug":157,"cover":712,"description":713,"priority":88,"hideFromList":309,"preventParentPostCascadeQuery":309},"Lombok 使用教程","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Ftutorial-cover-lombok.png","Lombok 使用教程：常用注解与底层原理、IDEA 配置、序列化坑与团队使用规范。",{"permalink":715,"postCount":158,"visiblePostCount":158},"\u002Fcategories\u002Flombok",[717,720],{"metadata":718,"spec":719},{"name":154},{"displayName":156,"slug":157},{"metadata":721,"spec":722},{"name":119},{"displayName":121,"slug":122},{"metadata":724,"spec":727,"status":736,"categories":739,"tags":745},{"name":725,"creationTimestamp":726},"post-sneaky-throws-c1701b9c","2026-09-12T08:29:53.976459Z",{"title":728,"slug":729,"cover":730,"excerpt":731,"publishTime":733,"categories":734,"tags":735,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"Lombok @SneakyThrows 注解：简化异常操作","sneaky-throws","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002F2026\u002F09\u002Fce216b9ce35f4b398296cc2db4400aab.png",{"raw":732,"autoGenerate":309},"@SneakyThrows 用来偷偷地抛出检查型异常（checked exception），而无需显式地在方法签名中声明 throws 或者使用 try-catch。对于需要捕获或声明的异常，@SneakyThrows 注解可以让方法绕过这一步。","2026-09-12T08:29:54.036824Z",[157],[119,154],{"permalink":737,"excerpt":732,"lastModifyTime":738,"phase":315},"\u002Farchives\u002Fsneaky-throws","2026-09-30T04:24:17.142234Z",[740],{"metadata":741,"spec":743,"status":744,"postCount":158},{"name":157,"creationTimestamp":708,"annotations":742},{"tutorial.halo.run\u002Fstatus":322},{"displayName":711,"slug":157,"cover":712,"description":713,"priority":88,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":715,"postCount":158,"visiblePostCount":158},[746,749],{"metadata":747,"spec":748},{"name":119},{"displayName":121,"slug":122},{"metadata":750,"spec":751},{"name":154},{"displayName":156,"slug":157},{"metadata":753,"spec":756,"status":764,"categories":767,"tags":773},{"name":754,"creationTimestamp":755},"post-lombok-value-e86c89a7","2026-09-12T08:29:53.354870Z",{"title":757,"slug":758,"cover":9,"excerpt":759,"publishTime":761,"categories":762,"tags":763,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"Lombok @Value 注解：创建不可变类","lombok-value",{"raw":760,"autoGenerate":309},"Lombok 的 @Value 注解用于简化不可变对象的创建。不可变对象（Immutable Object）在创建后，其内部状态无法改变，具备线程安全的特性，适合并发环境中共享数据的场景。","2026-09-12T08:29:53.417301Z",[157],[154,119],{"permalink":765,"excerpt":760,"lastModifyTime":766,"phase":315},"\u002Farchives\u002Flombok-value","2026-09-30T21:46:10.902063Z",[768],{"metadata":769,"spec":771,"status":772,"postCount":158},{"name":157,"creationTimestamp":708,"annotations":770},{"tutorial.halo.run\u002Fstatus":322},{"displayName":711,"slug":157,"cover":712,"description":713,"priority":88,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":715,"postCount":158,"visiblePostCount":158},[774,777],{"metadata":775,"spec":776},{"name":154},{"displayName":156,"slug":157},{"metadata":778,"spec":779},{"name":119},{"displayName":121,"slug":122},{"metadata":781,"spec":784,"status":792,"categories":794,"tags":800},{"name":782,"creationTimestamp":783},"post-lombok-to-string-c4811b47","2026-09-12T08:29:52.773514Z",{"title":785,"slug":786,"cover":9,"excerpt":787,"publishTime":789,"categories":790,"tags":791,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"Lombok @ToString 注解：快速打印对象内容","lombok-to-string",{"raw":788,"autoGenerate":309},"Lombok 的 @ToString 注解用于自动生成 toString() 方法，帮助快速打印对象的内容，以便调试或日志记录。默认情况下，`@ToString` 会将类中所有非静态字段包含在 toString() 方法中，并按字段声明的顺序显示字段值。","2026-09-12T08:29:52.835200Z",[157],[154,119],{"permalink":793,"excerpt":788,"lastModifyTime":766,"phase":315},"\u002Farchives\u002Flombok-to-string",[795],{"metadata":796,"spec":798,"status":799,"postCount":158},{"name":157,"creationTimestamp":708,"annotations":797},{"tutorial.halo.run\u002Fstatus":322},{"displayName":711,"slug":157,"cover":712,"description":713,"priority":88,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":715,"postCount":158,"visiblePostCount":158},[801,804],{"metadata":802,"spec":803},{"name":154},{"displayName":156,"slug":157},{"metadata":805,"spec":806},{"name":119},{"displayName":121,"slug":122},{"metadata":808,"spec":811,"status":819,"categories":821,"tags":827},{"name":809,"creationTimestamp":810},"post-lombok-principle-d40a8209","2026-09-12T08:29:52.089871Z",{"title":812,"slug":813,"cover":9,"excerpt":814,"publishTime":816,"categories":817,"tags":818,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"Lombok 实现原理是什么？","lombok-principle",{"raw":815,"autoGenerate":309},"Lombok 的核心是利用 Java 注解处理器 和 AST（抽象语法树）修改 技术，在编译阶段动态插入代码。","2026-09-12T08:29:52.164133Z",[157],[119,154],{"permalink":820,"excerpt":815,"lastModifyTime":766,"phase":315},"\u002Farchives\u002Flombok-principle",[822],{"metadata":823,"spec":825,"status":826,"postCount":158},{"name":157,"creationTimestamp":708,"annotations":824},{"tutorial.halo.run\u002Fstatus":322},{"displayName":711,"slug":157,"cover":712,"description":713,"priority":88,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":715,"postCount":158,"visiblePostCount":158},[828,831],{"metadata":829,"spec":830},{"name":119},{"displayName":121,"slug":122},{"metadata":832,"spec":833},{"name":154},{"displayName":156,"slug":157},{"metadata":835,"spec":838,"status":846,"categories":848,"tags":854},{"name":836,"creationTimestamp":837},"post-lombok-log-7cf20461","2026-09-12T08:29:51.501796Z",{"title":839,"slug":840,"cover":9,"excerpt":841,"publishTime":843,"categories":844,"tags":845,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"Lombok @Log 系列注解: 简化日志记录","lombok-log",{"raw":842,"autoGenerate":309},"Lombok 提供了一系列 @Log 注解，用于自动生成日志记录器实例，简化 Java 类中日志的定义和使用。这些注解支持常见的日志框架，比如 java.util.logging、Log4j、Log4j2、Slf4j 等。","2026-09-12T08:29:51.557453Z",[157],[119,154],{"permalink":847,"excerpt":842,"lastModifyTime":766,"phase":315},"\u002Farchives\u002Flombok-log",[849],{"metadata":850,"spec":852,"status":853,"postCount":158},{"name":157,"creationTimestamp":708,"annotations":851},{"tutorial.halo.run\u002Fstatus":322},{"displayName":711,"slug":157,"cover":712,"description":713,"priority":88,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":715,"postCount":158,"visiblePostCount":158},[855,858],{"metadata":856,"spec":857},{"name":119},{"displayName":121,"slug":122},{"metadata":859,"spec":860},{"name":154},{"displayName":156,"slug":157},{"metadata":862,"spec":865,"status":873,"categories":875,"tags":881},{"name":863,"creationTimestamp":864},"post-lombok-getter-setter-c542a7fe","2026-09-12T08:29:50.887267Z",{"title":866,"slug":867,"cover":9,"excerpt":868,"publishTime":870,"categories":871,"tags":872,"priority":42,"pinned":309,"deleted":309,"visible":310,"allowComment":304},"Lombok @Getter @Setter 注解: 简化属性操作","lombok-getter-setter",{"raw":869,"autoGenerate":309},"Lombok 提供的 @Getter 和 @Setter 注解是最常用的注解之一，主要用于自动生成类的 getter 和 setter 方法。这些方法可以大大减少手动编写代码的工作量，让代码更简洁、更易读。","2026-09-12T08:29:50.940298Z",[157],[154,119],{"permalink":874,"excerpt":869,"lastModifyTime":766,"phase":315},"\u002Farchives\u002Flombok-getter-setter",[876],{"metadata":877,"spec":879,"status":880,"postCount":158},{"name":157,"creationTimestamp":708,"annotations":878},{"tutorial.halo.run\u002Fstatus":322},{"displayName":711,"slug":157,"cover":712,"description":713,"priority":88,"hideFromList":309,"preventParentPostCascadeQuery":309},{"permalink":715,"postCount":158,"visiblePostCount":158},[882,885],{"metadata":883,"spec":884},{"name":154},{"displayName":156,"slug":157},{"metadata":886,"spec":887},{"name":119},{"displayName":121,"slug":122}]