-
for-each遍历时调用remove()会抛ConcurrentModificationException,因modCount与expectedModCount不一致;正确做法是用Iterator.remove()、removeIf()或倒序for循环。
-
ForkJoinPool适用于天然可分的递归任务(如数组求和、树遍历),依赖工作窃取提升效率;应优先使用commonPool(),合理设置拆分阈值,避免用于非递归或阻塞型任务。
-
接口更灵活因其分离“做什么”与“怎么做”,调用方仅依赖行为契约;实现可替换(如MySQL/MongoDB/Mock)、测试易模拟、编译期解耦;需注意实现方法必须public、多default方法须显式重写;非所有场景都需接口,应聚焦可变点。
-
多线程高频生成随机数且无需可重现序列时应优先用ThreadLocalRandom;它为每线程提供独立实例避免同步开销,而Random适用于需固定种子复现序列的场景。
-
编译错误是javac编译阶段因语法或类型问题导致无法生成.class文件;运行错误是程序执行中触发RuntimeException而崩溃;逻辑错误是代码无异常但结果不符合预期。
-
Java17+模块化项目必须显式声明module-info.java,否则触发模块校验导致NoClassDefFoundError等错误;需正确放置路径、配置模块名、声明依赖与导出,并使用--module-path启动。
-
StreamAPI是声明式、不可变、支持并行的数据处理抽象,不修改原集合、不存储数据,仅描述操作;适合一次性链式转换、中等数据量、需延迟或并行场景,不适合反复遍历、极简操作、极致性能或需break/continue的场景。
-
Java中的不可变集合指List.of()、Set.of()、Map.of()等返回的真正不可修改实例,创建后大小、元素、顺序均不可变,任何修改操作抛UnsupportedOperationException,且不共享可变状态;而Collections.unmodifiableXXX()仅为只读代理,原始集合仍可变。
-
构造函数抛出IOException会导致对象半初始化问题。因部分副作用无法回滚、破坏依赖注入与链式调用、抑制JVM逃逸分析优化,应改用静态工厂方法封装异常。
-
线程中断是协作机制,调用interrupt()仅设置中断状态;2.任务需主动检查状态或处理InterruptedException实现取消;3.阻塞方法可抛出该异常并清除状态;4.Future.cancel(true)利用中断取消任务;5.不可中断操作应使用可中断替代方案或超时机制;6.关键是任务自我感知中断并优雅退出。
-
Java中对象创建有四种方式:new、反射(Constructor.newInstance)、Class.forName().newInstance(已过时)、反序列化(ObjectInputStream.readObject);对象进入可回收状态取决于根可达性分析,不可达即待回收;finalize已废弃,应使用Cleaner或PhantomReference;对象销毁无确定时间点,资源须显式释放。
-
本文介绍一种简洁、健壮且空间友好的Java实现,用于在动态追加元素的整数列表中实时检测是否存在任意三个连续元素之和等于给定值,避免原代码中冗余子列表缓存与越界风险。
-
封装、继承、多态是Java面向对象三大特性。1.封装通过private隐藏字段,提供getter/setter安全访问,保护数据;2.继承使用extends复用父类非私有成员,建立类层次,支持单继承;3.多态通过父类引用指向子类对象,重写方法实现不同行为,运行时动态调用,提升灵活性。三者结合增强代码可维护性、扩展性与复用性。
-
n&1能判断奇偶是因为整数以二进制补码存储,最低位为0是偶数、为1是奇数;n&1仅保留最低位,结果为0或1,比取模、除法更高效且支持负数。
-
InvocationTargetException是什么,为什么它总在反射里冒出来它不是你代码写错了,而是被反射调用的那个方法自己抛了异常,InvocationTargetException只是“套壳”——把原始异常包了一层再扔出来。JVM要求反射调用必须统一用这个包装类,否则没法区分“反射失败”和“目标方法失败”。常见错误现象:InvocationTargetException堆栈里看不到你写的业务异常,只看到getCause()才是真凶;IDE调试时断点停在invoke()那行,