-
Stream.distinct()依赖equals()和hashCode()判断重复,自定义类需重写二者且逻辑一致;并行流中顺序不保证;无法按字段去重;内存开销大,大数据量慎用。
-
死锁的本质是争夺顺序不一致与持有资源后继续等待导致的闭环,典型如两线程反序申请mtx1和mtx2:A持mtx1等mtx2,B持mtx2等mtx1,满足互斥、持有并等待、不可剥夺、循环等待四条件。
-
for-each循环本质是编译器对Iterator的语法糖,要求对象实现Iterable接口并提供每次返回新迭代器的iterator()方法;其背后执行Iterator的hasNext()、next()三步操作,支持fail-fast但不支持倒退或修改结构。
-
要计算两个时间点的秒数差,必须使用Instant等时间点类型而非Duration;推荐用Duration.between(start,end).toSeconds()获取四舍五入后的整秒数,注意LocalDateTime直接相减存在时区陷阱。
-
newSingleThreadExecutor本质是单线程+无界队列的特殊封装,内部使用ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue()),任务严格FIFO执行且自动恢复线程,但不暴露线程控制权。
-
Java数组通过运行时类型检查保障安全,泛型依赖编译期类型擦除和约束;因泛型类型信息在运行时不存在,故禁止创建泛型数组,避免破坏类型安全。
-
StringJoiner是Java8引入的专用于结构化字符串拼接的工具类,支持分隔符、前缀、后缀、空值定制、合并及长度统计,底层基于StringBuilder实现,轻量高效且线程不安全。
-
Java中无法重写addSuppressed()来处理关闭异常,因其是Throwable类的final方法,仅存储抑制异常而不执行逻辑;正确做法是在close()中捕获并决策、避免抛出检查异常、利用getSuppressed()分析抑制异常、实现幂等close(),或分离close()与显式释放方法。
-
高并发场景下提升Java处理能力需合理使用多线程与锁。1.使用线程池(如ExecutorService)管理线程,避免资源耗尽;2.合理拆分任务,避免线程调度开销或CPU利用率不足;3.异步化I/O操作,减少线程阻塞;4.控制锁粒度,优先使用ReentrantLock以获得更灵活的锁机制;5.缩小锁范围,仅对共享资源修改部分加锁;6.读多写少场景使用ReentrantReadWriteLock;7.使用ConcurrentHashMap、AtomicInteger等无锁结构减少锁开销;8.善用Concur
-
高低位互换是对单个整数的二进制位重新排列,如16位数将高8位与低8位交换,32位数则按字节翻转实现大小端转换。
-
同步日志显著拖累CPU,因主线程参与I/O等待、字符串拼接、锁竞争和内存分配;Logback/Log4j1.x默认同步Appender致线程卡顿;未用isDebugEnabled()导致无效拼接与序列化;ConsoleAppender因System.out锁性能极低;AsyncAppender存在队列满阻塞、丢日志及崩溃丢失风险。
-
当被测方法未调用verify中指定的模拟方法时,ArgumentCaptor.getValue()会抛出异常;改用getAllValues()可安全返回空列表,再通过逻辑判断提取首个值或返回null。
-
错误。JDK11的ZGC是实验性功能,仅支持最大4GB堆,不支持TB级堆,更无法实现亚毫秒停顿;JDK15起才通过多级页表、4位染色指针和完整读屏障真正支持TB级堆与稳定亚毫秒STW。
-
Java中用int[][]graph实现Prim算法邻接代价存储,graphi存i到j边权,无边时为Integer.MAX_VALUE;需双向赋值、对角线设为MAX_VALUE以统一处理。
-
Collections.replaceAll方法用于替换List中所有与旧值相等的元素为新值,返回是否发生替换。