-
Java中Set存对象需重写equals()和hashCode()方法,否则因默认引用比较导致去重失效;HashSet依赖二者协同判重,TreeSet则依赖Comparable或Comparator,且要求compareTo与equals语义一致。
-
javac是Java唯一官方命令行编译器,IDEA和构建工具默认调用它,Eclipse使用自研ECJ;新手推荐IDEA社区版,Eclipse适合教学与老项目,VSCode需配合Maven/Gradle;javac命令仅在查细节、控字节码兼容、CI调试时必要。
-
编译器报错“classXinheritsunrelateddefaultsforY()fromtypesAandB”;必须在实现类中重写冲突方法并显式调用A.super.Y()或B.super.Y(),否则无法通过编译。
-
当使用ArrayList<Item>存储多态对象(如Equipment和Product)时,需通过类型检查与安全向下转型才能调用子类特有方法,避免ClassCastException。
-
新项目应选用slf4j+logback,而非java.util.logging;因JUL配置僵硬、MDC支持弱、异步难实现,而slf4j+logback灵活高效且生态完善,需确保classpath有且仅有一个绑定实现(如logback-classic)。
-
拆分长逻辑表达式可提升代码可读性与维护性。通过引入描述性局部变量保存子条件,如isEligible=age>=18&&hasValidId;结合括号明确优先级并换行对齐,改善复杂判断的结构清晰度;在入口校验中使用卫语句提前返回,避免深层嵌套;最终使每个逻辑单元职责明确、易于测试和修改。
-
标量替换是JIT在逃逸分析确认对象不逃逸后,自动将对象字段拆为栈上局部变量、跳过new和堆分配的优化;它不由代码改写触发,需ServerVM、-XX:+DoEscapeAnalysis等参数配合,并通过JIT日志验证。
-
i++在JVM中非原子:iload_1读旧值→iinc1自增局部变量→istore_1写回旧值,三步可中断;volatile不保障复合操作原子性,字节码才是唯一可靠依据。
-
Java提供三种注释:单行注释//用于简要说明,多行注释/.../用于多行或禁用代码,文档注释/*.../生成API文档,合理使用可提升代码可读性与维护性。
-
JDK安装本身简单,真正卡住人的是环境变量配置:JAVA_HOME须设为JDK根目录(如D:\jdk-17),PATH添加%JAVA_HOME%\bin,CLASSPATH在JDK8+非必需但若设置需含.和tools.jar;Windows避免C:\ProgramFiles路径中的空格导致截断,修改后须重启终端。
-
TreeSet是基于红黑树的有序集合,元素按自然顺序或自定义比较器排序,不支持null值和重复元素,增删查时间复杂度为O(logn),适用于需要自动排序且去重的场景。
-
分布式锁用于解决多实例并发访问共享资源的冲突问题,Java中常用Redis和Zookeeper实现。1.Redis通过SET命令的NX和EX选项实现加锁,value使用唯一标识,结合Lua脚本保证解锁原子性,推荐使用Redisson框架,支持可重入和看门狗机制;需注意超时设置、误删锁及主从切换导致的锁失效问题。2.Zookeeper利用临时有序节点实现,客户端创建节点后判断是否最小序号,若是则获锁,否则监听前一节点,Curator的InterProcessMutex简化了实现,具备强一致性和公平性,适合高
-
retainAll()是原地过滤操作而非纯交集函数:调用A.retainAll(B)后A变为A∩B,B不变;返回boolean表示是否删除元素,不能用于判断交集存在;性能上ArrayList版为O(m×n),应将参数转HashSet优化;HashSet版接近O(m),更符合集合交集语义。
-
开启MyBatisSQL日志需同时配置BaseJdbcLogger=DEBUG和JDBC驱动参数追踪(如MySQL加profileSQL=true),否则仅显示问号而无实际参数值。
-
for(;;)是合法语法,等价于while(true),三部分均可省略,JVM无特殊处理;适用场景包括严格限制变量作用域、不确定重试次数及底层轮询,但禁用于固定次数循环或finally块中。