摘要


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. C# string[,]与string[][]的区别

    对于这两者的区别: 1.入门:string[,]可读可写,而string[][]与string[]相同,不可对第二位进行写操作 static void Main(string[] args) { // ...

  2. Python 结巴分词

    今天的任务是对txt文本进行分词,有幸了解到"结巴"中文分词,其愿景是做最好的Python中文分词组件.有兴趣的朋友请点这里. jieba支持三种分词模式: *精确模式,试图将句子 ...

  3. OpenCV: Canny边缘检测算法原理及其VC实现详解(转载)

    原文地址:http://blog.csdn.net/likezhaobin/article/details/6892176 原文地址:http://blog.csdn.net/likezhaobin/ ...

  4. 获取元素高度及定位js

    <script type="text/javascript">                                   $(window).scroll(f ...

  5. [转] shiro简单配置

    shiro(1) 注:这里只介绍spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 ...

  6. JavaWeb学习记录总结(二十九)--Servlet\Session\Cookie\Filter实现自动登录和记住密码

    一.Servlet package autologin.servlet.login; import java.io.IOException;import java.security.MessageDi ...

  7. ISBN号码

    总时间限制:  1000ms 内存限制:  65536kB 描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如"x-xxx- ...

  8. Codeforces Round #108 (Div. 2)

    Codeforces Round #108 (Div. 2) C. Pocket Book 题意 给定\(N(N \le 100)\)个字符串,每个字符串长为\(M(M \le 100)\). 每次选 ...

  9. 【转】iOS 删除已经配置的类库和移除CocoaPods

    原文网址:http://www.jianshu.com/p/552f21a989ba 引言 我们使用CocoaPods非常高效地将一些第三方类库导入到我们的项目中,但是不由得产生一个疑问:如果发现某个 ...

  10. caffe: compile error : undefined reference to `cv::imread(cv::String const&, int)' et al.

    when I compile caffe file : .build_debug/lib/libcaffe.so: undefined reference to `cv::imread(cv::Str ...