Object类中的四个方法(getClass()、toString()、hashCode()、equals())

Object类下方法的作用

1、getClass():返回对象执行时的实例,也就是获取变量的类型。返回结果形式为:class 包名 类名。
2、toString():将对象返回为字符串的形式。
说明:在代码中,如果用输出语句直接输出对象,将会自动调用 toString()方法。

public class ObjectDemo01 extends Object{
	public static void main(String[] args) {
		//创建可以装任意类型数据的数组
		Object[] arr = new Object[4];
		arr[0] = new String("ff");
		arr[1] = new Integer(8);
		arr[2] = new Object();
		arr[3] = new ObjectDemo01();
		System.out.println(arr[0].getClass()+" "+arr[0].toString());
		//class java.lang.String		ff
		System.out.println(arr[1].getClass()+" "+arr[1].toString());
		//class java.lang.Integer		8
		System.out.println(arr[2].getClass()+" "+arr[2].toString());
		//class java.lang.Object		java.lang.Object@15db9742
		System.out.println(arr[3].getClass()+" "+arr[3].toString());
		//class Test_1.ObjectDemo01		Test_1.ObjectDemo01@6d06d69c
	}
}

重点观察toString()方法输出的结果上,源码如下:

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

而arr[0]、arr[1]所输出结果与以上格式不相同,是因为在String与Integer类中已经重写了toString()方法。

3、hashCode():用来比较两个对象是否相等。
4、equals():用来比较两个对象是否相等。
类似“==”的作用,比较两个引用类型的“地址”;

重写方法

1、toString():(较简单)

toString()方法设计依据:
1.如果输出对象时,想要看到哪些属性的值,就可以将属性拼接在return后面。
2.保证拼接后的结果为String类型
3.拼接的格式自定义

2、hashCode():

hashCode()方法的设计依据:
1.尽量使用到对象的属性(*)
2.保证最终的返回值类型为int类型,return后面的结果为int类型

举例:

//规则:id相同并且age相同,就说两个对象相等
public class Person {
	String id;
	String name;
	int age;
	
	@Override
	public boolean equals(Object obj) {
		if(obj == null){
			return false;
		}
		if(this == obj){//this和obj都表示的是地址值,所以==比较的是两个对象的地址值是否相同
			return true;
		}
		//判断obj是否属于Person类
		if(obj instanceof Person){
			//将obj类型转换成Person类型
			Person person = (Person) obj;
			//自定义比较规则
			//id相同并且age相同,就说两个对象相等,也就是返回true
			boolean b1 = this.id.equals(person.id);//这里的equals()方法比较的是两个字符串是否相同
			boolean b2 = this.age == person.age; 
			boolean b3 = this.name.equals(person.name);
			return b1 && b2 && b3;
		}
		return false;
	}

特别的,equals作用到字符串上时:

public class Test {
	public static void main(String[] args) {
		String str1 = "123";
		String str2 = "123";
		System.out.println(str1.equals(str2));//true
		String str3 = new String("123");
		System.out.println(str1.equals(str3));//true
		String str4 = new String("123");
		System.out.println(str3.equals(str4));//true
	}
}

equals与hashcode的联合使用

1、

public class Person {
	String id;
	String name;
	int age;
	
	public static void main(String[] args) {
		Person person1 = new Person();
		person1.id = "1001";
		person1.name = "ff";
		person1.age = 17;
		System.out.println(person1.toString());
		Person person2 = person1;
		System.out.println(person1.hashCode());//366712642
		System.out.println(person2.hashCode());//366712642
	}
}

结论:(equals、hashCode都不重写)如果两个对象相同,那么他们的hashCode的值一定相等。

2、

public class Person {
	String id;
	String name;
	int age;
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return age;
	}

	public static void main(String[] args) {
		Person person1 = new Person();
		person1.id = "1001";
		person1.name = "ff";
		person1.age = 17;
		System.out.println(person1.toString());
		Person person2 = new Person();
		person1.id = "1001";
		person1.name = "dd";
		person1.age = 17;
		System.out.println(person1.hashCode());//17
		System.out.println(person2.hashCode());//17
		System.out.println(person1.equals(person2));//false
	}
}

结论:(重写了hashCode)如果两个对象的hashCode相同,这两个对象也不一定相同。

小结:

(为了提高效率吧)
比较两个对象是否相同:
先看hashCode值是否相同
1.如果hashCode值相同,那么看equals方法是否相同,如果equals也相同,那么两个对象就相同
2.如果hashCode值不相同,那么两个对象就不相同,就没必要去比较equals方法

你可能感兴趣的:(JavaSE)