A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄晓鑫 高级黑马   /  2014-1-17 14:35  /  1246 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

比如hashCode()
equals()
toString()
求详细讲解点 讲底层点

5 个回复

倒序浏览
  1. public String toString() {
  2.         return getClass().getName() + "@" + Integer.toHexString(hashCode());
  3.     }
复制代码
回复 使用道具 举报
第一个,关于hashCode()方法:
      在Java编程语言中,每个类都提供hashCode()方法,这个方法会把类的一个实例(即对象)里面的数据转化为一个哈希值(涉及加密法,是一个32位的带符号整数),当存储或操作一个实例时(此实例应为了均匀分布在不同的输出中以便在加密时使用)这个哈希值会被其他代码使用。
      这是一个很重要的特性,以便去使用哈希表格和其他的数据结构(此数据结构是为了存储objects于建立在其他哈希运算上的集合中的)。
      技术上来说,在java,hashCode()方法是一个默认上的方法。意味着,当他被直接运用在JVM里面的原代码时,她有改特性的元性。

      所有的类都继承自基本的类java.lang.Object中的一个基本的哈希方案,而不是重新写一个哈希函数一处理他们的数据。提供自己的应用的类必须override那个object的方法即hashCode()。

      基本的协议就是为了这个方法内已经override了的应用,他们保持在与同样的object里面的equals()的方法一贯的方式中:一个提供的object必须要一贯的给出同样的哈希值(除非它改变了,那么新版本将不再被认为“equal”(等同于)旧值了),并且那两个object(即equal()关联的两个)必须提供一样的哈希值。在那些哈希值在不同的java应用中,甚至在同意程序的不同执行文件执行中的,都没必要保持一致,并且当需要两个不相等的object要有不同的哈希值时,这并不是强制的(即,应用的哈希函数不需要是完美哈希函数)

例子:
下面的类Employee通过组合它成员的哈希数来实现它的哈希函数。

public class Employee {
    int        employeeId;
    String     name;
    Department dept;

    。。。 。。。     // 其他的一些方法在这里

    @Override
    public int hashCode() {
        int hash = 1;
        hash = hash * 17 + employeeId;
        hash = hash * 31 + name.hashCode();
        hash = hash * 13 + (dept == null ? 0 : dept.hashCode());
        return hash;
    }
}

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
这个链接也有关于hashCode()的解释呢:http://www.cnblogs.com/yoyozhou/archive/2012/02/25/2367829.html
回复 使用道具 举报
类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。也就是说Object的方法是让对象实现的。

例如:hashCode()返回该对象的哈希码值
         equals()指示其他某个对象是否与此对象“相等”。
         toString()返回该对象的字符串表示。
回复 使用道具 举报
hashCode 根据对象的内存地址计算得到的整数值,该方法一般用做判断两个对象是否相等的唯一标识,不同对象有不同的哈希码值
equals 主要是用来判断两个对象是否相等,俩个对象相等坑定返回true,也可以覆盖该方法按照自己的逻辑比较对象
toString 返回对象的字符创表示,默认情况下,Object的toString返回类名 + @ + 哈希码值组成的字符串,该方法可以覆盖返回自己想要的字符串表示形式
还有,对于equals和hashCode方法,最好是覆盖了equals方法最好也要覆盖hashCode方法,举个例子,
  1. class Person{
  2.    // 属性
  3.    @Override
  4.    public boolean equals(Object obj){
  5.      // 判断是否相等的逻辑
  6. }

  7. }
复制代码

上面的类用逻辑判断相等,但是当添加到集合中时,例如Set中时会出项多个相同的结果,因为没有覆盖hashCode,而Set一般是根据hashCode方法的返回值来判断两个对象是否相等的

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马