HashCode相关

简介: 转帖,还是转帖 哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。  下面给出几个常用的哈希码的算法。  1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。  2:Strin

转帖,还是转帖

哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。
  下面给出几个常用的哈希码的算法。
  1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
  2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。

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

类 HashMap<K,V>

 

java.lang.Object
  java.util.AbstractMap<K,V>
      java.util.HashMap<K,V>

类型参数:
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<Object, String> values = new HashMap<Object, String>(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

 

目录
相关文章
|
19天前
|
存储 Java
两个对象的 hashCode()相同,则 equals()
当两个对象的 `hashCode()` 方法返回值相同时,这两个对象的 `equals()` 方法不一定返回 `true`。`hashCode()` 相同仅表示两对象可能相等,需进一步通过 `equals()` 方法验证对象是否真正相等。
27 7
|
5月前
|
Java 容器
equals与hashcode的区别与联系
equals与hashcode的区别与联系
|
7月前
|
存储 Java 对象存储
当hashCode相同时,equals是否也相同?
当hashCode相同时,equals是否也相同?
39 0
|
7月前
|
存储 Java
为什么要重写hashCode()和equals()(深入了解)
为什么要重写hashCode()和equals()(深入了解)
|
存储 NoSQL
简单讲一下 HashCode() 与 equals()方法
简单讲一下 HashCode() 与 equals()方法.
113 0
|
存储 Java 索引
都2022年了,不会还有人hashCode方法都讲解不清楚吧
都2022年了,不会还有人hashCode方法都讲解不清楚吧
hashCode和equals的区别
hashCode和equals的区别
330 0
|
存储 缓存 算法
关于 equals 和 hashCode,看这一篇真的够了!
这几天在尝试手撸一个类似Lombok的注解式代码生成工具,用过Lombok的小伙伴知道,Lombok可以通过注解自动帮我们生产equals()和hashCode()方法,因此我也想实现这个功能,但是随着工作的深入,我发现其实自己对于equals()和hashCode()的理解,也处在一个很低级的阶段。
关于 equals 和 hashCode,看这一篇真的够了!
|
存储 算法 Java
equals 和 hashCode 到底有什么联系?
写在前面 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和hashCode()都不是final方法,都可以被重写(overwrite)。
equals 和 hashCode 到底有什么联系?
|
测试技术
hashCode和equals的区别(二)
Hello,大家好,我是子悠,作为本周的小编我已经不想跟大家介绍自己了,这篇文章让我们跟随 Jay Pan( 哇,一位新作者哦)的步伐学习知识吧。下面是正文。 有面试官会问:你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?equals和hashCode都是Object对象中的非final方法,它们设计的目的就是被用来覆盖(override)的,所以在程序设计中还是经常需要处理这两个方法。下面我们一起来看一下,它们到底有什么区别,总结一波!