JavaSE知识分享——Object类小结
接下来博主会持续更新JavaSE、Java数据结构、MySQL、JavaEE、微服务、Redis等等内容的知识点整理。后续我也会精心制作算法解析、项目经验系列内容,内容绝对干货。相信这些文章能够成为我和大家的“葵花宝典”,喜欢的话就关注一下吧!敬请期待!
文章目录
- Object类
- 对象比较:equals方法
- hashCode方法
Object类
-
Object类是Java默认提供的一个类。 Java里面除了Object类,其他所有的类都是存在继承关系的,它们默认会继承Object父类。那么这样所有类的对象都可以使用Object的引用进行接收。
-
在开发之中, Object类是参数的最高统一类型。Object类也存在定义好的一些方法,之前已经介绍过一个:toString()方法
toString() 就是来获取一个对象的信息的,调用时默认输出对象哈希码,也可以重写toString()方法,来自定义输出内容。
本节我们再介绍两个方法: equals()方法, hashCode()方法。
对象比较:equals方法
我们知道回忆一下,在Java中, 用 = =操作符进行比较时:
1.如果= =操作符左右两侧是基本类型变量,比较的是变量中值是否相同
2.如果= =操作符左右两侧是引用类型变量,比较的是引用变量地址是否相同
equals方法原型:
// Object类中的equals方法
public boolean equals(Object obj) {
return (this = = obj); // 使用引用中的地址直接来进行比较
我们看到equals方法实现也是使用==操作符,那么如果要比较对象中的内容,还是必须要重写Object中的equals方法。
Person类重写equals方法后,然后比较:
class Person{
//各属性
//...
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false ;
}
if(this == obj) {
return true ;
}
// 若obj引用中不是Person类对象
if (!(obj instanceof Person)) {
return false ;
}
Person person = (Person) obj ; // 向下转型,比较属性值
return this.name.equals(person.name) && this.age==person.age ;
//代码中 this.name.equals(person.name) 其实是调用了String类中的重写的equals方法
//而这个重写的方法就是用来比较对象中实际数据的,而不是与操作符一样比较地址。
//因为name是一个是String类型的变量,编译器识别到了直接默认调用String类中重写的equals方法。
}
}
hashCode方法
hashCode方法源码:
public native int hashCode();
可以看到该方法是一个native方法,就是底层是由C/C++代码写的,我们看不到。
- 在业务处理中我们主观在逻辑上认为两个名字相同,年龄相同的person对象,将存储在同一个位置,主观认为他们的哈希值应该是相同的。
- 而如果不重写hashCode()方法,那么在原本的hashCode方法中,计算机逻辑上则认为他们本身就是两个对象,那么返回的哈希值实际上就是不一样的。那么这样在实际业务中就会出现问题。
比如:在两次数据添加时,对象中储存的数值是一模一样的,但是两个对象的哈希值确实不一样,那么此时计算机就会添加重复的数据。
那这个时候就需要我们在类中重写hashCode()方法:
class Person {
public String name;
public int age;//构造方法…@Override
public int hashCode() {
return Objects.hash(name, age);//直接调用Objects工具类中的hash()方法
}
}
-
hash(Object... values)是 Objects 类中的一个静态方法。
它可以接收任意数量、任意类型的参数( name 和 age 就是传入的参数),并基于这些参数生成一个唯一的整数哈希码。 -
其实对hashCode的重写源于Java的一个核心约定:如果两个对象根据 equals 方法比较是相等的(业务上数据的数值是一样的),那么调用它们的hashCode 方法必须返回相同的整数值 。这样的约定也就方便业务处理。
觉得文章对你有帮助的话就点个赞,收藏起来这份免费的资料吧!也欢迎大家在评论区讨论技术、经验
