-
Future是Java中获取异步计算结果的核心接口,常与ExecutorService配合使用。通过submit提交Callable任务后返回Future对象,可用get()方法获取结果,但需注意其阻塞性:无参get()会一直阻塞,建议使用带超时的版本以避免无限等待。异步任务抛出的异常会被封装在ExecutionException中,必须在get()时捕获处理。可调用cancel(true)尝试取消未完成的任务,并传入true表示中断运行中的线程。最佳实践包括及时调用shutdown关闭线程池、使用超时机
-
静态代码块在类加载时执行一次,用于初始化静态资源;实例代码块每次创建对象时执行、优先于构造器,用于抽取共用初始化逻辑;二者执行顺序严格遵循“父类静态→子类静态→父类实例→父类构造→子类实例→子类构造”。
-
Math.abs()、Math.max()/min()对负零、NaN、无穷大有特殊行为;Math.round()非银行家舍入,仅加0.5后取整;Math.pow()/sqrt()处理负数直接返回NaN;Math.random()线程不安全且精度有限,推荐ThreadLocalRandom。
-
java-version仅显示版本,whichjava返回java路径,其上两级目录常为JDK根目录,但需验证是否存在bin/javac;java.home指向JRE或JDK的运行时根目录,非真实JDK路径;JAVA_HOME是用户设定的预期JDK路径,需检查bin/javac是否存在且可执行。
-
volatile写通过内存屏障触发MESI协议使其他核心缓存行失效,并非直接写主存;volatile读通过读屏障禁止重排序并强制重新加载,确保看到的值是最新提交的。
-
Date是Java中表示毫秒级时间戳的基础类,位于java.util包,以1970年1月1日UTC为纪元;支持newDate()和newDate(long)创建,getTime()/setTime()实现与毫秒互转,需配合SimpleDateFormat格式化/解析(注意线程不安全);虽已过时,但在遗留系统、JDBC交互等场景仍需使用。
-
Java数组声明时直接初始化最常用且安全,支持显式写法(如int[]arr1=newint[]{1,2,3})和简化写法(如int[]arr2={1,2,3},仅限声明同时赋值);动态长度需用new创建并设默认值;Arrays.fill()可批量赋相同值;注意ArrayStoreException及泛型转数组陷阱。
-
ThreadGroup已被弃用,因其无法保证线程归属、方法非线程安全、不参与权限控制且与现代并发工具不兼容;应使用ExecutorService进行显式生命周期管理、监控和隔离。
-
答案是开发一个基于HashMap和关键词匹配的简易Java问答系统,通过清洗输入、模糊匹配预设问题并返回答案,支持持续交互直至用户退出。
-
多行注释使用/开始、/结束,可跨多行且编译器忽略其内容,适用于解释复杂逻辑或临时屏蔽代码块,但不可嵌套。
-
应外置规则为结构化数据并用循环匹配:先校验分数有效性,再遍历区间规则判断等级,避免if-else冗长和switch不支持区间的缺陷。
-
学生类和课程类应作为独立实体设计,通过Enrollment关系类建模多对多关联;ID统一用String;选课需校验存在性、重复性、容量等;退课与查询应维护courseToStudents、studentToCourses等内存索引以实现O(1)操作。
-
使用Jackson的ObjectMapper将Java字符串写入输出流时,会自动将其作为JSON字符串序列化,导致双引号和斜杠被转义;若目标是直接输出原始JSON文本,不应使用writeValue(),而应选择直写或结构化建模方式。
-
Arrays.stream()用于数组,Collection.stream()用于集合类。前者是Arrays工具类的静态方法,支持基本类型数组并返回特化流;后者是Collection接口的默认方法,仅适用于对象集合,通过集合对象直接调用,内部基于迭代器实现。
-
选用ArrayList而非普通数组,因其支持动态扩容及add()、remove()等便捷方法;商品类需定义id、name、price、quantity并实现Serializable;购物车用ArrayList<Product>泛型声明,增删改查需按ID操作、合并数量、避免强转与并发问题。