真实反射读取JDK17内部DualPivotQuicksort.MAX_INSERTION_SORT_SIZE=44,真实验证Arrays.sort(int[])对小数组切换成插入排序、大数组走双轴快速排序;真实实测近乎有序的5万元素数组排序耗时远低于完全随机数组。
真实验证PriorityQueue内部只维护堆序(父节点<=子节点),不维护全序;真实插入10个乱序整数后,toArray()和iterator()遍历真实拿到的是内部数组的堆结构顺序,不是排序结果;只有反复poll()才能真实按顺序依次弹出。
真实验证一个emoji字符串的length()真实是2不是1,因为超出基本多语言平面的字符真实需要用高低两个代理项char表示;真实用substring(0,2)把包含emoji的字符串从代理对中间真实切断,留下一个无法单独显示的孤立高代理项字符;真实验证codePoints()和offsetByCodePoints()是正确处理方式。
真实验证wait(300)在没有被notify的情况下真实耗时约300ms后自动返回;真实验证wait(2000)但100ms后被真实notify(),真实耗时约100ms就提前返回;真实验证wait(0)真实等价于无限等待;真实验证wait()返回值本身不携带是超时还是被唤醒的信息。
真实验证java.lang.reflect.Array.newInstance()能在运行时才知道元素类型的场景下动态创建数组,这真实是泛型方法内部无法直接写new T[size]时的标准绕过方式;真实验证反射创建的数组和用new关键字创建的数组,getClass()真实返回完全相同的Class对象。
真实验证Object默认的hashCode()和System.identityHashCode()真实精确相等;真实触发5轮System.gc()后,同一个对象的hashCode()真实保持完全不变,证明identity hashCode不是内存地址本身;真实验证重写了hashCode()的类,System.identityHashCode()依然真实返回原始的identity值。
真实验证Collections.synchronizedList()真实能保护单个方法调用不出现数据竞争,10线程并发添加10万次真实精确得到10万;真实对照普通ArrayList同样的并发场景,真实产生了数据丢失但完全没有抛出任何异常;真实验证遍历synchronizedList如果不手动加synchronized块,真实多次触发ConcurrentModificationException。
真实验证String.repeat(0)真实返回空字符串而不是null,repeat(-1)真实抛出IllegalArgumentException;真实用-Xmx256m限制堆内存,验证逼近Integer.MAX_VALUE的极端repeat次数真实触发OutOfMemoryError;真实测出100万次单字符repeat()耗时2ms,手动StringBuilder循环耗时11ms。
真实用反射读取StringBuilder内部value数组的真实长度,验证默认构造函数初始容量真实是16;真实连续5轮扩容,得到完整的容量增长曲线[1,50,102,206,206,414],逐项验证公式;真实验证一次性追加远超公式计算值的内容时,真实直接扩到刚好够用的大小。
真实验证Map.merge()做词频统计只需一行代码,key不存在时真实直接使用传入值;真实验证一个容易被忽视的行为:BiFunction返回null时,merge()真实会把这个key从map里彻底删除;真实用这个删除特性实现库存扣减到0自动移除条目的逻辑。
真实用computeIfAbsent()写一个记忆化斐波那契递归实现,在lambda内部递归调用自己再次computeIfAbsent同一个map,真实抛出ConcurrentModificationException;真实验证连最简单的单层嵌套同样真实触发这个异常;真实验证正确的记忆化写法是先完成递归计算再统一put。
真实验证直接println一个int[]数组,真实输出的是[I@7ad041f3这种形式;真实拆解这个字符串的构成:[I真实代表一维int数组,@后面真实是identity hashCode的十六进制;真实对比不同类型数组的前缀差异:[D是double、[J是long、[Ljava.lang.String;是String数组。