-
条件性必填应使用逻辑表达式而非if判断:!phone||(phone&&isCodeFilled(code)),确保短路求值、可扩展;校验函数须返回布尔值,避免非布尔值导致静默失败;前后端规则必须严格一致。
-
CopyOnWriteArrayList遍历时不用加锁因其迭代器基于底层数组的不可变快照,写操作通过原子替换引用更新数组,读写互不阻塞;但写操作本身使用ReentrantLock,仅读操作无锁。
-
VerifyError是JVM在类加载连接阶段强制校验字节码失败时抛出的致命错误,发生在ClassLoader.defineClass()阶段,因类型不匹配、栈不平衡等违反JVM规范的问题导致,属不可恢复的Error而非Exception。
-
Object.notifyAll()必须在synchronized(obj)块内调用,否则抛IllegalMonitorStateException;需配合while循环重检条件以防虚假唤醒和信号丢失;多条件场景应改用Condition而非Object。
-
Java中类使用class定义,首字母大写,包含属性和方法;2.成员变量封装数据,构造方法初始化对象;3.方法包括普通成员方法和静态方法,前者通过对象调用,后者通过类名直接调用;4.使用getter/setter实现数据封装,建议字段私有化以增强安全性。
-
要配置JavaFX开发环境,需手动下载并引入JavaFXSDK。从JDK11起,JavaFX不再内置,需访问Gluon官网下载对应系统的SDK并解压。在IntelliJIDEA中创建Java项目后,通过ProjectStructure添加JavaFX的lib目录为库依赖,并在运行配置中设置VM选项:--module-path和--add-modules指定路径与模块。推荐使用Maven或Gradle自动管理依赖,如Maven添加org.openjfx:javafx-controls和javafx-fxml
-
JRE是运行Java程序的最小环境,含JVM、类库和部署技术;JDK包含JRE及开发工具;Java11起Oracle停供独立JRE,推荐用JDK裁剪运行时。
-
putIfAbsent能避免竞态,因其是单次CAS操作,而非containsKey+put的两次独立操作;它仅对单key生效,不保证value构造无副作用,大开销场景应改用computeIfAbsent。
-
DoubleAdder不支持统计桶,需封装数组或Map持有多个实例;推荐预设固定大小的DoubleAdder[]数组,避免动态扩容和哈希开销;写入须线程局部路由,读取宜批量调用sum()并注意精度与清理。
-
观察者模式通过被观察者状态变化时自动通知所有依赖的观察者实现一对多更新,常用于事件处理、GUI交互与数据同步;核心为Subject维护Observer列表并触发update方法,Java中可通过自定义接口或过时的Observable类实现,适用于解耦事件源与处理逻辑,需注意性能与内存泄漏问题。
-
PriorityQueue默认按自然顺序或Comparator排序,仅保证poll()/peek()获取最高优先级元素,遍历结果无序因其底层为堆结构;可靠有序需反复poll()或改用TreeSet。
-
因为JVM的tableswitch和lookupswitch指令要求跳转目标在类加载时确定,故case必须是编译期常量;否则编译报错“constantexpressionrequired”,不退化为if-else。
-
该选PrintWriter还是PrintStream取决于数据类型和场景:纯文本/日志用PrintWriter(支持指定编码、自动flush、异常不中断线程);二进制混合内容或兼容System.out时用PrintStream(需显式指定编码,注意平台默认编码陷阱),二者均非线程安全,多线程需加锁或改用专业日志框架。
-
锁消除是JVM通过逃逸分析确认对象未逃逸后自动移除无竞争同步的操作。若对象仅在方法内创建使用、不被返回、不赋值给静态字段、不传入跨线程方法,则判定为线程私有,synchronized块被JIT直接删除;典型场景包括局部new的StringBuffer、ArrayList等;但对象赋值给static字段、作为返回值、进入全局容器或逃逸分析被关闭时,锁消除失效。
-
Java运行jar包时,命令行参数必须放在-jar选项和jar文件路径之后;JVM参数如-Xmx、-D需置于-jar之前;错误地将应用参数放-jar前会导致“找不到主类”错误。