摘要


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. Python是编译运行的

    虽然Python被说成是一种解释型语言,但是实际上,Python源程序要先经过编译,然后才能运行. 与Java语言类似,Python源程序编译之后得到的是字节码,交由Python虚拟机来运行. 关于这 ...

  2. codeforce Error Correct System

    题目大意: 给出两串n(1 ≤ n ≤ 200 000)个字母的字符串, 求出最多交换一对数, 使得不相同对数变少,求出不相同的对数以及交换的数的位置,若不需交换则输出-1,-1. 分析: 用矩阵记录 ...

  3. UI学习笔记---第十三天可视化设计 XIB, StoryBoard

    一.XIB Xib是一种苹果提供的快速构建界面的编程方式,主要是为了简化MVC中的V的构建 Xib提供可视化的编辑界面,能大大提升页面布局效率 Xib常用操作 为控件关联事件 为空间指定delegat ...

  4. indexOf()的用法

    indexOf()的用法:返回字符中indexof(string)中字串string在父串中首次出现的位置,从0开始!没有返回-1:方便判断和截取字符串! indexOf()定义和用法indexOf( ...

  5. 单元测试--四则运算2程序(c++)

    源代码: //2016 3.6 Cheng Qiqin //四则运算改进 #include <iostream> #include<ctime> #include<cst ...

  6. HTML 5 canvas —— 基本语法

    目录 简述 canvas 基础 2D context API 基本线条 路径 插入图像 像素级操作 文字 阴影 颜色渐变 小节 简述 HTML 5 规范引进了很多新特性,其中最令人期待的之一就是 ca ...

  7. Microservice Orleans

    https://azure.microsoft.com/en-us/blog/containers-docker-windows-and-trends/ https://channel9.msdn.c ...

  8. KMP字符串模式匹配学习笔记

    KMP算法实验 1.编程计算模式串(子串)的next值.2.利用KMP算法在主串中找到模式串的位置. 参考代码:---------int getNexlVal( char * s,  int j)// ...

  9. xunsearch增量索引改进版

    最近测试了xunserach全文索引程序.xunsearch只有LINUX版,所以想用windows服务器请使用其它全文索引程序.xunsearch本身不像coreseek那样自带增量索引的功能,所以 ...

  10. pip使用报错【cannot import name HTTPSHandler】

    python2.7,报错如下: Traceback (most recent call last): File "/usr/local/bin/pip", line 9, in & ...