0
点赞
收藏
分享

微信扫一扫

Object类

月半小夜曲_ 2022-02-06 阅读 108

Object类是java中所有类的超类或者叫基类 就是祖宗

构造方法: Object()

方法:

equals();判断两个对象是否相等

1.1Object类下面的equals方法

public boolean equals(Object obj) {
        return (this == obj);
    }

Object类下面使用的==,就意味着Object类下面使用的equals方法比较的是地址和内容

如果地址和内容都相等的话,才会相等

1.2String类下面equals方法

所有类都是Object类的子类

String类也是Object类下面的子类,Strin类下面有一个方法叫equals。重写了父类的equals方法

所以咱们在使用STring类的时候调用equlas方法的时候,如果地址相等就返回true,如果地址不同判断内容。

"abcd".equals("abcd")   //true
public boolean equals(Object anObject) {
       //String类下面如果两个对象的地址一样的话,也是返回true
       //如果内存地址,那你的内容是一样的
      //先比较的是地址
        if (this == anObject) {
            return true;
        }
       //如果地址不一样的情况,下面比较了内容  怎么比较的内容?
        if (anObject instanceof String) {
            String anotherString = (String)anObject;//"abcd"
            //猜测一下 "abcde"    "abce".equals("abcd")   //true  equals方法左边的字符串值 
            int n = value.length;//5
            //如果两个字符串的长度都不相等,还有必要去比较内容吗?没有
            //如果长度长度相等的话,才进行字符串的内容的比较
            //
            if (n == anotherString.value.length) {
                //  "abce".equals("abcd")
                //String 类下面的一个方法 叫toCharArray()  将字符串转为一个字符数组
                char v1[] = value;//将字符串转为字符数组['a', 'b', 'c', 'e']
                char v2[] = anotherString.value;//['a', 'b', 'c', 'd']
                int i = 0;
                //通过while循环来比较两个字符数组中的每个字符
                /*
                	n=4 4!=0  v1[0] != v2[0] 'a'!= 'a' false   i=1  n-- 
                	n=3 3!=0  v1[1]!=v2[1]'b'!='b' false i=2 n--
                	n=2 2!=0  v1[2]!=v2[2] 'c'!='c' false  i=3 n--
                	n=1 1!=0 v1[3]!=v2[3] 'e'!='d' true  return false
                */
                while (n-- != 0) {
                    if (v1[i] != v2[i]){    
                        return false;
                    }
                    i++;
                        
                        
                }
                return true;
            }
        }
        return false;
    }

为了让大家去理解String类下面的额equlas方法和Object类下面的euqals方法的区别

String 类下面的equlas方方法只要内容相等即可返回true

1.3想要比较两个对象的内容是否一致

如果想要比较两个对象的内容是否一致。
直接使用equals方法的时候,是用的Object类下面的equals方法,==
比较的是地址,只能在当前类中重写equals方法,两点需要注意:
    1.先判断地址,如果地址一样,肯定一样
    2.如果内存地址不一样,再判断内容,内容如果一样,那就返回true

package com.qfedu.a_object;

public class Person {
	int id;//编号
	String name;//名字
	int age;//年龄
	public Person() {
		
	}
	public Person(int id, String name, int age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		//自己定义别让他只比较内存地址,如果内容相等也返回一个true
		//person1.erquals(person2);  
		//this.equals(obj)
		
		if (this == obj) {
			//== 地址一样,肯定是同一个对象
			return true;
		}
		//开饭中比较内容,内容一样的话也是返回一个true
		//1.Object obj = person2; 先向上转型  自动的
		//2.Person p = (Person)obj;再向下转型  强转不会报错,
		Person p = (Person)obj; //p 就是person2
		//判断  id   name  age 如果一样就返回true
		//person1.equals(person2)
		//p就是person2    this  就是person1
		return (p.id == this.id) && (p.age == this.age) &&(p.name.equals(this.name));
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	
}
package com.qfedu.a_object;

public class Demo3 {
	public static void main(String[] args) {
		String string = "123";//常量池中
		//自己定义的Person类也是默认继承的Object
		Person person1 = new Person(1, "老邢", 78);
		Person person2 = new Person(1, "老邢", 78);
		boolean ret = person1.equals(person2);
		//任何类都是继承的Object
		//就意味着任何类调用equlas方法的时候 重写的Object类
		//下面的equals方法
		//person1和person2对象也是使用的Object类下面的equals
		//Object  类下面的equals方法比较的是地址
		//person1和person2的地址一样吗?不一样,所以是一个false
		//你没重写调用的就是object的equals
		System.out.println(ret);//false
		//砸门以后开发要求,只比较内容
		//你的眼睛看到这个两个对象内容是一样。但是地址不一样
		//在真实的开发中以内容为主
		//如果内容一样,就判定是同一个对象,调用equlas方法应该返回一个true
		//怎么解决?父类(Object类)equals方法是==
		//重写以后,子类只需要看内容即可,和String  也重写了equals方法
	}

}

1.4Object类下面的hashCode方法

hashCode方法返回的是int类型

这个返回的int类型的数据是对象的内存地址(十六进制)转为十进制的值

package com.qfedu.a_object;

public class Demo4 {

	public static void main(String[] args) {
		Person person1 = new Person(1,"老邢", 78);
		Person person2 = new Person(1,"老邢", 78);
		//获取hash值,两个对象的地址不一样,因为Object类下面的hash码是内存地址转为十进制的一个值
		//hash值肯定不一样
		//person1.hashCode()  子类调用了父类的方法
		System.out.println(person1.hashCode());
		System.out.println(person2.hashCode());
	}
}

针对于Object只要对象的内存地址不一样,hash值肯定不一样

1.5String类下面的hashCode方法

在String类中,重写了equals方法也重写了hashCode方法

目的:是比较两个字符串的对象的时候(比较的是内容),只要equals方法是一个true,那hash值也得相等

只能重写hashCode方法。

package com.qfedu.a_object;

public class Demo5 {
	public static void main(String[] args) {
		String str1 = new String("a");
		String str2 = new String("a");
		System.out.println(str1.hashCode());
		System.out.println(str2.hashCode());
		//str1  str2  两个不同的内存地址的,为啥还一样啊?愁死我了
		//String 类重写了Object类下面的hashCode方法了
		//返回值是ASSIC码,不再是内存地址转为十进制的值了
		//只要你字符串一样,那么你的ASSIC一样的,String类下面的
		//hash值就是一样的
		//为啥两个对象的内容一样了,hash也要求一样啊?
		//官方手册要求的!!!
		//如果根据equals(Object)方法两个对象相等,
		//则在两个对象中的每个对象上调用hashCode方法必须
		//产生相同的整数结果。 

		
		
	}

}
举报

相关推荐

Object 类,String类

4.5 Object类

【Java】Object类

Object 类方法

java:Object类

十八、Object类

Object类2

【Object类和包装类】

0 条评论