博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashCode相关
阅读量:6220 次
发布时间:2019-06-21

本文共 2748 字,大约阅读时间需要 9 分钟。

转帖,还是转帖

哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。

  下面给出几个常用的哈希码的算法。
  1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
  2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。

  3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。

类 HashMap<K,V>

 

java.util.HashMap
类型参数:
K - 此映射所维护的键的类型
V - 所映射值的类型
 
基于哈希表的 
Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 
null 值和
null 键。(除了非同步和允许使用 null 之外,
HashMap 类与 
Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
import java.util.HashMap;public class Test {    //重写Equals不重写HashCode    static class Key {        private Integer id;        private String value;                public Key(Integer id, String value) {            super();            this.id = id;            this.value = value;        }        @Override        public boolean equals(Object o) {            if(o == null || !(o instanceof Key)) {                return false;            }else {                return this.id.equals(((Key)o).id);            }        }    }    //重写Equals也重写HashCode        static class Key_ {            private Integer id;            private String value;                        public Key_(Integer id, String value) {                super();                this.id = id;                this.value = value;            }            @Override            public boolean equals(Object o) {                if(o == null || !(o instanceof Key_)) {                    return false;                }else {                    return this.id.equals(((Key_)o).id);                }            }            @Override            public int hashCode() {                 return id.hashCode();            }                     }    public static void main(String[] args) {        //test hashcode        HashMap
values = new HashMap
(5); Test.Key key1 = new Test.Key(1, "one"); Test.Key key2 = new Test.Key(1, "one"); System.out.println(key1.equals(key2)); values.put(key1, "value 1"); System.out.println(values.get(key2)); Test.Key_ key_1 = new Test.Key_(1, "one"); Test.Key_ key_2 = new Test.Key_(1, "one"); System.out.println(key_1.equals(key_2)); System.out.println(key_1 == key_2); values.put(key_1, "value 1"); System.out.println(values.get(key_2)); }}

输出如下:

       由上述例子可见:只重写了equasl方法的Key类 在用做Hash中的键值的时候 两个equasl为true的对象不能获取相应 的Value的而重写了hashCode方法和equals方法的key_类 两个相等的对象 可以获取同一个Value的,这样更符合生活中 的逻辑HashMap对象是根据Key的hashCode来获取对应的Vlaue 因而两个HashCode相同的对象可以获取同一个Value

 

转载于:https://www.cnblogs.com/vichao/archive/2013/06/04/3117961.html

你可能感兴趣的文章
linux----别名
查看>>
struts2拦截器demo
查看>>
go基本操作
查看>>
linux 安装jdk
查看>>
Kotlin入门(17)等式判断的情况
查看>>
Django rest_framework配合django_filter使用
查看>>
Windows下安装Python模块时环境配置
查看>>
Delphi 发展历史
查看>>
sharepoint2010 treeview实现
查看>>
转:为什么Maven Update Project JDK变回1.5
查看>>
航电 Problem 2044一直小蜜蜂
查看>>
luoguP1357 花园
查看>>
正则表达式
查看>>
运用<body>属性,渲染页面效果
查看>>
作业:实现简单的shell sed替换功能和修改haproxy配置文件
查看>>
原来商家登录系统的commonjs
查看>>
[python机器学习及实践(3)]Sklearn实现K近邻分类
查看>>
用pillow和 opencv做透明通道的两图混全(blend)
查看>>
POJ 1002 487-3279
查看>>
netty 4.x 用户手册翻译
查看>>