-
轻量级锁加锁时必须自旋而非挂起线程,因挂起/唤醒涉及用户态到内核态切换,开销远大于用户态空转几个CPU周期;JVM默认仅在多核环境下自旋,且自旋次数由自适应策略动态调整。
-
SpringBoot官方快速入门指南中的gradlew.batspring-boot:run命令存在误导——该语法适用于Maven,而Gradle项目应使用bootRun任务,否则会报“Cannotlocatetasksthatmatch'spring-boot:run'”错误。
-
新项目应选用slf4j+logback,而非java.util.logging;因JUL配置僵硬、MDC支持弱、异步难实现,而slf4j+logback灵活高效且生态完善,需确保classpath有且仅有一个绑定实现(如logback-classic)。
-
类的依赖关系指一个类使用另一个类的服务,表现为参数传递、实例创建或调用静态成员,而耦合描述类间依赖程度,高耦合导致修改扩散,低耦合提升模块独立性;为降低耦合,应遵循依赖倒置原则(DIP),使模块依赖抽象接口,里氏替换原则(LSP)确保继承合理,接口隔离原则(ISP)避免臃肿接口,开闭原则(OCP)支持扩展而不修改源码;实践中通过接口编程、依赖注入、工厂模式和合理分层实现低耦合,如业务层依赖DAO接口而非具体数据库实现,最终使系统更灵活、可维护。
-
Java8+推荐使用java.util.Base64,提供标准、URL安全和MIME三类编码器;编码需显式指定UTF-8字符集,解码失败多因输入含空白、URL编码或长度非4倍数;withoutPadding()去除填充符=,适用于URL/Token场景;与ApacheCommonsCodec混用需注意填充、换行及严格性差异。
-
用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()位置严重偏移——本质是匹配逻辑失败而非编码问题。