-
新项目应选用slf4j+logback,而非java.util.logging;因JUL配置僵硬、MDC支持弱、异步难实现,而slf4j+logback灵活高效且生态完善,需确保classpath有且仅有一个绑定实现(如logback-classic)。
-
类的依赖关系指一个类使用另一个类的服务,表现为参数传递、实例创建或调用静态成员,而耦合描述类间依赖程度,高耦合导致修改扩散,低耦合提升模块独立性;为降低耦合,应遵循依赖倒置原则(DIP),使模块依赖抽象接口,里氏替换原则(LSP)确保继承合理,接口隔离原则(ISP)避免臃肿接口,开闭原则(OCP)支持扩展而不修改源码;实践中通过接口编程、依赖注入、工厂模式和合理分层实现低耦合,如业务层依赖DAO接口而非具体数据库实现,最终使系统更灵活、可维护。
-
用Counter.most_common(1)0可快速获取最高频元素,但需注意空列表报错、元素须可哈希;多最高频时需先求最大频次再筛选;不可哈希对象应转str或json.dumps处理。
-
MessageDigest不能加密,只生成不可逆的固定长度摘要;SHA-256是推荐算法,MD5和SHA-1已不安全;需注意线程不安全、编码一致性和digest()自动重置状态等关键细节。
-
本文详解VirtualBoxIKeyboard.putScancodes()接口使用的物理键盘扫描码(ScanCode)机制,阐明其与Java/Windows中虚拟键码(VK_P=0x50)的本质区别,并提供可运行的编码转换方案与实用建议。
-
static字段+私有构造非万能单例,因类初始化即创建实例,不适用于依赖外部资源或需延迟加载的场景;DCL必须用volatile防半初始化;枚举单例线程安全但无懒加载;Springsingleton是容器级而非JVM级。
-
绝大多数情况下catch块需记录日志,但仅在异常真正落地或不可恢复时(如Controller入口、定时任务主逻辑)打ERROR日志;避免层层重复打印,应由顶层统一拦截;输出堆栈须用log.error("msg",e)保留完整异常链。
-
while循环先判断条件再执行,若条件不成立则循环体不执行;2.dowhile循环先执行一次循环体再判断条件,确保循环体至少执行一次;3.需要至少执行一次时用dowhile,如用户输入验证;可跳过循环时用while。
-
Java反射异常的根本原因是被调用的目标方法或构造函数出错,InvocationTargetException仅为包装异常,需调用getCause()获取真实异常;常见原因包括目标方法内抛异常、类/方法未找到、权限不足、参数错误及上下文问题。
-
Java自定义异常需显式声明含Throwable的构造函数才能带原因抛出,否则编译报错;必须调用super(message,cause)初始化cause,漏写会导致getCause()返回null;实际应覆盖4种构造函数以确保异常链完整。
-
SortedSet.add()排序异常的根本原因是缺少有效比较逻辑:未实现Comparable或未传Comparator;常见错误包括修改比较字段、compareTo()不满足自反对称传递性、compare()误返回布尔值而非负/零/正值。
-
JavaPattern/Matcher在处理含Unicode字符(如℃、Ω)的字符串时,若正则表达式未正确覆盖目标字符(如大小写不匹配),会导致find()误判成功但group()返回空或null,且start()位置严重偏移——本质是匹配逻辑失败而非编码问题。
-
使用instanceof检查类型、泛型约束和封装安全转换可有效避免ClassCastException。示例:转换前用if(objinstanceofString)判断;优先使用List<String>等泛型集合减少强制转换;封装safeCast工具方法返回null而非抛异常;注意泛型擦除问题,如List<Integer>不可强转为List<String>,否则运行时报错。坚持类型检查与泛型设计可显著提升代码健壮性。
-
Java枚举构造器只能在枚举常量定义时显式调用,参数必须匹配且不可省略括号,访问修饰符须为private或package-private,字段应为final,初始化逻辑应延迟至getter中执行。
-
Collections.frequency适用于单元素频次统计,语义清晰但仅支持精确equals比较;Stream.groupingBy适合全量频次统计,性能更优但需注意null键和自定义对象的equals/hashCode实现。