java Object类和equals()方法详解 == 和equals的区别

版权声明:尊重原创,码字不易,转载需博主同意。 https://blog.csdn.net/qq_34626097/article/details/83099355

1.java中什么是Object类?

  1. Object是所有java类的根父类
  2. 如果在类的声明中没有使用extends关键字指明父类,则为默认继承父类Object类
  3. demo
public class Person{
...
}
//等价于:
public class Person extends Object{
...
}
  1. 可接受任何类作为参数
methed(Object obj){
...
}
methed(new Person());

  1. 只有一个空参的构造器 Object()

2.Object类API方法简介

  1. clone() 创建并返回此对象的一个副本。
  2. equals(Object obj) 指示其他某个对象是否与此对象“相等”。常用重点方法
  3. finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
  4. getClass() 返回此 Object 的运行时类。
  5. hashCode() 返回该对象的哈希码值。
  6. notify() 唤醒在此对象监视器上等待的单个线程。
  7. notifyAll() 唤醒在此对象监视器上等待的所有线程。
  8. toString() 返回该对象的字符串表示。常用重点方法
  9. wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
  10. wait(long timeout) 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
  11. 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) 方法详解

  1. 只能处理引用数据类型变量(因为传入参数为Object类型)
  2. 查看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
  1. 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() 重写解析

  1. 首先判断首地址是否相等,是,返回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()方法,使其比较的是内容,而不是地址。

  1. 设计好类属性之后,点击如下图的Source:
    快速重写equals()方法
  2. 点击如下图的Generate hashCode() and equals() :

快速重写equals()方法

  1. 选择需要比较属性之后,点ok完成
    快速重写equals()方法

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;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_34626097/article/details/83099355