Object类详解
查看JDK源码,可以鼠标指着然后ctrl + 左键
【 ==
与 equals
】
==
是一个比较运算符
-
==:既可以判断基本类型,又可以判断引用类型
-
==:如果判断基本类型,判断的是值是否相等
-
==:如果判断引用类型,判断的是地址是否相等,即判断是不是同一个对象
equals
是Object类中的方法,只能判断引用类型
- 默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等,比如Integer,String【看String和Integer的equals源代码】
【==与equals 例题】
例题①
public boolean equals(Object obj){
if(this == obj){ //两个是同一个对象,==比较引用类型的时候是比较地址
return true;
}
if(obj instanceof Person){ //该对象是Person才进行比较
Person p = (Person)obj; //向下转型,需要获取obj的各个属性
return this.name.equals(obj.name) && this.age == p.age && this.gender == p.gender;
}
return false;
}
例题②
例题③
第三和第六做错
第三做错原因:字符本质上就是一个数字,只是用来对应哪个字符,这里它就是12
第六做错原因:没有分析,以为是false;实际前面是一个字符串,后面是另外类的对象,它们类型不同,无法比较
【hashCode方法】
返回该对象的哈希码值(十进制)
韩老师的6个小结:
(1)提高具有哈希结构的容器的效率
(2)两个引用,如果指向的是同一个对象,则哈希值肯定是一样的
(3)两个引用,如果指向的是不同对象,则哈希值是不一样的
(4)哈希值主要根据地址号来的!不能完全将哈希值等价于地址。
(5)后面在集合中,hashCode如果需要的话,也会重写
【toString方法】
返回该对象的字符串表示,该字符串默认为该对象的 全类名 + @ + 哈希值的十六进制
全类名 = 包名 + 类名
源码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
重写toString方法,一般默认是输出对象的属性
在IDEA钟使用快捷键 alt + insert
当直接输出一个对象时,toString方法会被默认的调用,比如System.out.println(monster);
就会默认调用monster.toString()