-
Java并发编程核心在于理解内存模型、状态共享与协作机制,需掌握volatile、synchronized原理、JDK并发工具类边界、线程池调优及竞态排查方法。
-
仅靠volatile变量无法正确实现线程安全的ReadWriteLock,因其缺乏原子性与内存顺序保障;但结合Peterson算法思想并严格约束执行模型(如双线程、无抢占调度),可在理论极限下构造简化版本;实践中必须搭配Atomic类或显式同步机制。
-
是的,OptionalInt更省内存——它用原生int字段存储,无装箱开销;而Optional依赖Integer.valueOf()装箱,必多分配对象,高频场景下GC与堆内存差异显著。
-
Java中运行时异常是Exception的子类,属非受检异常,编译器不强制捕获或声明;由程序逻辑错误引起,应通过编码规避而非try-catch兜底,常见类型包括NullPointerException、ArrayIndexOutOfBoundsException等。
-
CopyOnWriteArrayList遍历时不用加锁因其迭代器基于底层数组的不可变快照,写操作通过原子替换引用更新数组,读写互不阻塞;但写操作本身使用ReentrantLock,仅读操作无锁。
-
ThreadLocal不能直接new使用,因其值与线程绑定且线程复用时不自动清理,易致数据错乱或内存泄漏;须staticfinal声明、显式remove()、避免存大对象,异步场景推荐TransmittableThreadLocal。
-
直接返回Collections.emptyList()是最轻量的空集合返回方式,因其复用静态final的EMPTY_LIST单例实例,不创建新对象、不分配堆内存,且线程安全、可序列化;适用于只读场景,修改会抛UnsupportedOperationException。
-
do-while循环至少执行一次,因条件判断在循环体之后;适用于先执行后判断的场景,如用户输入校验、重试逻辑;不适用于需跳过首次执行的计数循环。
-
调用list.length会报错,因为List是对象,没有length属性;数组才有length字段,而List使用size()方法获取元素个数,二者类型不同、不可互换。
-
Files.walkTree为什么总抛出AccessDeniedException因为Files.walkTree默认不处理权限拒绝,遇到无读权限的子目录或文件直接中断遍历。这不是bug,是设计使然——它把错误当作“遍历失败”而非“跳过继续”。必须传入自定义FileVisitor实现,在visitFileFailed方法里显式返回FileVisitResult.CONTINUE别用SimpleFileVisitor的默认实现,它的visitFileFailed直接抛异常
-
MapStruct编译不生成实现类的根本原因是未配置annotationprocessor;Maven需同时引入mapstruct和mapstruct-processor(scope=provided),IDEA要启用AnnotationProcessors,Gradle需添加annotationProcessor依赖。
-
JavaFX11+需手动配置模块路径和依赖模块:下载SDK后,--module-path指向lib目录,--add-modules需显式列出所有用到的模块(如javafx.controls,javafx.fxml),且参数顺序必须在-cp之后、主类之前。
-
工厂模式通过封装对象创建过程,使调用者无需依赖具体类,仅通过统一接口获取实例,降低耦合、提升扩展性。1.解耦对象创建与使用:工厂类负责实例化具体产品,使用者面向接口编程,避免直接new导致的强依赖。2.支持开闭原则:新增产品时只需扩展工厂逻辑,无需修改客户端代码,如Factory.create("C")可透明支持新类型。3.常见形式包括简单工厂(集中创建)、工厂方法(子类决定创建)、抽象工厂(创建产品族)。4.广泛应用于JDBCDriverManager、SpringBeanFactory、日志框架等场景
-
通过配置maven-javadoc-plugin的includeDependencySources和dependencySourceIncludes,可将依赖模块(如模块B)的源码及JavaDoc自动合并到当前模块(如模块A)生成的文档中,实现跨模块类型链接与完整API参考。
-
instanceof是Java中唯一能安全判断对象运行时实际类型的运算符,用于Object或父类/接口引用需确认具体子类时,语法为objectinstanceofType,返回boolean,null时恒为false,不兼容类型编译报错。