-
JVM是否启动JIT编译取决于方法调用或循环回边计数是否达到动态调整的阈值;其通过方法调用计数器和回边计数器识别热点,达阈值后提交C1/C2编译,但实际编译还受分层编译、代码缓存、GC等影响。
-
DateTimeFormatter线程安全且不可变,应避免SimpleDateFormat思维;优先用ISO预定义常量,自定义pattern需严守大小写与数量规则;解析须匹配具体类型,格式化前需手动处理时区。
-
不可靠。validate()返回false说明戳记获取后、校验前已有写操作,所有此前读取的字段值均可能不一致,须退至悲观锁或重试。
-
应使用日志框架的logger.error(String,Throwable)记录异常,而非System.out.println或e.printStackTrace(),因其能保留完整堆栈、添加时间戳/线程名/级别等上下文,并支持持久化、过滤与路由。
-
Character.isLetter()无法识别中文,应使用Character.isIdeographic()或UnicodeBlock组合判断;注意代理对、全角字符等边界情况。
-
M1/M2/M3Mac必须使用ARM64版JDK,验证方法:执行/usr/libexec/java_home-V看路径含arm64、java-version&&arch输出arm64、安装目录名或内容需为ARM原生;JDK版本按场景选:8(遗留系统)、11(企业稳定)、17(主流LTS)、21(最新LTS)、22(预研);推荐tar.gz或Homebrew安装而非DMG;环境变量须配.zshrc+动态java_home命令,且IDE需手动更新JDK路径。
-
Javarecord与模式匹配结合可简化不可变数据结构的类型判断和字段提取:instanceof支持直接解构、switch支持按类型和字段值分支、替代Visitor模式、构建类型安全解析流水线。
-
TextBlock默认压缩换行符为单空格,需显式设xml:space="preserve"或替换换行符;JSON错位多因BOM/零宽字符,应提前过滤;高亮需拼Run或换AvalonEdit;大SQL卡顿源于TwoWay绑定,应改OneWay并优化数据源。
-
接口中声明throwsIOException合法但不推荐,因其违背面向接口编程原则、增加调用方负担、阻碍实现替换;应优先使用UncheckedIOException或语义化运行时异常。
-
FairSync的tryAcquire通过调用hasQueuedPredecessors()体现“先来先服务”:若队列非空且头节点后继不是当前线程,则直接返回false,强制入队,杜绝插队,从加锁入口就保障公平性。
-
是的,OptionalInt更省内存——它用原生int字段存储,无装箱开销;而Optional依赖Integer.valueOf()装箱,必多分配对象,高频场景下GC与堆内存差异显著。
-
Record是Java16正式引入的不可变数据载体类,仅允许public字段、禁止继承、禁止实例/静态初始化块,自动生成构造器、访问器、equals/hashCode/toString,且字段默认final。
-
Files.move重命名必须显式指定REPLACE_EXISTING,同目录移动才安全;跨卷会退化为复制+删除,需预检文件系统一致性并校验后再操作。
-
拦截StatementHandler.prepare是最稳切入点,因其在SQL解析完成、参数未绑定、未预编译时可安全修改表名;需用正则精准提取from/join/update后首个标识符,结合白名单校验;通过反射修改BoundSql私有sql字段并及时恢复访问限制;分片键须由ThreadLocal传递且务必clear()。
-
InheritableThreadLocal在线程池中失效是因为其值仅在子线程创建时继承,而线程池复用线程导致后续任务无法触发继承逻辑;TransmittableThreadLocal通过显式捕获、传递、恢复值来解决该问题,需配合TtlExecutors包装线程池或手动包装任务,并注意初始化、copy()重写及清理时机。