答:保存文本值通常使用 String;连续构造文本常用 StringBuilder;需要相应同步能力的共享可变序列可考虑 StringBuffer。StringJoiner 适合带分隔符、前缀和后缀的拼接,Pattern/Matcher 处理正则匹配,Scanner 等工具用于特定解析场景。它们各有分工,不是一条简单的性能排名。
答:强引用是通常使用对象的方式,会阻止对象在强可达时被回收;软引用允许按内存需求清理;弱引用不会维持对象的强存活;虚引用的 get() 始终返回 null,主要配合引用队列观察相应处理时机或安排清理。它们不是按固定时间依次执行的回收流程。
答:float 是 32 位二进制浮点数,double 是 64 位;double 通常能表示更大的范围和更高精度。它们都不能精确表示任意十进制小数。小数字面量默认是 double,给 float 赋值通常需要 f 后缀或显式转换。
答:回调就是把“完成某件事后要做的动作”交给另一段代码,在合适时机由它调用。Java 常见写法包括接口实现、匿名内部类、lambda 和方法引用;事件监听与 CompletableFuture 的完成处理也是常见使用场景。它是一种协作方式,不是独立的语言关键字。
答:String switch 在语言层面按字符串值匹配分支,不是按引用身份匹配。常见 javac 实现先利用哈希值分组,再用 equals 处理碰撞,但这是实现方式,不是语言要求所有编译器永远采用的唯一算法。Java 21 不支持基本类型 long 直接作为选择器,是该版本的类型规则,而不是“哈希做不了 long”。
答:不能直接编译。3.4 是 double 字面量,赋给 float 需要窄化转换,不能在这里自动发生。常用正确写法是 float f = 3.4f;也可以显式强转,但要接受 float 的精度限制。
答:对遵守约定的实现来说,不对。若 x.equals(y) 为 true,x.hashCode() 与 y.hashCode() 就必须相等。程序当然可以写出违反约定的方法,但那属于实现错误,不能把它当成 Java 允许的正常语义。
答:二者不总是等价。复合赋值 a += b 会按复合赋值规则把运算结果转回左侧变量类型,而且左侧表达式只求值一次;a = a + b 不会自动获得同样的隐式窄化转换。对于简单的 int 加法变量,它们常表现一样,但不能推广到所有表达式。
答:通常会。执行 return 时先计算要返回的值,再执行关联的 finally;若 finally 正常完成,原来的返回继续生效。若 finally 自己又 return 或抛异常,则可能覆盖原返回或原异常。进程退出等非常规终止不能保证 finally 执行。
答:Throwable、Exception、RuntimeException 和 Error 都在 java.lang 包中。Throwable 的两大直接子类是 Exception 与 Error,RuntimeException 又属于 Exception。具体异常分布在不同包里,例如 IOException 在 java.io,SQLException 在 java.sql;不存在一个包容纳所有…