1.1 重载与重写的区别
- 重载是对象的方法之间,它们方法名相同,但方法的参数列表不同
- 重写是父子类(包括接口与实现类)中两个同名方法,它们方法名相同,且方法的参数列表相同
- 重载在编译阶段,由编译器根据传递给方法的参数来区分方法,例如
MyObject obj = ... obj.test(123); // 应该是调用 test(int x) 这个方法 obj.test("abc"); // 应该是调用 test(String x) 这个方法
- 而重写是在运行阶段,由虚拟机解释器去获取引用对象的实际类型,根据类型才能确定该调用哪个方法,例如
Super obj = ... obj.test(); // 到底是调用父类,还是子类的 test 方法,必须检查引用对象的实际类型才能确定
- 有没有发生重写,可以使用 @Override 来检查
重写时,子类方法的访问修饰符要 >= 父类方法的访问修饰符 重写时,子类方法抛出的检查异常类型要 <= 父类方法抛出的检查异常类型,或子类不抛异常 重写时,父子类的方法的返回值类型要一样,或子类方法返回值是父类方法返回值的子类
1.2 == 与 equals 的区别
- 对于基本类型,== 是比较两边的值是否相同
- 对于引用类型,== 是比较两边的引用地址是否相同,用来判断是否引用着同一对象
- equals 要看实现
- Object.equals(Object other) 的内部实现就是 ==,即判断当前对象和 other 是否引用着同一对象
- 比如 String,它的内部实现就是去比较两个字符串中每个字符是否相同,比较的是内容
- 比如 ArrayList,它的内部实现就是去比较两个集合中每个元素是否 equals,比较的也是内容
// Java 示例 String a = new String("text"); String b = new String("text"); System.out.println(a == b); // false(地址不同) System.out.println(a.equals(b)); // true(内容相同)
1.3 String,StringBuilder 和 StringBuffer 的区别
- 它们都可以用来表示字符串对象
- String 表示的字符串是不可变的,而后两者表示的字符串是内容可变的(可以增、删、改字符串里的内容)
// 示例:String 的不可变性
String s1 = "hello";
s1 += " world"; // 创建新对象 "hello world",原对象 "hello" 仍在内存中
// 示例:StringBuilder 的修改
StringBuilder sb = new StringBuilder("hello");
sb.append(" world"); // 直接修改为 "hello world",无新对象生成
- StringBuilder 不是线程安全的,StringBuffer 是线程安全的,而 String 也算是线程安全的
// 示例:StringBuffer 的同步方法
StringBuffer buffer = new StringBuffer();
buffer.append("A"); // 内部加锁,保证多线程安全
// 性能测试示例(单线程)
long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append(i); // 耗时约 5ms
}
StringBuffer sbf = new StringBuffer();
for (int i = 0; i < 100000; i++) {
sbf.append(i); // 耗时约 15ms(同步开销)
}
适用场景
- 大部分场景下使用 String 就足够了
- 如果有大量字符串拼接的需求,建议用后两者,此时
- 此字符串对象需要被多线程同时访问,用 StringBuffer 保证安全
- 此字符串对象只在线程内被使用,用 StringBuilder 足够了
另外针对 String 类是 final 修饰会提一些问题,把握下面几点
- 本质是因为 String 要设计成不可变的,final 只是条件之一
- 不可变的好处有很多:线程安全、可以缓存等
4.Java 中的异常
// 自定义 Checked 异常
class PaymentFailedException extends Exception {
public PaymentFailedException(String message) {
super(message);
}
}
// 自定义 Unchecked 异常
class InvalidInputException extends RuntimeException {
public InvalidInputException(String field) {
super("字段 " + field + " 值非法");
}
}
- 常见的非检查异常有
- 空指针异常
- 算术异常(例如整数除零)
- 数组索引越界异常
- 类型转换异常