-
策略模式通过组合实现运行时算法切换,适用于频繁更换算法场景;模板方法通过继承固定流程结构,适用于流程稳定、步骤局部可变的场景。
-
@Retention(RetentionPolicy.RUNTIME)是前提,否则注解编译后即丢弃,运行时无法通过反射获取;必须搭配@Target指定作用位置,且注解元素需为常量类型、有合法默认值,反射读取时须判空并从实际声明类中获取。
-
Java中char是16位UTF-16编码单元,可表示BMP字符(如'中'),但辅助平面字符(如?)需代理对;操作字符串应使用codePointCount、codePoints等API而非charAt/length。
-
Duration.between返回Duration对象,以纳秒存储但需显式调用toMillis()获取毫秒值;应统一用Instant.now()而非混用System.currentTimeMillis();LocalDateTime不可直接使用,须转为Instant;高频场景优先考虑System.nanoTime()。
-
Integer.numberOfTrailingZeros返回int二进制末尾连续0的个数,如8(1000)→3、0→32;用于判断2的幂等场景,底层常映射为CPU的tzcnt指令,时间复杂度O(1)。
-
Gradle卡在“StartingDaemon”本质是本地守护进程启动失败,主因包括JVM参数冲突、gradle.properties错误配置、IDE占用锁文件或临时目录权限异常;应先执行gradle--stop并清理daemon目录锁文件,再通过--no-daemon验证,最后调整gradle.properties中的org.gradle.jvmargs参数。
-
Java动态规划是求解最优化问题的思想,核心为三步:定义状态、写状态转移方程、确定初始值与计算顺序,依赖最优子结构和重叠子问题两大特征。
-
System.arraycopy()高效复制数组,需预先创建目标数组;2.Arrays.copyOf()简化复制并支持扩容缩容;3.clone()实现基本类型深拷贝、对象数组浅拷贝;4.Arrays.copyOfRange()复制数组片段。根据性能、完整性及范围需求选择合适方法。
-
newThread()一用就卡,因每次创建都触发系统调用、分配8MB内核栈、切换态,1000次即耗时百毫秒且占8GB虚拟内存;CachedThreadPool无上限更危险;应使用有界ThreadPoolExecutor并合理配置参数。
-
Console类仅在真实终端有效,IDE中System.console()返回null;需判空降级;Scanner无终端限制但缓冲区易出错;Console.readPassword()是唯一安全密码输入方式。
-
本文详解Scanner.hasNextInt()的工作原理与典型误用场景,通过对比try-catch与hasNextInt()两种输入校验策略,指导开发者在需连续读取两个整数时,如何避免阻塞、跳过无效输入并确保程序健壮性。
-
Java中初始化变量需注意:1.成员变量有默认值,局部变量必须显式初始化;2.初始化顺序按代码顺序,静态先于实例,避免前向引用;3.静态块用于静态变量初始化,实例块用于对象创建时的逻辑,均按书写顺序执行;4.包装类型默认为null,使用时需防NullPointerException。正确初始化提升程序健壮性。
-
notifyAll()仅将等待线程移入锁竞争队列,不直接执行;线程需重新竞争锁,且wait必须用while循环检查条件,配合同一volatile或同步保护的条件变量,并在synchronized块中对同一对象调用。
-
Runtime.gc()不会强制触发垃圾回收,仅是向JVM发出建议,实际执行与否由JVM决定;生产环境中调用基本无效,还可能干扰GC策略。
-
localStorage仅适合存储非敏感、可公开的轻量数据,如主题偏好、表单草稿、界面状态、“记住我”UI状态、排序筛选偏好;必须用JSON.stringify()写入、JSON.parse()读取并处理null和异常;禁存密码、token等敏感信息。