-
常见原因是用户输入非数字内容(如“95分”或直接回车)而程序用nextInt()强行读取,导致InputMismatchException;应改用nextLine()读整行并用Integer.parseInt()转换,配合try-catch处理,并注意消费换行符。
-
标记-清除算法易致OOM因内存碎片化,无法满足大对象连续空间需求;新生代用标记-复制因存活率低且需Survivor区容下幸存者;老年代稳态选标记-整理,但G1/ZGC已通过分区+局部整理兼顾低停顿与防碎片。
-
IllegalStateException在Java中用于表示对象处于不合法状态时的方法调用,常见于迭代器、流操作、数据库连接及自定义状态机等场景。例如,未调用hasNext()就调用next()、对已关闭的流进行读写、或在播放器已播放时再次调用play()。该异常属于运行时异常,无需强制捕获,但建议在关键路径中通过逻辑判断预防,如使用hasNext()控制循环而非依赖try-catch。最佳实践包括:方法内校验状态并主动抛出带清晰信息的异常、提供isConnected()类状态查询方法、文档注明可能抛出
-
赋值运算符在Java中优先级最低,确保右操作数完全求值后再绑定到左值,从而避免歧义、支持链式赋值,并保障语义清晰。
-
AbortPolicy是默认拒绝策略,任务被拒时直接抛出RejectedExecutionException异常;CallerRunsPolicy则由提交任务的线程同步执行该任务,实现反压节流。
-
运行时动态绑定指JVM在程序执行时根据对象的实际类型调用相应方法,前提是存在继承和方法重写。例如,父类Animal的引用指向子类Dog或Cat对象时,调用makeSound()会动态绑定到实际对象的实现,输出对应声音。这种机制通过统一接口处理不同子类,提升代码灵活性和可扩展性。核心是“编译看引用,运行看对象”。
-
LocalDateTime是Java8用于处理本地日期时间的核心类,不包含时区信息。通过now()获取当前时间,of()创建指定时间;支持plus/minus系列方法进行加减操作,返回新对象保证不可变性;提供isBefore、isAfter、isEqual等方法比较时间顺序;结合Duration计算秒或毫秒级差值,Period计算年月日差异,需提取LocalDate使用;适用于大多数时间处理场景。
-
AtomicBoolean.compareAndSet()能保证单次执行,因其底层基于CPU级CAS指令,原子性完成“判断并更新”,值未被修改才写入新值,否则返回false,精准实现“只做一次”语义。
-
final实例变量必须在声明时或每个构造器中显式赋值一次,且编译器静态检查所有路径;staticfinal在类加载时初始化,二者不可混淆,赋值遗漏任一构造路径即报错。
-
SDKMAN!通过.java-version文件实现项目级Java版本切换,但需同步配置Maven/Gradle编译插件、IDESDK及Gradle工具链,三者对齐才能避免环境割裂。
-
Java应用暴露Prometheus指标需引入micrometer-registry-prometheus(Spring)或prometheus-simpleclient(非Spring),通过HTTP端点(如/actuator/prometheus或/metrics)以文本格式暴露,须正确配置依赖、Actuator暴露项、监听地址及Prometheus抓取路径。
-
ArrayDeque在双端队列场景下优于LinkedList,因其头尾操作更快(O(1)均摊、快近5倍)、内存占用更低(8字节/元素vs24字节)、缓存命中率更高(连续内存),且禁止null更安全。
-
toArray()不带参数返回Object[],强转String[]会抛ClassCastException;应使用list.toArray(newString[0]),JVM自动分配精确大小,安全高效。
-
增强for循环底层基于Iterator实现,编译后转为hasNext()和next()调用;遍历时修改集合结构会抛ConcurrentModificationException;安全删除须用iterator.remove()且需在next()后调用;ArrayList的Iterator性能优于LinkedList;CopyOnWriteArrayList不支持remove();自定义集合需正确实现Iterable与Iterator。
-
Java多线程调试难源于并发环境的时间不可控性,需通过jstack定位死锁、增强日志可观测性、正确使用原子类及主动构造竞态条件来系统提升调试能力。