-
Java中异常捕获本身几乎不消耗性能,真正影响性能的是异常被抛出并创建堆栈信息的过程;只要未发生异常,try-catch开销可忽略,而抛出异常耗时可达普通方法调用的百倍以上。
-
Java完全基于OOP构建,强制所有代码置于类中,一切运行依赖对象;封装、继承、多态由语法硬性支撑;抽象机制深度融入类型系统;整个生态演进由OOP驱动。
-
Java异常类必须实现Serializable,因为Throwable实现了该接口,确保异常可跨JVM传输;未显式声明serialVersionUID会导致结构变更时反序列化失败;含非transient不可序列化字段会抛NotSerializableException。
-
最常见原因是依赖作用域(scope)设置错误,如误用test或provided导致运行时不可见;应确保生产代码使用compile(默认)或runtime,避免systemscope,用mvninstall:install-file安装本地JAR,并通过dependency:tree排查版本冲突。
-
ExecutorCompletionService的核心是按完成顺序获取结果,避免普通Future轮询时因首个任务未完成而阻塞;它用阻塞队列缓存结果,支持take()阻塞取或poll()非阻塞取,并建议封装任务上下文以追踪来源与耗时。
-
创建Exception对象开销显著,因需填充堆栈跟踪;实测比普通对象慢10–100倍,栈越深越慢;避免在循环等热点路径中频繁newException。
-
DirectBuffer能提升IO性能是因为其位于本地内存,可被OS直接访问,省去堆内存到本地内存的数据拷贝。应通过allocateDirect()创建并复用,避免频繁分配;需关注Cleaner异步回收延迟,合理设置-XX:MaxDirectMemorySize,优先使用对象池管理生命周期。
-
Java对象不一定在堆上分配,HotSpot通过逃逸分析可实现栈上分配和标量替换;需满足对象不逃逸、字段全为标量、无同步块等条件,并依赖C2编译及JVM参数验证。
-
推荐使用OutputStream.nullOutputStream()(Java11+)重定向System.err到黑洞流,简洁、线程安全;低版本可手动实现空OutputStream并重写write和flush方法,重定向前应保存原始System.err以便恢复。
-
必须手动移除SelectionKey,因为selectedKeys()是复用且不自动清理的集合;需在迭代中调用iter.remove()或key.cancel(),否则会导致重复事件、CPU飙升和连接异常。
-
抽象类用于提取共性、规范结构和减少重复,适合共享代码与统一模板的场景。1.定义模板行为:通过模板方法模式固定算法骨架,子类实现变化步骤,如不同格式的数据导出流程;2.共享通用属性和方法:将图形系统的颜色、填充等公共状态封装在抽象父类中,子类继承并实现特有逻辑;3.强制子类实现关键行为:支付系统中通过抽象方法确保各支付方式均实现验证与执行操作;4.部分实现的接口替代方案:日志系统中抽象类提供通用格式化功能,子类定制输出方式。相比接口,抽象类支持默认实现和状态管理,适用于既有共性又有差异的场景,提升系统可维护
-
LocalDate仅存年月日,LocalDateTime存年月日及时分秒,二者均无时区;需表示绝对时刻须用ZonedDateTime或Instant。
-
Semaphore常被误用为“伪限流”因其仅控制并发数而非单位时间请求数,不自动释放许可且无时间窗口感知,易因未配对调用acquire/release导致许可泄漏、线程阻塞或QPS失控。
-
Java内存可见性问题指一个线程修改共享变量后另一线程无法看到最新值,源于JVM和CPU缓存机制;volatile通过强制主内存读写和内存屏障解决,但不保证原子性。
-
Objects工具类通过静态方法提供空值安全操作:equals()避免NPE、hash()统一处理null哈希、requireNonNull()强制非空、requireNonNullElse()提供默认值、toString()和isNull()/nonNull()简化判空与转换。