-
DecimalFormat.getCurrencyInstance()必须显式传入Locale才能正确适配国家货币格式,否则依赖不可控的JVM默认区域设置;Locale决定格式惯例而非法定货币,多币种场景需结合Currency.getInstance()控制实际币种。
-
Semaphore通过许可机制限制并发线程数,初始化指定许可数量,线程需acquire()获取许可并release()释放,确保最多n个线程访问资源,常用于控制数据库连接等场景,支持公平与非公平模式,应结合try-finally防止许可泄漏。
-
最常见的幂等失效原因是拦截器未注册或注解未被Spring扫描到;需确保拦截器加@Component、启用CGLIB代理、注解含RUNTIME保留策略和METHOD目标,且避免this调用。
-
当前生效的JDK路径可通过whichjava和readlink-f(macOS用greadlink-f)定位,根目录为最终路径的父目录;Linux查/usr/lib/jvm,macOS查~/Library/Java/JavaVirtualMachines;Debian/Ubuntu还需checkupdate-alternatives--listjava。
-
关键在于让JAVA_HOME动态引用版本变量(如%JAVA_21_HOME%),而非硬编码路径;通过切换引用目标实现秒级JDK版本切换,PATH中仅保留%JAVA_HOME%\bin且置顶,确保命令优先调用正确版本。
-
热部署关键在“准”和“稳”,需监听ENTRY_CREATE、ENTRY_MODIFY(可选ENTRY_DELETE),配合去抖、绕过双亲委派的自定义类加载器及实例生命周期管理,确保类隔离与资源清理。
-
推荐组合优于继承,因其更契合业务可变性与可控性:组合明确区分“拥有什么功能”和“是什么类型”,避免继承的脆弱基类、单继承限制、语义失真及封装泄露问题,支持运行时切换、易测试与高内聚。
-
Java10+的Collectors.toUnmodifiableList()返回真正不可变List,基于JVM内置ImmutableCollections.ListN实现,内部数组privatefinal、无修改接口、序列化安全、反射防护,但需确保元素自身不可变。
-
Java异常层次旨在分粒度处理而非忽略错误:RuntimeException表逻辑错误无需强制捕获,checkedexception如IOException必须显式处理;catch顺序须从具体到宽泛,否则子类异常不可达;自定义异常应依是否需强制处理选择继承RuntimeException或Exception,并提供带cause构造函数。
-
ConcurrentHashMap迭代器非fail-safe而是弱一致性,不抛ConcurrentModificationException但不保证看到所有修改;它用分段锁+CAS+volatile实现线程安全,无modCount机制,设计取舍为高吞吐而非强一致性。
-
普通集合如ArrayList、HashMap非线程安全,多线程读写易致ConcurrentModificationException、数据丢失或结构损坏;Vector和Hashtable虽同步但粒度粗、性能差;并发集合如ConcurrentHashMap(分段锁/CAS+volatile)、CopyOnWriteArrayList等通过细粒度锁、无锁设计和原子操作解决并发问题。
-
类加载机制通过延迟解析符号引用实现规则类按需加载,配合ClassLoader隔离、接口抽象与Supplier封装,支持多租户热更新与配置驱动;静态字段初始化时机可控,但需规避继承导致的父类未初始化陷阱。
-
ArrayList序列化本身稳定,问题源于元素类未声明serialVersionUID或使用JDK移除API;应为业务类显式定义serialVersionUID、避免内部API,并优先采用JSON/Protobuf替代Java序列化。
-
Spring5.x+JDK8下XML配置虽被标记为legacy但仍可用,需锁定Spring5.3.37、仅引入spring-context/spring-beans、使用正确XSD地址,并注意构造注入优先、prototype行为及混合配置风险。
-
AQS底层使用基于CLH思想改造的虚拟双向链表,而非传统队列;其“虚拟”指无独立Queue容器,仅靠Node间prev/next指针构成逻辑队列,头尾通过CAS动态维护,轻量高效。