java Object类和equals()方法详解 == 和equals的区别
java Object类的应用总结
1.java中什么是Object类?
- Object是所有java类的根父类
- 如果在类的声明中没有使用extends关键字指明父类,则为默认继承父类Object类
- demo
public class Person{
...
}
//等价于:
public class Person extends Object{
...
}
- 可接受任何类作为参数
methed(Object obj){
...
}
methed(new Person());
- 只有一个空参的构造器 Object()
2.Object类API方法简介
- clone() 创建并返回此对象的一个副本。
- equals(Object obj) 指示其他某个对象是否与此对象“相等”。常用重点方法
- finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
- getClass() 返回此 Object 的运行时类。
- hashCode() 返回该对象的哈希码值。
- notify() 唤醒在此对象监视器上等待的单个线程。
- notifyAll() 唤醒在此对象监视器上等待的所有线程。
- toString() 返回该对象的字符串表示。常用重点方法
- wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
- wait(long timeout) 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
- wait(long timeout, int nanos) 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。
3. == 符号的应用
1.dome
public void testdenghao() {
// ==
// 1.基本数据类型:根据基本数据类型的值判断是否。相等返回true,反之返回false
// 注:两端数据类型可以不同,在不同的情况下,也可以返回true。
// 2.引用数据类型:比较引用类型变量的地址值是否相等。(首地址值)
//
int i = 12;
int j = 12;
System.out.println(i == j);// true
char c = 12;
System.out.println(i == c);// true
float f = 12.0f;
System.out.println(i == f);// true
int k = 65;
char a = 'A';
System.out.println(k == a); // true
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1);
System.out.println(obj2);
System.out.println(obj1 == obj2);// false
Person p1 = new Person();
Person p2 = new Person();
Person p3 = p1;
System.out.println(p1 == p2);// false
System.out.println(p1 == p3);// true
}
4.equals(Object obj) 方法详解
- 只能处理引用数据类型变量(因为传入参数为Object类型)
- 查看Object类中源码,发现其equals方法也是 == 去比较首地址值。
// jdk原码
public boolean equals(Object obj) {
return (this == obj);
}
//Object 类equals()方法的测试
Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1.equals(p2));//false等价于下面的
System.out.println(p1==p2);//false
- String类却比较的是内容(有很多类 包装类 File类 Date类,这些类重写了Object类的equals()方法,比较的是两个对象的具体"实体内容"是否完全相同)
String str1 = new String("AA");
String str2 = new String("AA");
System.out.println(str1 == str2);//false
System.out.println(str1 .equals(str2));//true
//String重写了父类的equals()方法
//写类的时候,需要考虑equals()方法怎么设计
5. String equals() 重写解析
- 首先判断首地址是否相等,是,返回true,否,继续比较额每一个字符,直到全部相等才返回true ,否则,返回false
//jdk的String类重写的Object的方法源码
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
6.类快速重写Object类 equals()方法,使其比较的是内容,而不是地址。
- 设计好类属性之后,点击如下图的Source:
- 点击如下图的Generate hashCode() and equals() :
- 选择需要比较属性之后,点ok完成
4.dome
class Person {
String name;
int age;
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}