0
点赞
收藏
分享

微信扫一扫

Object类

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

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类

java:Object类

Object 类方法

【Java】Object类

4.5 Object类

十八、Object类

0 条评论