equals和hashCode方法
- 两个对象相等,则hashcode值一定也是相同的,且两个对象分别调用equals方法都返回true。两个对象hashcode值相同,但两者不一定是相等的。所以重写equals方法,必须重写hashcode方法。
- 遵循两个对象equals值为true,则hashcode的值必须一致的原则。
- == 与 equals 的区别
- 对于基本类型来说,== 比较的是值是否相等;
- 对于引用类型来说,== 比较的是两个引用是否指向同一个对象地址(两者在内存中存放的地址(堆内存地址)是否指向同一个地方);
- 对于引用类型,equals默认比较的是地址值;所以对象间进行比较时,需重写eqauls方法。
按值调用和按引用调用
- 按值调用(call by value),表示方法接收的是调用者提供的值。按引用调用(call by reference),表示方法接收的是调用者提供的变量地址。
- 一个方法可以修改【传递引用】所对应的变量值,而不能修改【传递值】调用所对应的变量值。
- Java采用按值调用,方法得到的是所有参数值的一个拷贝,方法不能修改传递给它的任何参数变量的内容。
- 一个方法不能修改一个基本数据类型的参数;可以改变一个对象参数的状态;不能让对象参数引用一个新的对象。
深拷贝和浅拷贝
- 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝;
- 深拷贝:对基本数据类型进行值传递,对引用数据类型创建一个新对象,并复制其内容。
异常类
- Checked exception:继承自Exception类,代码需处理API抛出来的checked exception,要么用catch语句,要么直接用throws语句抛出来。
- Unchecked exception:也称RuntimeException,其所有的子类,代码不需要处理它们的异常也能通过编译。不需要try-catch-finally或throws机制去处理异常。
- 面对必须要关闭的资源,优先使用try-with-resources,而不是try-catch-finally。更容易编写必须要关闭的资源的代码。
- @SuppressWarnings注解:告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。比如:@SuppressWarnging("unchecked"),则告诉编译器忽略掉unchecked警告信息,如使用List,ArrayList等未进行参数化产生的警告信息。
- 统一异常处理。
try-catch-finally弊端:
- 大量的try-catch-finally 代码块,不仅有大量的冗余代码,而且还影响代码的可读性;
- 将更多的异常捕获放在业务代码中,业务变更时,需增加个更多的异常捕获,处理等;
- Spring注解:@ControllerAdvice,@ExceptionHandler,@InitBinder,@ModelAttribute 等注解配套使用