-
getOrDefault能避开NullPointerException,因为它在key不存在时直接返回指定默认值而非null,避免后续调用空对象方法触发异常;但需注意key为null、泛型擦除导致的类型不匹配及默认值语义歧义等问题。
-
Files.lines()流式读取大文件更简洁且默认UTF-8,但须try-with-resources防句柄泄漏;需处理编码探测、NUL截断、大小写匹配、滑动窗口上下文、正则预编译、行号控制及高亮安全替换。
-
本文详解如何正确处理JSON字符串中嵌套JSON(即JSON内容以转义字符串形式存在)的反序列化难题,重点解决Jackson因未正确转义导致的解析异常,并提供可落地的代码示例与最佳实践。
-
continue用于for循环中跳过当前迭代,需在if内使用以跳过特定i值,仅作用于当前循环;Java不支持带标签的continue。
-
通过修改server.xml的appBase属性或使用独立context.xml文件可自定义Tomcat部署路径,结合IDE配置实现热部署,提升开发效率;生产环境应关闭自动部署、隔离部署目录并限制权限以保障安全。
-
非静态同步方法锁this对象,静态同步方法锁类的Class对象;锁对象不一致会导致线程安全失效,应统一锁粒度并避免误用字符串或公共常量作锁。
-
LinkedBlockingQueue的“增加方法”包括add(失败抛IllegalStateException)、offer(失败返回false)、put(满则阻塞)和带超时的offer(超时返回false),均线程安全,默认无界。
-
JDK6的substring共享原字符串char[],导致内存泄漏;JDK7u6+改为复制新数组,彻底解耦。可通过检查value.length是否等于原数组长度判断是否安全,兼容方案是newString(s.substring(start,end))。
-
CountDownLatch构造参数必须为正整数,因内部volatileint计数器要求非负,负数抛IllegalArgumentException;0虽合法但导致await立即返回,易误判任务完成。
-
Arrays.asList返回的List不可修改,底层为固定大小的Arrays$ArrayList,调用add/remove抛UnsupportedOperationException;需可变列表应显式拷贝为newArrayList(Arrays.asList(...))或使用Arrays.stream().collect(Collectors.toList())。
-
i++与++i字节码差异在于栈操作:i++需暂存旧值(iload→iinc→istore/dup),++i直接取新值(iload→iinc→iload),赋值结果取决于“旧值/新值”被赋给左边,且禁止单表达式多次自增。
-
成员变量属于对象,静态变量属于类本身;前者各对象独立副本、堆内存分配、需实例访问、可被子类隐藏;后者所有对象共享、方法区分配、可类名访问、仅能被隐藏、静态方法不可直接访问。
-
Java连MySQL需配置驱动、时区、字符集、连接池四要素;MySQL8.0+必须用mysql-connector-j8.x驱动,URL须含serverTimezone和characterEncoding=utf8mb4,SpringBoot需显式配置Hikari参数并确保资源正确关闭。
-
Java项目统一开发环境需通过可执行配置落地:锁定JDK版本、使用MavenWrapper、统一编码与换行符、提交IDE格式化规则及脚本,确保新成员gitclone后五分钟内开箱即编译。
-
Java文件未声明package时归入默认包,但会导致命名包无法引用、模块系统不兼容、构建工具支持弱等问题;应始终显式声明非空package。