-
ThreadLocal是为每个线程提供独立副本的变量工具,其值存储在各线程的threadLocals(ThreadLocalMap)中,key为弱引用,value为强引用。
-
Objects.equals()更安全因其先判空再委托,避免空指针异常;Objects.requireNonNull()用于明确拒绝null并抛出带提示的异常;nonNull/isNull适合条件判断;toString()支持默认值且无副作用。
-
应记录可预期但不可控的外部异常(如IOException、SQLException),而非NullPointerException等逻辑错误;RuntimeException除非可恢复,否则应抛出并保留异常链;日志仅在全局处理器中记录一次,级别依业务影响而定,且需配置%ex输出堆栈。
-
ArrayList比LinkedList更适合联系人管理,因其支持O(1)随机访问,适合遍历、分页和索引查询;高频头插删场景除外。
-
Java的Matcher.replaceAll()不支持Perl风格的\U(全大写)或\L(全小写)转义序列,无法仅靠替换字符串完成大小写转换;必须结合编程逻辑(如toUpperCase())或自定义Appendable替换逻辑。
-
使用CopyOnWriteArrayList管理监听器,通过单线程Executor串行化事件执行,结合不可变事件对象与volatile关键字,确保注册、触发、处理全过程线程安全。
-
明确异常类型并分层记录日志,使用自定义异常和异常链保留上下文,在全局处理器中统一记录ERROR日志,避免吞异常或重复打印,确保问题可追溯。
-
BankAccount类需在构造和方法中强制约束状态:balance初始化为0.0,withdraw校验金额正且余额充足,异常信息含具体余额;用double或BigDecimal存金额,accountNumber设为final,增减操作返回boolean。
-
Java的java.util.regex不支持变长回溯断言,因此无法使用(?<=SecondaryParty.*?)这类含量词的look-behind;替代方案是通过普通匹配+捕获组提取目标内容,既兼容Java,又简洁高效。
-
使用ViewCompat.setOnApplyWindowInsetsListener监听软键盘高度时,若直接返回原始insets会导致状态栏背景色丢失;正确做法是调用ViewCompat.onApplyWindowInsets(v,insets)将insets交由系统默认处理,既保留状态栏/导航栏样式,又确保自定义逻辑生效。
-
Collectors.counting返回Long类型计数结果,用于统计流中元素数量;可单独使用统计总数,如fruits.stream().collect(Collectors.counting())得5;常与groupingBy结合实现分类计数,如按水果名称分组统计得{orange=1,banana=2,apple=2};也可基于对象属性分组,如按Person的city字段分组得{Beijing=2,Shanghai=2,Guangzhou=1};还能按条件动态分组,如按年龄段(age/10*10)统计
-
本文介绍两种精确截断double值小数点后两位(向下截断,非四舍五入)的可靠方法:使用DecimalFormat配合RoundingMode.DOWN,或通过BigDecimal的setScale()实现无损精度控制。
-
受检异常是编译期契约而非强制加锁,用于显式建模外部依赖的不确定性;适用于可预见且可恢复的失败(如IO、SQL异常),需try-catch或throws处理,空catch、泛化捕获、盲目throws属典型误用。
-
StringBuilder是单线程大量字符串拼接的首选,因其基于可扩容char[]避免频繁GC;应避免误用StringBuffer、简单拼接或需格式化/正则的场景。
-
Java环境搭建完成后,需依次验证:1.java-version确认JRE就绪;2.javac-version确认JDK编译能力;3.编译运行HelloWorld.java验证全流程;4.检查JAVA_HOME是否指向JDK根目录且生效。