Object: 所有类的超类
在Java中每个类都是由
Object
扩展而来,如果没有明确指出超类,Object
就被认为是这个类的超类。
equals()
hashCode()
toString()
equals()方法
Object
类中equals()
方法源码
public boolean equals(Object obj) {
return (this == obj);
}
Object
类中equals()
方法仅判断两个对象是否具有相同的引用。然而,多数情况下,这种判断并没有什么意义。
例如:两个员工对象的姓名、年龄、薪水都一样,就可以认为他们是相等的。
此时,需要重写equals()
方法。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return age == employee.age &&
Double.compare(employee.salary, salary) == 0 &&
Objects.equals(name, employee.name);
}
hashCode()方法 -- 如果重写equals方法,就必须重写hashCode方法
Object
类中hashCode()
方法源码
每个对象都有一个默认的散列码,其值为对象的存储地址。
public static int hashCode(Object o) {
return o != null ? o.hashCode() : 0;
}
一起重写
equals()
方法和hashCode()
方法是为了便于用户可以将对象插入到散列表中。
@Override
public int hashCode() {
return Objects.hash(name, age, salary);
}
toString()方法
Object
类中toString()
方法源码
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
// output: OOP.Employee@745f 对象存储地址
- 重写
toString()
方法
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
equals() 与 == 的区别
Java中数据类型可分为两类:
1、基本数据类型
* 数值型:byte short int long float double
* 布尔型:boolean
* 字符型:char
2、引用数据类型
* 类
* 接口
* 数组
- 基本数据类型的比较应该用
==
,比较的是他们的值。 - 字符串缓冲池
程序在运行的时候会创建一个字符串缓冲池.当使用
str1 = "123"
这样的表达是创建字符串的时候,程序首先会在字符串缓冲池中寻找相同值的对象,在第一个程序中,str1
先被放到了池中,所以在str2
被创建的时候,程序找到了具有相同值的str1
.
所以str1
与str2
引用同一个对象。
String str1 = "123";
String str2 = "123";
System.out.println(str1 == str2);
// 输出: true
- 对于引用数据类型,当使用
==
进行比较的时候,比较的是他们在内存中存放的地址。Object
类中equals()
方法就是使用==
进行比较的。所以在没有重写equals()
方法的情况下,引用数据类型的比较还是基于他们在内存中的存放地址的。 String
类重写了Object
类的equals()
方法,比较的是两个String
对象的值。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (!COMPACT_STRINGS || this.coder == aString.coder) {
return StringLatin1.equals(value, aString.value);
}
}
return false;
}