-
重写equals必须遵守自反性、对称性、传递性、一致性及null处理规范,否则引发集合异常;==比较引用而非内容;标准步骤:引用相等→类型与null校验→字段逐一对比;必须同步重写hashCode。
-
本文详解如何利用Collectors.groupingBy将对象流按自定义字符串键(由多个字段组合生成)高效分组,得到Map<String,List<T>>结构,避免冗余映射操作与类型不匹配问题。
-
Java并发编程核心在于理解内存模型、状态共享与协作机制,需掌握volatile、synchronized原理、JDK并发工具类边界、线程池调优及竞态排查方法。
-
Java的assert默认是关闭的,不加参数就白写Java编译器认得assert语句,但JVM默认禁用断言机制——哪怕你写了assertx>0;,运行时也完全不检查。这不是bug,是设计如此:断言只用于开发/测试阶段,生产环境默认关掉,避免性能开销和副作用。要让它生效,必须显式开启:运行时加-ea(-enableassertions)参数:java-eaMyApp只对某个包开启:java-ea:com.example...MyApp禁用某类断言(比如第三方库
-
TreeMap是唯一支持高效范围查询的有序Map,适用于日志归档、排行榜、前缀补全等场景;它强制排序、不支持null键、非线程安全,性能代价换来的是subMap等动态视图能力。
-
自定义ThreadFactory可为线程池线程指定统一、可识别的名称,解决默认命名(如pool-N-thread-M)缺乏业务上下文、不利于问题排查的问题;通过实现ThreadFactory接口、构造传入前缀与原子计数器、重写newThread设置setName,可生成如payment-processor-thread-1等规范名称,提升日志可读性、监控识别度和故障定位效率。
-
Lombok不支持直接为@RequiredArgsConstructor等注解生成的构造器添加JavaDoc;JavaDoc必须显式写在构造器声明处,而Lombok不会将类上方的JavaDoc自动“转发”给生成的构造器。
-
拆长表达式为带语义的中间变量,使每步意图清晰、便于调试复用;提取布尔标记简化分支逻辑;统一命名重复子表达式提升可维护性;配合早期返回降低嵌套深度。
-
是的,TreeSet底层基于红黑树实现,通过TreeMap封装,保证O(logn)增删查,依赖元素可比较性,不支持null,混用类型或排序逻辑错误会抛ClassCastException或NullPointerException。
-
indexOf和lastIndexOf是List接口方法,不支持原始数组;基本类型数组需转为包装类型再用Arrays.asList();返回-1表示未找到,非异常;依赖equals()比较,注意泛型与自动装箱陷阱。
-
开闭原则的核心是“对扩展开放、对修改关闭”,即通过接口/抽象类隔离变化点,新增功能只需添加实现类或子类,不修改原有稳定代码;常用策略模式、模板方法、依赖注入等实现。
-
Properties.load()读不到中文是因为默认用ISO-8859-1解码UTF-8文件导致乱码,应改用load(Reader)配合UTF-8编码的InputStreamReader;getResourceAsStream()返回null多因路径错误或资源未入classpath;Properties方法线程安全但并发load会覆盖;loadFromXML要求严格XML格式与编码声明一致。
-
静态类变量线程不安全,需通过synchronized锁、原子类、volatile(仅限简单赋值)、ThreadLocal或改用实例变量等方式保障线程安全。
-
FileOutputStream写文件为空或不全,因未调用close()或flush()导致缓冲区数据未落盘;应使用try-with-resources确保关闭,追加写需构造时传true;写中文须指定UTF-8编码;大文件应配合BufferedOutputStream优化性能。
-
Java内置三类核心类加载器:Bootstrap(C++实现,加载rt.jar)、Extension(加载lib/ext)、Application(加载-classpath);它们构成父子委托链,遵循双亲委派模型——先委托父加载器,失败后才自行加载,以保障核心类安全与类唯一性。