答:常用的两个接口是 Comparable 和 Comparator,分别通过 compareTo 与 compare 定义排序比较。结果小于 0、等于 0、大于 0,分别表示排在前面、按此规则相等、排在后面。比较结果为 0 不一定等同于 equals 为 true,要看具体类型与比较规则的约定。
答:对对象数组可调用 Arrays.sort(array, comparator),把排序依据写进不同的 Comparator。单字段可用 comparing 或 comparingInt,多字段用 thenComparing 串联。需要明确升降序、空值和相同键的处理;这与排序基本类型数组的重载不是一回事。
答:不一定。八种基本类型各有对应包装类,其中 int 对应 Integer,char 对应 Character;其余常见名称是 Byte、Short、Long、Float、Double、Boolean。String 不是基本类型的包装类,Void 也不能像 Integer 那样包装一个普通 void 值。
答:Java 标准基本类型包装类的实例是不可变值对象。把 Integer 变量从 1 改为 2,改变的是变量持有的引用,不是把原来的 Integer 对象内部改成 2。不可变也不代表两个相同数值一定指向同一个对象,更不代表使用它们的复合操作自动线程安全。
答:自动装箱是在允许的上下文中,把基本值转换为对应包装类型;自动拆箱则取得包装对象中的基本值。它们由编译器按语言规则处理,减少显式转换代码,但不会消除空值、数值范围、对象身份以及重载选择之间的差别。
答:创建对象时必须提供的信息、不可缺少的依赖,以及建立有效状态所需的值,适合通过带参构造器传入。构造器可以立即校验,避免对象先处于不可用状态,再等待调用者逐个设置字段。是否还需要无参入口,取决于实际用途和框架要求。
答:嵌套类型可以把只服务于某个外部类型的实现放在附近,并控制其可见性。非静态成员内部类带有外围实例语境,能访问该实例的成员;静态嵌套类没有隐含外围实例。局部类、匿名类则适合较局部的实现,但并不意味着它们都具有完全相同的规则。
答:不能。构造器不是会被子类继承的普通成员,因此不存在构造器重写。子类声明自己的构造器,可以通过 super 调用父类构造器,也可以在本类中使用不同参数列表重载构造器。这些都与覆盖一个继承的实例方法不同。
答:先分清修饰的是接口本身、字段还是方法。顶层接口通常是 public 或包访问;接口中的字段隐含 public static final。普通抽象接口方法隐含 public abstract,另外还可以声明 default、static、private 方法,但这些修饰符不能任意叠加。
答:对遵守 Object 约定的实现来说,不能。若 x.equals(y) 为 true,两者的 hashCode 必须相同;反过来,哈希值相同不保证 equals 为 true。程序当然可以写出违反约定的方法,但那属于实现错误,不应解释成 Java 正常支持的相等性行为。