✨hello,愿意点进来的小伙伴们,你们好呐!
✨ 🐻🐻系列专栏:【JavaSE】
🐲🐲本篇内容:Object 类的简单介绍
🐯🐯作者简介:一名大一即将升大二的三非编程小白
Object类是Java默认提供的一个类。在Java中,除了Object类,其余所有类都是存在继承关系的。都会默认继承于 Object类。即所有类的对象都可以使用Object类来进行引用。比如:
1.使用Object接收类的对象:
对于Object类中的方法都很重要,我们今天主要挑三个方法来介绍:
- hashCode()
- equals()
- toString()
下面介绍的是企业最常用的Java8版本
1. hashCode()方法
在Java的文档中可以找到hashCode的介绍,“返回对象的哈希码值”
究竟什么是哈希码值呢?
让我们一起去Java源码中找答案吧
我们在原码中找到了hashCode的位置,该方法是被native修饰的,说明它底层是由C语言和C++编写的,我们暂时看不到底层是如何返回哈希码值的。
其实hashCode他帮我算了一个具体的对象位置,这里面涉及数据结构,但是我们还没学数据结构,没法讲述,所以我们只能说它是个内存地址。然后调用Integer.toHexString()方法,将这个地址以16进制输出。但是用hashCode原本的算法来计算,两个名字相同,年龄相同的对象就不会存储在同一位置。我们想存储在同一位置就必须重写hashCode方法。
未重写:
我们可以看到在没有重写hashCode的时候,他们的返回的哈希码值是不一样的。
重写后:
- 而重写了hashCode后,它返回的哈希码值便相同了。但是调用了Objects类的hash方法。该方法又是什么呢?我们继续来看看。
- 在hash中调用的是Arrays的hashCode方法,该方法才是重写hashCode后返回哈希码值的核心代码。
- 最后是通过该算法来得到对象的哈希码值。
注意:
1、hashcode方法用来确定对象在内存中存储的位置是否相同
2、事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。
2. equals()方法
在学习equals方法之前我们应该先认识一下 ‘==’ 。
- 如果‘==’两端是基本类型变量,比较的是变量中的值是否相等。
- 如果‘==’左右两端是引用数据类型,比较的是引用变量地址是否相同。
- 如果要比较对象中内存是否相等,也必须重写Object中的equals方法。
1. Object中的equals方法
我们可以看出Object中的equals方法来比较引用数据类型时是来比较引用变量地址是否相等。当我们想比较对象中的内容时,我们应该重写equals方法。
1. 未重写:
这样子运行完结果为 false
2. 重写后:
class test{
public String name;
public int age;
public test(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
test test = (test) o;
return age == test.age &&
Objects.equals(name, test.name);
}
}
public class Test01 {
public static void main(String[] args) {
test test = new test("123" , 123);
test test1 = new test("123",123);
System.out.println(test.equals(test1));
}
}
重写后比较发现两个内容相同的对象返回值为true。
我们也可以在它比较核心代码中修改比较逻辑。
建议在重写equals的同时也重写它的好兄弟hashCode。
原因:
-
两个对象相等,hashCode一定相等
-
两个对象不等,hashCode不一定不等
-
hashCode相等,两个对象不一定相等
-
hashCode不等,两个对象一定不等
3. toString()方法
在Object类中toString方法在引用类型调用时是通过对象的地址来返回处理后的值。
通过toHexString()来返回处理后的哈希码值。不同对象返回的值不同。
toString在打印对象名称的时候JVM底层会自己调用。所以我们经常来重写toString来方便打印。
会输出一个处理过的哈希码值。
重写后:
class test{
public String name;
public int age;
public test(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "test{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Test01 {
public static void main(String[] args) {
test test = new test("123" , 123);
System.out.println(test.toString());
}
}
会打印出: