如果两个对象具有相同的哈希码,但是不相等的,它们可以在HashMap中同时存在吗?

----答案是 可以

原因:

在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了hashcode这个方法,而且也用到了equals方法。

这里不可以重复是说equals和hashcode只要有一个不等就可以了。


一、当我们向一个set、HashMap、HashSet、HashTable集合中添加某个元素,集合会首先调用该对象的hashCode方法,

这样就可以直接定位它所存储的位置,若该处没有其他元素,则直接保存。
若该处已经有元素存在,就调用equals方法来匹配这两个元素是否相同,相同则不存,不同则散列到其他位置

二、hashCode重要么?
对于List集合、数组而言,他就是一个累赘,不重要;但是对于HashMap、HashSet、HashTable而言,它变得异常重要。

测试代码:

package com.rainy.test;

import java.util.HashSet;
import java.util.Set;

public class App {
    public static void main(String[] args) {
        Set<A> set = new HashSet<A>();
        A a1 = new A();
        A a2 = new A();
        a1.a = "1";
        a2.a = "2";

        set.add(a1);
        set.add(a2);

        for (A a : set) {
            System.out.println(a.a);
        }
    }
}

class A {

    public String a;

    @Override
    public boolean equals(Object obj) {
        A obja = (A)obj;
        return this.a.equals(obja.a);
    }

    @Override
    public int hashCode() {
        return 1;
    }

}

代码结果:

2
1

时间: 2024-08-05 04:26:00

如果两个对象具有相同的哈希码,但是不相等的,它们可以在HashMap中同时存在吗?的相关文章

两个对象值相同,有相同的hash code

两个对象值相同(x.equals(y) == true),则一定有相同的hash code. 这是java语言的定义:  因为:Hash,一般翻译做“散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值.1) 对象相等则hashCode一定相等:2) hash

对象哈希码

1,为什么要定义GetHashCode方法 类型定义Equals之所以还要定义GetHashCode,是由于在Hashtable和Dictionary类型以及其他一些集合的实现中,要求对象必须具有相同哈希码才被视为相等.所以,重写Equals就必须重写GetHashCode方法,确保相等性算法和对象哈希码算法一致 2,选择算法来计算类型实例的哈希码时,请遵循以下规则 ①这个算法要提供良好的随即分布,使哈希表获得最佳性能 ②可在算法中调用基类的GetHashCode方法,并包含它的返回值.但一般不

两个对象的合并

需求1:设有对象 o1 ,o2,需要得到对象 o3 var o1 = { a:'a' }, o2 = { b:'b' }; var o3 = { a:'a', b:'b' } 需求2:设有对象o1和o2,这两个对象中有相同的属性a,需要得到对象o3并且a属性是o2的 var o1 = { a:'a', b:'b' }, o2 = { a:'aa', c:'c' }; var o3 = { a:'aa', b:'b', c:'c' }; 方法1:使用JQuery的extend方法 **方法定义**

两个对象值相同(x.equals(y)==true),但却可有不同的hashcode这句话对吗?

1.这句话当然不对啦,请参看官方文档给出的解释! hashCode public int hashCode()返回该对象的哈希码值.支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能. hashCode 的常规协定是: 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改.从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致

.net两个对象比较,抛出不一样字段的结果

现在应该经常用到记录操作日志,修改和新增必定涉及到两个实体的属性值的变动. 利用反射,将变动记录下来. 切记,类中的属性字段上面需要打上Description标签: 例如: /// <summary> /// 最后修改时间 /// </summary> [Description("最后修改时间")] public DateTime PIUpdateTime { get; set; } 相关代码直接附上: public class OprateLogHelper

java比较两个对象是否相等的方法

java比较两个对象是否相等直接使用equals方法进行判断肯定是不会相同的. 例如: Person  person1  =new Person("张三"); Person  person2  =new Person("张三"); boolean  falg = person1.equals(person1); falg 的值是false; 如果要判断两个对象相同就需要重写父类的equals方法和hashCode方法: 这时再次测试时falg的值就是true.

判断两个对象内容相等

我们知道,如果两个对象即使内容,javascript也会判断它们不相等.但是有时候,我们仅仅需要判断两个对象的内容是否相等.那么我们应该如何做到且考虑周全呢?比如说0和-0,null和undefined,是不相等的,NaN和NaN默认是不相等的.我写了一个isEqual方法,考虑到了诸多方面,代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>&l

集合框架比较两个对象是否相同(equals和hashCode方法)

package com.dcz.hashset; import java.util.HashSet; import java.util.Set; /** * HashSet是接口最常用的实现类,顾名思义,底层采用了哈希表算法. * * 在HashSet中如何判断两个对象是否是否相等问题分析: * 1. 要用两个对象的equals方法比较,返回true说明对象相同. * 2. 两个对象的hashCode方法返回值相同. * * 对象hashCode决定了在哈希表中的存储位置. * * 向HashS

关于:无法定义这两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象。个人解决方案

1 public class UserClazz 2 { 3 public User User{get;set;} 4 public IList<Product> ProductList{get;set;} 5 } 6 7 public class User 8 { 9 public IList<Product> ProductList{get;set;} 10 public IList<UserClazz> UserClazzList{get;set;} 11 } 1