-
活锁是线程持续响应冲突、反复退让却无法推进;饥饿是线程可运行但因调度或资源分配不公平而长期得不到执行;死锁是线程互相等待对方释放锁而永久阻塞。
-
购物流程需实现从浏览到下单的闭环。1.流程包括商品浏览、加购、结算、创建订单、支付与确认,关键点为购物车结构设计、订单原子性与幂等性控制。2.购物车用RedisHash存储,支持未登录临时保存,登录后合并数据,提供增删改查接口并提示价格变动。3.订单创建时校验商品有效性,冻结库存,生成主子表信息,使用@Transactional保证事务,订单号采用雪花算法或时间+用户ID规则。4.支付对接支付宝/微信,设计订单状态机,处理异步回调签名验证与幂等,通过延迟队列实现超时关闭。系统需结合缓存、消息队列与事务保障
-
new关键字创建对象时先触发类加载五阶段,待<clinit>执行完毕才分配内存并调用<init>;对象内存布局含对象头、实例数据、对齐填充;finalize已废弃,推荐Cleaner;GCRoots包括栈变量、静态属性、常量、JNI引用及被锁对象。
-
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()实现无损精度控制。