-
JavaTimer是单线程轻量级调度工具,适合简单低频任务;但非线程安全、异常导致线程终止、不支持并发,生产环境应优先使用ScheduledThreadPoolExecutor。
-
最可靠的判空方式是obj==null。它能准确识别未分配内存的对象,避免调用方法时抛出NullPointerException;其他方式如toString()或isEmpty()在null时会直接崩溃。
-
乐观读锁tryOptimisticRead成功当且仅当读期间未发生任何写操作;它仅读取版本戳,后续必须用validate验证,且只适用于轻量、无副作用的字段组合,validate为true后须立即使用数据。
-
brewinstallopenjdk默认安装openjdk@21(截至2024年中),路径为/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk,需手动设JAVA_HOME并用/usr/libexec/java_home-v21注册生效。
-
Java中用PrintWriter向数组指定的多个文件写入内容时,若未显式关闭流,会导致文件为空;推荐使用try-with-resources语法自动管理资源,确保数据写入并安全释放。
-
模块路径重复导出冲突本质是同一标识符在多处声明导致加载歧义或校验失败;需通过定位源头路径、消除路径级重复、保障变量/包名唯一性及建立CI防护机制四步系统解决。
-
ZGC采用彩色指针而非“深色指针”,其核心目标是实现亚毫秒级暂停,回收对象堆内存而非“变量”,不追求“秒级回收”。
-
本文介绍在Spigot/Bukkit插件开发中,通过分步插值的方式让玩家朝向(Yaw/Pitch)平滑转向目标方向,避免瞬时突变导致的视觉卡顿,核心是使用调度器按帧渐进更新旋转角度。
-
LocalTime专为“几点几分”设计,勿混用LocalDateTime或字符串拼接;解析需指定格式如"HH:mm";跨日区间判断需先判start.isAfter(end),再用isAfter(start)||isBefore(end);数据库映射须匹配TIME类型,JSON序列化需@JsonFormat指定pattern。
-
ReentrantLock需手动配对acquire/release,必须用try-finally确保unlock;默认非公平锁性能更优;Condition替代wait/notify须用while重检条件;仅在需超时、中断响应或多个条件队列时选用。
-
Map接口不能直接new,需选用HashMap、LinkedHashMap或TreeMap等实现类;put()返回旧值,get()返回null需用containsKey()或getOrDefault()区分;遍历时删除须用Iterator.remove()或removeIf();HashMap扩容耗时,应预估初始容量并重写键的equals()和hashCode()。
-
Java简易爬虫核心四步:1.用HttpURLConnection发GET请求,设User-Agent和超时;2.用BufferedReader读取HTML字符串;3.用Jsoup.parse()解析并CSS选择器提取数据;4.去重+限速后保存至本地文件。
-
NotDirectoryException是JavaNIO中目录操作失败后的运行时异常,非校验工具;应优先用Files.isDirectory()预判路径是否为有效目录,必要时组合Files.exists()和Files.isReadable()增强健壮性。
-
nextSetBit()本质是“从fromIndex(含)开始向高位找第一个值为true的位索引,找不到返回-1”;它无状态、不迭代,错误用法如i=bs.nextSetBit(i)会导致死循环,正确遍历应写为for(inti=bs.nextSetBit(0);i>=0;i=bs.nextSetBit(i+1))。
-
AtomicLongFieldUpdater可用于原子更新volatilelong字段,避免对象封装开销,适用于高并发场景下的计数器、状态标志等细粒度控制,需注意字段可见性、非静态及正确初始化。