-
List.of和Map.of是Java9引入的不可变集合工厂方法,不支持null元素或键值,返回私有不可变类实例,调用add/remove抛UnsupportedOperationException;适用于默认参数、配置项、测试断言等只读场景。
-
newChild()先打印Grandparent静态块,因为JVM类初始化遵循父类优先原则:触发Child初始化前必须先完成Parent和Grandparent的初始化,且静态内容按源码声明顺序执行。
-
确定循环次数用for,不确定用while:for适用于可预知次数的遍历或计数,while适用于依赖状态变化的场景;for变量作用域受限更安全,while变量可后续复用;for-each适合纯遍历,需索引或修改集合时应回退传统for或使用迭代器。
-
安装JDK并配置环境变量,再选择IDE完成Java开发环境搭建。1.安装JDK17或21版本,记录安装路径;2.设置JAVA_HOME系统变量并添加%JAVA_HOME%\bin到Path;3.命令行执行java-version和javac-version验证安装;4.安装IntelliJIDEA、Eclipse或VSCode进行开发。确保路径正确,验证无误即可开始编写Java程序。
-
根本异常是引发异常链的最底层异常,通过Exception.getCause()可获取其对象,用于追溯问题源头。
-
本文介绍在多JDK版本兼容构建场景下,如何通过MavenProfile实现对jakarta.xml.bind-api等模块化API依赖的精准控制:JDK8构建时完全排除,JDK11+构建时按需显式引入。
-
自旋锁通过让线程在用户态空转避免上下文切换,节省1000+时钟周期;仅适用于临界区极短场景,JVM对synchronized默认启用自适应自旋,而ReentrantLock需手动实现。
-
应使用卫语句提前拦截null而非重复判断,JDK版本决定switch用法,布尔条件直接用if(flag)避免冗余和空指针,嵌套过深需拆分职责或改用策略模式。
-
synchronized用于控制多线程对共享资源的访问,修饰实例方法时锁对象为this,修饰静态方法时锁为类Class对象,修饰代码块时可指定任意对象作为锁;推荐使用私有final对象作为锁以避免外部干扰,不建议使用String或包装类常量;应避免嵌套同步导致死锁,确保多锁按序获取;在高并发场景下可考虑ReadWriteLock、原子类或显式锁优化性能;合理缩小同步范围提升效率。
-
transient修饰的字段不被序列化是因为其语义为“跳过该字段”,JVM在默认序列化时直接忽略它;它仅作用于实例变量,不影响类的Serializable实现,但Externalizable会忽略transient标记。
-
HashSet插入和查找通常比TreeSet快,因其基于哈希表实现,平均时间复杂度O(1),而TreeSet基于红黑树,操作均为O(logn);但哈希碰撞严重时HashSet可能退化。
-
Android中AlertDialog.setButton()报错“nosuitablemethodfound”,是因为错误地调用了已创建的AlertDialog实例的setButton()方法;正确做法是直接在AlertDialog.Builder上设置按钮(如setPositiveButton),再调用show()。
-
首先检查项目JDK配置,确保ProjectSDK和Languagelevel匹配;再验证IDEA运行的JRE与项目JDK一致;接着清理Maven/Gradle项目并重新导入,确认构建文件中Java版本设置正确;最后检查系统JAVA_HOME和PATH环境变量,保证与项目使用版本一致。
-
corePoolSize设太小会导致频繁创建线程:当提交任务时,若当前线程数小于corePoolSize,会创建新线程执行任务,而非复用空闲线程或放入队列。
-
Exception为受检异常,必须处理,适用于外部可恢复错误,如IO异常;RuntimeException为运行时异常,无需强制捕获,通常由程序逻辑错误引起,如空指针或数组越界。