目录

一、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() 的作用是获取对象的 散列码,进而确定该对象在散列表中的位置。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部