两分钟“手撕”Object类

目录

一、什么是Object类

二、Object常见的类

1.toString()方法

2.equals()方法

3.hashcode()方法 


一、什么是Object类

Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父类。即所有类的对象都可以使用Object的引用进行接收。简单来讲:Object类是所有类的父类。

class Person{}
class Student{}

public class Test {
    public static void main(String[] args) {
        Func(new Person());
        Func(new Student());
    }
    public static void Func(Object obj){
        System.out.println(obj);
    }
}
//执行结果
ObjectPratice.Person@3b07d329
ObjectPratice.Student@404b9385

既然可以向上转型,那就说明Person和Student继承于Object这个类。 

二、Object常见的类

1.toString()方法

这是一个常见的方法,如果要打印对象中的内容,可以直接重写Object类中的toString()方法。

怎么重写:右键generate->toString();

// Object类中的toString()方法实现:
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

2.equals()方法

在Java中,==进行比较时:

a.如果==左右两侧是基本类型变量,比较的是变量中值是否相同

b.如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同

c.如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的: 

class Person {
    public String name;
    public int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 10;
        Person person1 = new Person("zhangsan", 4);
        Person person2 = new Person("zhangsan", 4);

        System.out.println(a==b);
        System.out.println(person1==person2);
        System.out.println(person1.equals(person2));
    }
}
//执行结果
true
false
false

Person类重写equals方法后,然后比较: 

import java.util.Objects;

class Person {
        public String name;
        public int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (this == obj) {
            return true;
        }
// 不是Person类对象
        if (!(obj instanceof Person)) {
            return false;
        }
//因为传值过去是向上转型,这时候不能使用子类的name,需要向下转型
        Person person = (Person) obj; // 向下转型,比较属性值
        return this.name.equals(person.name) && this.age == person.age;
    }
}
public class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 10;
        Person person1 = new Person("zhangsan", 4);
        Person person2 = new Person("zhangsan", 4);

        System.out.println(a==b);
        System.out.println(person1==person2);
        System.out.println(person1.equals(person2));
    }
}
//执行结果
true
false
true

结论:比较对象中内容是否相同的时候,一定要重写equals方法。 

3.hashcode()方法 

hashCode()这个方法,他帮我算了一个具体的对象位置,我们不大正规的可以说它是个内存地址。

hashcode方法源码:(该方法是一个native方法,底层是由C/C++代码写的。我们看不到。)

public native int hashCode();

我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法,我们可以来看示例 代码: 

class Person {
    public String name;
    public int age;
public Person(String name, int age) {
    this.name = name;
    this.age = age;
}
}
public class TestDemo4 {
public static void main(String[] args) {
    Person per1 = new Person("zhangsan", 20) ;
    Person per2 = new Person("zhangsan", 20) ;
    System.out.println(per1.hashCode());
    System.out.println(per2.hashCode());
}
}
//执行结果
460141958
1163157884

 注意事项:两个对象的hash值不一样。

但是若两个对象,他们名字和年龄一样的话,在我们的业务逻辑中,我们可以认为他们是同个人 ,用同一个hash值。

像重写equals方法一样,我们也可以重写hashcode()方法。此时我们再来看看:

class Person {
public String name;
    public int age;
public Person(String name, int age) {
    this.name = name;
    this.age = age;
}
//重写hashCode方法
@Override
public int hashCode() {
    return Objects.hash(name, age);
}
}
public class TestDemo4 {
public static void main(String[] args) {
    Person per1 = new Person("gaobo", 20) ;
    Person per2 = new Person("gaobo", 20) ;
    System.out.println(per1.hashCode());
    System.out.println(per2.hashCode());
}
}
//执行结果
460141958
460141958

结论:

1、hashcode方法用来确定对象在内存中存储的位置是否相同

2、事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。

相关推荐

  1. 分钟Object

    2024-05-02 18:44:05       38 阅读
  2. 分钟”内部+static在内部的使用

    2024-05-02 18:44:05       35 阅读
  3. 机器学习-聚算法Kmeans【

    2024-05-02 18:44:05       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-02 18:44:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-02 18:44:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-02 18:44:05       87 阅读
  4. Python语言-面向对象

    2024-05-02 18:44:05       96 阅读

热门阅读

  1. Docker Compose部署项目flask+mysql + redis

    2024-05-02 18:44:05       31 阅读
  2. 爬虫学习--2.urllib 库

    2024-05-02 18:44:05       27 阅读
  3. 《21天学通C++》(第十三章) 类型转换运算符

    2024-05-02 18:44:05       29 阅读
  4. MyBatis:mybatis入门

    2024-05-02 18:44:05       28 阅读
  5. MySQL:多表查询和事务

    2024-05-02 18:44:05       36 阅读
  6. 程序员副业可用的四大原则

    2024-05-02 18:44:05       30 阅读
  7. Circuits--Sequential--Finite5

    2024-05-02 18:44:05       32 阅读
  8. BKPUNIX

    2024-05-02 18:44:05       30 阅读
  9. 单片机与Python串口通讯

    2024-05-02 18:44:05       31 阅读