所有的类都默认继承 Object 这个基类。
基本数据类型不是类,所以不继承,但它们的封装类继承,使用基本数据类型时会自动封箱为其封装类。equals()、hashCode()、getClass() 和 toString() 是 Object 常用的方法。
equals(Object obj) 方法
API,源码:
public boolean equals(Object obj) { |
==
用于比较两个数值是否相等。
==
比较基本数据类型时,用来判断两个基本数据类型数值是否相等;引用变量存放的是对象在堆中的地址,==
比较两个引用时,比较两个地址的数值是否相等,即判断两个引用是否指向同一个对象。
int a = 1; |
所以 equals 方法用于判断两个对象是否在意义上相等,即这两个对象是否是同一个对象。
d.equals(c); // false |
String 重写了 equals 方法,比较两个 String(匿名)对象是否带有相同的字节组合:
public boolean equals(Object anObject) { |
验证:
String s = "hello"; |
在 String 中,==
常常和 equals() 一起做比较:
s == s2; // true; |
注意:在重写 equals() 方法的同时,需要重写 hashCode() 方法,equals() 与 hashCode() 关系:如果两个对象 equal,hashCode 值相同。
hashCode() 方法
API,源码:
public native int hashCode(); |
此方法返回一个对象的哈希代码(int 类型),可以理解为对象在堆中的地址,是一个唯一的 ID。
hashCode() 方法和 equals() 方法的关系:如果两个对象 “equal”,则 hashCode 相等;但如果两个对象 hashCode 值相等,不一定是同一个对象,因为 hashCode 可能重复(冲突)。
String 重写了 hashCode 方法:
public int hashCode() { |
hashCode 根据字符的 ASSCII 确定,s、s2、s3 都有相同的字符组合,所以三者的 hashCode 相等。
String s = "hello"; |
hashCode() 主要在 Hash 集合中起作用,如 HashSet、HashMap 等。HashMap 中的作用:往 HashMap 中 put 键值对元素时,当根据 key 的 hashCode 生成的数组下标的位置没有元素时,将键值对放在此位置。如果有元素,依次判断此位置链表的 key 的 hash 值 (根据 hashCode 生成) 是否相同以及(&&)key 是否相等,满足则替换 value,不满足,则链接到链表后面。详情:逐行分析 HashMap 的 put() 方法源码
if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) |
getClass() 方法
API,源码:
public final native Class<?> getClass();// 类型 |
getClass() 返回的对象,代表当前对象运行时的类。此对象包含当前对象的类相关信息,如类名、包名、继承那些接口、有那些属性、有那些方法等。
native 方法像一个接口,有实现,但实现是其他编程语言(如:C)编写的。abstract 关键字代表没有实现,所以不能和 native 连用。
ArrayList<Integer> li = new ArrayList<>(); |
class java.util.ArrayList |
getClass() 告诉我们对象从哪里被初始化,li.getClass()
和 lf.getClass()
均为 class java.util.ArrayList
,两个对象均在 ArrayList 中初始化。
我们经常在反射中使用 getClass() 方法。
private void reflectData(Object o){ |
toString() 方法
API,源码:
public String toString() { |
我们从源码可以看出此方法返回对象运行时类的名称和一个 16 进制的哈希码。常用于将 Object 对象转换为 String。
HashMap<String, Object> map = new HashMap<>(); |
我们常使用的 toString 方法重写了此方法。如 AbstractMap 的 toString,HashMap 继承此方法。
public String toString() { |
StringBuffer 的 toString:
|