摘要


Java中equals()和hashCode()有一个契约:
  1. 如果两个对象相等的话,它们的hash code必须相等;
  2. 但如果两个对象的hash code相等的话,这两个对象不一定相等;
这个约定直接导致了如下3个规则:
  1. :无论你何时实现 equals 方法,你必须同时实现 hashCode 方法;
  2. 永远不要把哈希码误用作一个key;
  3. 在分布式应用中不要使用哈希码;
需要说明的是:
  • 关于规则2:《永远不要把哈希码误用作一个key》
==>也可以将哈希码作为key,但需要经过2步去处理:
  1. 对键采用hashCode()计算出来的值;==>这样可以找出哈希码相同,但是不相等对象的集合;
  2. 对这个集合使用键的equals()方法来进行线性查找,直到找到要找的对象;

测试程序1:(同时实现了equals()方法和Hashcode()方法)


package com.ll.hashcode;
import java.util.HashMap;
public class HashcodeTest {
     private String color;
     
        public HashcodeTest(String color) {
            this.color = color;
        }
     
        @SuppressWarnings("unchecked")
        public static void main(String[] args) {
            HashcodeTest a1 = new HashcodeTest("green");
            HashcodeTest a2 = new HashcodeTest("red");
     
            //hashMap stores apple type and its quantity
            HashMap m = new HashMap();
            m.put(a1, 10);
            m.put(a2, 20);
            System.out.println(m.get(new HashcodeTest("green")));
        }
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((color == null) ? 0 : color.hashCode());
            return result;
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            HashcodeTest other = (HashcodeTest) obj;
            if (color == null) {
                if (other.color != null)
                    return false;
            } else if (!color.equals(other.color))
                return false;
            return true;
        }
}

结果:



测试程序2(只实现了equals()方法,未实现Hashcode()方法)


package com.ll.hashcode;
import java.util.HashMap;
public class HashcodeTest {
     private String color;
     
        public HashcodeTest(String color) {
            this.color = color;
        }
     
        public boolean equals(Object obj) {
            if (!(obj instanceof HashcodeTest))
                return false;   
            if (obj == this)
                return true;
            return this.color.equals(((HashcodeTest) obj).color);
        }
     
        @SuppressWarnings("unchecked")
        public static void main(String[] args) {
            HashcodeTest a1 = new HashcodeTest("green");
            HashcodeTest a2 = new HashcodeTest("red");
     
            //hashMap stores apple type and its quantity
            HashMap m = new HashMap();
            m.put(a1, 10);
            m.put(a2, 20);
            System.out.println(m.get(new HashcodeTest("green")));
        }
}

结果:

参考链接:

《Java中的equals()和hashCode()契约》:http://www.importnew.com/8701.html 
《关于 hashCode() 你需要了解的 3 件事》:http://www.importnew.com/16517.html 








【java基础学习-2--】关于Hashcode()的使用的更多相关文章

  1. JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API

    森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397  文章- 0  评论- 78  JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...

  2. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  3. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  4. Java基础学习中一些词语和语句的使用

    在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...

  5. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  6. 转载-java基础学习汇总

    共2页: 1 2 下一页  Java制作证书的工具keytool用法总结 孤傲苍狼 2014-06-24 11:03 阅读:25751 评论:3     Java基础学习总结——Java对象的序列化和 ...

  7. java基础学习总结——开篇

    java是我学习的第一门编程语言,当初学习java基础的时候下了不少功夫,趁着这段时间找工作之际,好好整理一下以前学习java基础时记录的笔记,当作是对java基础学习的一个总结吧,将每一个java的 ...

  8. Java基础学习笔记(一)

    Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...

  9. java基础学习总结——java环境变量配置(转)

    只为成功找方法,不为失败找借口! 永不放弃,一切皆有可能!!! java基础学习总结——java环境变量配置 前言 学习java的第一步就要搭建java的学习环境,首先是要安装 JDK,JDK安装好之 ...

随机推荐

  1. win7 通过命令行压缩文件

    1,下载winrar这款软件(可能要正式版) 2,安装完之后在c:\programe files里找到winrar目录,复制winrar目录里的winRar.exe文件到c盘下的windows目录 3 ...

  2. [sql server发布订阅]after触发器执行失败造成复制不成功

    结论: (以插入而例) 发布端的数据插入成功 订阅段的数据不会插入 实验 创建一张新表 create table test_subscriber (id int, mark varchar(2),in ...

  3. Java--接口和类集框架

    一.接口 接口是静态常量和抽象方法的集合.也就是说,接口中只能有静态常量和抽象方法. public interface Pet { public static final int A = 10; pu ...

  4. Spring MVC+Maven+Freemarker+Mybatis开发环境搭建

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 创建一个Spring MVC项目 集成Freemarker 集成Mybatis Mybatis自动生成工具   利用STS( ...

  5. ASP.NET Web API与Rest web api(一)

    本文档内容大部分来源于:http://www.cnblogs.com/madyina/p/3381256.html HTTP is not just for serving up web pages. ...

  6. 求10000以内n的阶乘

    总时间限制:  5000ms 内存限制:  655360kB 描述 求10000以内n的阶乘. 输入 只有一行输入,整数n(0<=n<=10000). 输出 一行,即n!的值. 样例输入 ...

  7. (6)java的内存泄露问题

    一:什么是内存泄露--->Java的一个最显著的优势是内存管理.你只需要简单的创建对象而不需要负责释放空间,因为Java的垃圾回收器会负责内存的回收.然而,情况并不是这样简单,内存泄露还是经常会 ...

  8. /bin/rm: Argument list too long解決方法

    rm.cp.mv是unix下面常用到的檔案處理指令,當我們需要刪除大量的log檔案,如果檔案數太多就會出現此訊息[/bin/rm: Argument list too long]解決方式如下: 例如要 ...

  9. freeswitch 挂断前执行脚本

    通道变量名 api_hangup_hook 介绍在挂断时执行指定API命令 示例 <action application="set" data="api_hangu ...

  10. Python中strip()函数

    在python API中这样解释strip()函数: