目录
一、Object类
1.1 定义与地位
1.2 toString()方法
1.3 equals()方法
1.4 hashcode()方法
一、Object类
1.1 定义与地位
Object类是Java语言中的根类,所有的类(除了Object类)都直接或间接继承自Object。这就意味着在Java中,任何一个对象都可以被看作是Object类的实例。例如:
class MyClass{}
public class Demo1 {
public static void main(String[] args) {
Object obj = new MyClass();
}
}
我们也可以使用Object来接受所有类的对象
class Person{}
class Doctor{}
public class Demo3 {
public static void func(Object obj){
System.out.println(obj);
}
public static void main(String[] args) {
func(new Person());
func(new Doctor());
}
}
在帮助文档中我们可以查到Object类中的方法。如下:
我们先来熟悉一下toString()方法、equals()方法和hashcode()方法。
1.2 toString()方法
作用:该方法返回一个字符串,用于描述对象的信息。默认情况下,它返回对象的类名和哈希码(十六进制表示)。例如:
class Person{
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Test1 {
public static void main(String[] args) {
Person person = new Person("zhangsan",12);
System.out.println(person);
}
}
我们也可以对toString方法进行重写,通常需要在自定义类中,以便返回更有意义的对象信息。
例如:
class Person{
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Test1 {
public static void main(String[] args) {
Person person = new Person("zhangsan",12);
System.out.println(person);
}
}
1.3 equals()方法
在Java中,用==进行比较时:
1.如果==左右两侧是基本类型变量,比较的是变量中值是否相同。
2.如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同(是否引用同一个对象)。
3.如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的:
没重写时:
class Point{
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class Test2 {
public static void main(String[] args) {
Point point1 = new Point(1,2);
Point point2 = new Point(1,2);
System.out.println(point1.equals(point2));
}
}
重写后:
class Point{
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Point point = (Point) o;
return x == point.x && y == point.y;
}
}
public class Test2 {
public static void main(String[] args) {
Point point1 = new Point(1,2);
Point point2 = new Point(1,2);
System.out.println(point1.equals(point2));
}
}
结论:比较对象的内容是否相同时,一定要重写equals()方法。
1.4 hashcode()方法
作用:返回对象的哈希码值。哈希码主要用于在哈希表(如 Java 中的 HashMap 等集合类)中确定对象的存储位置。一般来说,两个相等的对象(根据 equals 方法判断)应该具有相同的哈希码。
我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法,我们可以来看示例
代码:
class Student{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Test3 {
public static void main(String[] args) {
Student student1 = new Student("zhangsan",15);
Student student2 = new Student("zhangsan",15);
System.out.println(student1.hashCode());
System.out.println(student2.hashCode());
}
}
两个对象的hash值不同。
当我们重写hashcode方法之后:
import java.util.Objects;
class Student{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
public class Test3 {
public static void main(String[] args) {
Student student1 = new Student("zhangsan",15);
Student student2 = new Student("zhangsan",15);
System.out.println(student1.hashCode());
System.out.println(student2.hashCode());
}
}
结论:
1、hashcode方法用来确定对象在内存中存储的位置是否相同。
2、事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的 散列码,进而确定该对象在散列表中的位置。