摘要


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. GFF format

    后记: ************************************************************************ 在使用cufflinks和cuffmerge中 ...

  2. sticky bit

    • Sticky Bit这个Sticky Bit当前只针对目录有效,对文件没有效果.SBit对目录的作用是:“在具有SBit的目录下,用户若在该目录下具有w及x权限,则当用户在该目录下建立文件或目录时 ...

  3. web相关问题总结 - imsoft.cnblogs

    1,问题:编辑好的web程序乱码,显示不正常 解决方法:在head中加入一下代码,设置网页使用的语言为中文. <meta http-equiv="Content-Type" ...

  4. 代码管理工具TortoiseSVN

    . TortoiseSVN TortoiseSVN与Windows Explorer集成可称为是一款功能齐全的SVN客户端,允许你管理SVN项目.其自身就包含客户端无需再安装额外的SVN客户端.它还提 ...

  5. 222. Count Complete Tree Nodes

    Given a complete binary tree, count the number of nodes. Definition of a complete binary tree from W ...

  6. uboot完全手册---14

    1. u-boot介绍 本次移植采用的是U-Boot-1.2.0版本. 3. U-Boot源码分析 3.1 源码入口的解释 可能大多数的同学上网查资料后都了解到,stage1阶段的启动代码,主要就在s ...

  7. Apache使用mod_deflate模块压缩页面优化传输速度

    可以写为一行,也可以写多行,默认为gzip SetOutputFilter DEFLATE # Restrict compression to these MIME types AddOutputFi ...

  8. MySql数据类型(转)

    数值类型 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指 ...

  9. 课堂所讲整理:Set和Map

    Set相关知识: package org.hanqi.array; import java.util.*; public class Test2 { public static void main(S ...

  10. meta name="viewport" 属性详解

    随着高端手机(Andriod,Iphone,Ipod,WinPhone等)的盛行,移动互联应用开发也越来越受到人们的重视,用html5开发移动应用是最好的选择.然而,每一款手机有不同的分辨率,不同屏幕 ...