equals 和 “==”区别?
== 对于基本类型数据,比较的是值是否相等,对于对象类型,比较的是对象的引用地址是否相同。
Object的equals()方法,也比较的是对象的引用地址是否相等。但大多数类会自重写equals方法,使得比较的是对象内容,比如String重写后,比较的就是对象的值是否相等。
// Object.java
public boolean equals(Object obj) {
return (this == obj);
}
- 如果是包装类之间的“==”运算,在没有算数运算的情况下不会自动拆箱,比较的是对象地址。遇到算数运算时会进行自动拆箱,比较数值。
Integer a = 3;
Integer b = 3;
a == b;true
a.equals.b;true
//超过[-128,127]区间就创建新的对象,没超过取的缓存
Integer a = 300;
Integer b = 300;
a == b;false
a.equals.b;false
- 如果是包装类和基本类型之间的"=="比较,包装类会拆箱后比较
int b = 3;
a==b;a 会自动拆箱,返回true
- 包装类的equals(Object)方法是不处理数据转型关系的,如Long.equals(Integer.value(3)),类型不一致就会返回false。
wait 和 notify
可用于线程间通信,必须用在synchronized()方法块中才有效。wait方法会自动释放对象锁,直到有nofity调用后才会重新获得对象锁执行线程。
clone()
- 必须实现 Clonable接口
clone默认浅拷贝(super.clone()),意思是对象引用不会被拷贝,还指向原来的对象地址,修改clone对象的引用对象,原对象的引用对象也被修改。如果需要深拷贝,需要把对象的引用也拷贝一份。这样修改引用对象则不会影响原引用对象的内容。
@NonNull
@Override
public Object clone() throws CloneNotSupportedException {
Person person = new Person();
person.name = this.name;
person.age = this.age;
//对象的引用也要拷贝,才能实现深拷贝
person.course = (Course) this.course.clone();
return person;
}
参考:https://blog.csdn.net/xinghuo0007/article/details/78896726
finalize
- GC时才调用对象的finalize方法 做一些清理工作
垃圾回收器只知道那些显式地经由new分配的内存空间,之所以要使用finalize(),是存在着垃圾回收器不能处理的特殊情况。如果使用a. c++的malloc方法申请的内存 b. 打开的文件资源,这些资源不属于垃圾回收器的回收范围, 需要在finalize方法中清理进行手动释放。 - 也可以在finalize重新赋予对象强引用使其不用被回收
网友评论