专栏首页陈琛的Redis文章Java中的Object类 (上篇)

Java中的Object类 (上篇)

咱今天学习的是Java的Object类,首先先看代码,类里面有哪些方法。

咱今天学习两个方法,分别hashCode,equals。

1

Object中的hashCode方法就是根据一定的规则与对象相关的信息映射成一个数值,这个数值称为散列值。

  public native int hashCode();

这时有个关键字native,Java平台有个用户和本地C代码进行交互操作的API,称为Java Native Interface(简称为JNI)。

2

Object中的equals方法是用来比较两个对象是否相等的,即object1.equals(object2)为true,则表示object1和object2实际上是引用的同一个对象,但是我们大部分时候进行的是两个对象值的比较,而非地址的比较,所以这个时候,Object的equals方法就不行了。

这时候有的小哥哥要说不对啊,我们平常也使用了String,Integer,Long类型也进行了equals比较啊,他是比较的值,而非地址,你这不会瞎扯淡吧。

不慌不慌,咱慢慢看,先上代码看一下,如果是String类型,使用equals是不是比较的值。

 public class Test {
    public static void main(String[] args){
       String str1="abc";
       String str2="abc";
       System.out.println(str1.equals(str2));
     }
 }

咱运行下代码,会发现的确打印的true,说明是比较了str1和str2的值。因为在上篇我们说过了str是一个常量,每次的string类型的数据的地址都是不一样的,不明白的可以移步上篇,,那不打脸了吗。

开玩笑,怎么可能打脸呢,那咱来看一下这个为什么呢。

原来啊,是String类里面重写了equals方法,980行到994行之间就是对两个string类型数据的比较。感谢Java粑粑,这时候是不是应该响起一首歌,你还要我怎样,要怎样。

但是这是常见的类型,那比如我们自定义了一个对象类型,要比较两个对象是否相等,那该怎么做呢,应该是重写equals方法,这里说明一下,如果两个对象通过equals来比较返回的是true,就说明这两个值相等,那么这两个对象的hashCode也应该返回相同的值。这是hashCode的常规规定,咱必须得遵守呢。

hashCode还有一个规定就是在程序运行时,同一对象多次调用hashCode方法应该返回相同的值。

基于以上的两个规定,我们自定义了一个Person类,里面有id,name,还重写了equals和hashCode方法。

上代码咯:

 public class Person {
   private String id;
   private String name;

   public String getId() {
     return id;
   }
   public void setId(String id) {
     this.id = id;
   }

   public String getName() {
     return name;
   }
   public void setName(String name) {
     this.name = name;
   }

   @Override
   public boolean equals(Object o) {
     if (o == this) {
       return true;
     }
     if (!(o instanceof Person)) {
       return false;
     }
     Person person = (Person) o;
     return person.getId().equals(id)
            && person.getName().equals(name);
   }

   @Override
   public int hashCode() {
     int result = 17;
     result = result * 31 + name.hashCode()
              + id.hashCode();
     return result;
   }
}

这里要重点说明一下重写hashCode的时候,用的是31来乘以result,这是为了让产生的hashCode唯一。

两个理由

更少的乘积结果冲突。

31是质数中不大不小的存在,如果使用如3这样比较小的质数,那么得出的乘积会在一个很小的范围内,很容易造成哈希值冲突。如果选择100以上的质数,得到的哈希值会超过int的最大范围,所以这两种都不适合。

31可以被JVM优化。31=2<<5-1,JVM可以自动识别为位运算。

您看此文用

·

秒,转发只需1秒呦~

本文分享自微信公众号 - 学习Java的小姐姐(huangtest01),作者:学习Java的小姐姐

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java中的Object类 (下篇)

    hashCode是根据一定的规则和对象相关的信息映射成一个数值,这个数值成为散列值。他是由native关键字修饰的,native关键字主要是Java与本地C代码...

    陈琛
  • [并发基础篇]MESI协议,JMM,线程常见方法等

    我们在找工作时,经常在招聘信息上看到有这么一条:要求多线程并发经验。无论是初级程序员,中级程序员,高级程序员,也无论是大厂,小厂,并发编程肯定是少不了的。

    陈琛
  • Java源码系列(4):String[]和List<String>的区别及相互转换

    Hello,everybody。好几天不见啦,原因是我家丽颖结婚了,打击太大,让我缓缓(emmmmmm,我才不会告诉你们是因为我懒)。咱今天说的是String[...

    陈琛
  • 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

    Object类是一个特殊的类,是所有类(包括数组,接口 )的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类,所以可以通过...

    张诺谦
  • Activity间数据传递方法汇总

    在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递。 一、常用数据...

    分享达人秀
  • Java Web基础入门

    前言 语言都是相通的,只要搞清楚概念后就可以编写代码了。而概念是需要学习成本的。 Java基础 不用看《编程思想》,基础语法看 http://www.runo...

    Ryan-Miao
  • 【SpringBoot-3】Lombok使用详解

    Lombak是一款Java开发插件,它主要应用在Java模型对象类中。 Lomabk通过注解的方式,隐式(即代码中不可见,但编译后可见)实现Getter/Se...

    云深i不知处
  • 扑克牌例题与Collections工具类

    我们需要创建四个类,一个封装对象的属性,一个封装牌的花色和大小也就是牌的类型,一个实现发牌,排序,洗牌功能,也就是封装对象的行为,最后一个实现图形化界面。

    端碗吹水
  • Lombok详解

    牧晗
  • spring@Conditional

    @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。

    逍遥壮士

扫码关注云+社区

领取腾讯云代金券