第069篇 object 与 companion object:Kotlin 里的单例
本文深入剖析 `object` 与 `companion object` 的本质差异:二者虽均为单例,但字节码结构、初始化时机及 Java 可见性截然不同。`object` 编译为私有静态实例(饿汉式),而 `companion object` 是宿主类内的静态 `Companion` 实例,其初始化绑定类加载。`@JvmStatic` 和 `@JvmField` 不提升性能,而是改变 Java 调用形态与反射可见性。核心警示:慎用 `object` 持有可变状态,伴生对象避免耗时初始化——正确选型应基于作用域需求,而非便利性。
第072篇 中缀表达式与运算符重载:可读性的双刃剑
Kotlin运算符重载比Java更彻底:不仅支持`+ - * /`等映射为`plus`/`minus`等约定函数,还允许任意单参函数通过`infix`声明实现中缀调用(如`a to b`)。核心原则是——符号语义必须与原始含义一致(`+`即相加,`-`即取反或相减),滥用将损害可读性。
第044篇 ThreadLocal 原理:主线程到底能不能用
ThreadLocal核心在于“线程独享+弱引用Key+强引用Value”:每个线程持独立ThreadLocalMap,Key为ThreadLocal弱引用,Value强引用用户对象;若不显式remove,线程池复用时易致内存泄漏与数据串号。务必在finally中清理!
第027篇 ArrayList 源码与扩容机制:1.5 倍增长的细节
ArrayList面试高频题:JDK8中无参构造不分配数组,首次add才扩容至10;后续按1.5倍增长,不足时直取所需容量,上限为Integer.MAX_VALUE-8。扩容本质是Arrays.copyOf整段拷贝。关键要懂原理、避坑(如预估容量、非线程安全、subList陷阱)并结合工程实践。
第036篇 注解与元注解:Override 背后的机制
注解是附着于程序元素的结构化元数据,本身不执行逻辑,其作用完全取决于`@Retention`(生命周期)与`@Target`(作用位置)。`RUNTIME`级可反射读取,`CLASS`级仅存于字节码,`SOURCE`级编译即弃。元注解如`@Repeatable`(需容器)、`@Inherited`(仅类继承链生效)常被误用。编译期APT处理(如Room、Dagger)比运行时反射更高效。关键:显式声明Retention,勿信默认值;接口注解不被实现类继承;注解仅为意图声明,非功能保证。
第034篇 Iterator 与 fail-fast:并发修改异常的根源
Iterator 与 fail-fast 是 Java 集合的“防错机制”:通过 modCount 与 expectedModCount 校验,遍历中结构修改即抛 ConcurrentModificationException。它**不是并发安全保证**,仅单线程下尽早暴露错误;删除须用 it.remove(),多线程应选 CopyOnWriteArrayList 或加锁。
第011篇 this 与 super:最容易混淆的两个指向
面试官爱考`this`与`super`,因它是一面“能力试纸”:背概念者答定义,用过者讲场景,踩过坑者补边界。本文从原理、实战、避坑三维度拆解——`this`指当前实例,用于解遮蔽、构造转发、链式调用;`super`指父类部分,专用于调父构、访父成员。
当滚动逃离了框架 ——HarmonyOS Web 与原生混排滚动的冲突本质与解法
本文深入剖析鸿蒙 ArkUI 中 Web 组件与原生滚动容器混排时的边界问题(断档、撞墙、回弹叠加),指出其根源是“两个滚动世界缺乏通信协议”。系统提出三种解法:FIT_CONTENT(降维消除嵌套)、nestedScroll(声明式协调)、偏移量派发(命令式逐帧接管),并给出适用场景、配置要点与避坑指南。(239字)