答:不能在每次调用时随意返回一个新随机数。相关状态不变时,同一对象的 hashCode 应保持一致;equals 相等的不同实例也必须返回相同哈希值。按调用次数变化的随机值会破坏这些约定,使哈希容器的查找失去可靠依据。
答:Enumeration 是较早的遍历接口,主要提供 hasMoreElements 和 nextElement;Iterator 使用 hasNext 和 next,并提供可选的 remove,以及 forEachRemaining 等能力。现代集合通常采用 Iterator,但不能仅凭接口名字判断某个实现是否支持并发修改。
答:Comparable 由对象所属的类实现,通过 compareTo 定义自然顺序;Comparator 是外部比较规则,通过 compare 定义某一种排序方式。一个类型通常只有一套自然顺序,但可以有许多 Comparator,例如按年龄、姓名或多个字段组合排序。
答:String 表示不可变字符串值;StringBuilder 和 StringBuffer 都是可变字符序列。单线程连续构造文本,通常选择 StringBuilder;需要共享可变缓冲区且相应同步语义合适时,再考虑 StringBuffer。String 不可变是其 API 和实现共同维持的设计,不是只靠一个 final 引用。
答:final 修饰变量时,限制它只能被赋值一次;修饰方法时,禁止子类重写;修饰类时,禁止被继承。final 引用指向的对象仍可能变化,所以 final 与“整个对象不可变”不是同一个概念。
答:它们表示的字符内容可以相同,但对象身份不一定相同。字符串字面量与字符串常量表达式会使用驻留字符串;new String("i") 则显式创建一个新的 String 对象。因此常见情况下二者用 equals 比较为 true,用 == 比较为 false。
答:普通需求可以使用 new StringBuilder(text).reverse().toString()。但“反转”要先定义单位:按 UTF-16 代码单元、Unicode 码点,还是人眼看到的字素簇。涉及组合字符、肤色修饰符或复杂表情时,简单反转不一定符合用户期望。
答:常见操作包括 length/isEmpty/isBlank,equals/compareTo,contains/startsWith/endsWith,indexOf/substring,replace/split,以及 strip、大小写转换等。选择时先想清输入和边界,不必把所有方法名背成一长串。
答:复制对象常用于生成快照、隔离修改或保存独立状态。浅拷贝复制对象本身的字段值,引用字段仍指向原有内部对象;深拷贝则按需求继续复制内部可变对象,让需要隔离的部分独立。把一个引用赋给另一个变量,连浅拷贝都不算。
答:先区分受检异常、RuntimeException 及其子类,以及 Error。常见受检异常有 IOException、ClassNotFoundException;常见运行时异常有 NullPointerException、IllegalArgumentException、IndexOutOfBoundsException、NumberFormatException、ClassCastExcept…