-
大顶堆用数组实现时,节点i的左子为2i+1、右子为2i+2、父为(i-1)/2,且每个节点值≥子节点值;构建需shiftUp(插入后上浮)和shiftDown(堆顶替换后下沉),建堆从最后一个非叶子节点起调用shiftDown,时间复杂度O(n)。
-
HashedWheelTimer通过单线程驱动、固定tick间隔、O(1)任务插入及层级时间轮结构,显著降低高频心跳场景下的CPU和调度开销;IdleStateHandler默认集成该机制,支持10万连接仅用一个线程统一调度。
-
中介者模式通过引入中介者对象统一协调同事间交互,将网状依赖转为星型结构:同事只持中介者引用并委托事件,中介者持有所有同事引用并封装联动逻辑,避免直接引用和硬编码条件,提升可维护性与可测试性。
-
直接运行brewinstalljava安装的是OpenJDK21(截至2024年中),因Homebrew默认仅维护最新LTS(JDK21)和最新稳定版,不自动提供JDK8或17。
-
Phaser是Java中支持动态注册和多阶段同步的并发工具,结合了CountDownLatch与CyclicBarrier特性。通过register()注册线程,arriveAndAwaitAdvance()实现阶段同步,getPhase()获取当前阶段,arriveAndDeregister()实现阶段性退出,可灵活控制线程在不同阶段参与与退出;主线程需预先注册并最终调用arriveAndDeregister()结束控制;支持forceTermination()处理异常终止,适用于复杂生命周期的并行任务
-
正确生成不重复随机数需用洗牌算法或ThreadLocalRandom;避免重复种子,复用Random实例,多线程优选ThreadLocalRandom,唯一性需求结合UUID或时间戳。
-
可通过main方法args参数直接接收命令行配置字符串,启动时用空格分隔、程序内按key=value格式解析并存入Map,支持--key=value或-kvalue等增强写法,需注意Shell转义与引号包裹。
-
Map.compute()是Java8引入的原子性键值更新方法,接收key和BiFunction(k,v)→newV,支持累加、拼接、条件更新及删除(返回null),v为当前值(含null),无法区分键不存在与值为null。
-
根本原因是TreeSet默认依赖自然排序,要求元素实现Comparable接口;解决方案是显式提供Comparator或让类实现Comparable,二者必选其一,且需注意空值处理、类型匹配及首次add的测试覆盖。
-
零基础入门Java首选菜鸟教程与how2j.cn搭配使用:前者提供免配置在线运行环境快速上手,后者补足原理与错误调试;LintCodeJava入门路径清晰、题库分层实用;官方教程应重点研读练习题与Why?解析;自学精灵补齐工程部署与简历表达短板。
-
必须加-XX:+UseContainerSupport,否则-XX:MaxRAMPercentage等参数全失效;JDK8u191+默认未启用,不加则JVM按宿主机内存估算堆大小,极易OOMKilled。
-
ThreadLocal的key设为弱引用是为了避免阻断GC回收ThreadLocal实例,防止因线程长期存活导致内存泄漏;value保持强引用以保障语义一致性,其清理依赖ThreadLocalMap的探测式清理机制和显式remove()调用。
-
JVM类加载核心是“先到先得”机制,即按classpath中jar顺序扫描,同名类首次加载成功后,后续版本被忽略;冲突本质是加载顺序而非优先级强弱。
-
ZGC只负责单JVM内堆内存对象的低延迟回收,不参与跨节点“大变量分发”;后者属Spark/Flink等框架的广播机制,涉及序列化、网络传输与本地缓存,与垃圾回收器无关。
-
ConcurrentHashMap比Hashtable和synchronizedMap更快,因其采用分段锁(JDK7)或CAS+synchronized锁单个Node(JDK8+),读操作无锁、写操作仅局部加锁;而后者均使用全局锁,高并发下严重串行化。