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

----答案是 可以

原因:

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

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

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

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

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

 
 

测试代码:

  1. package com.rainy.test;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Set;
  5.  
  6. public class App {
  7. public static void main(String[] args) {
  8. Set<A> set = new HashSet<A>();
  9. A a1 = new A();
  10. A a2 = new A();
  11. a1.a = "1";
  12. a2.a = "2";
  13.  
  14. set.add(a1);
  15. set.add(a2);
  16.  
  17. for (A a : set) {
  18. System.out.println(a.a);
  19. }
  20. }
  21. }
  22.  
  23. class A {
  24.  
  25. public String a;
  26.  
  27. @Override
  28. public boolean equals(Object obj) {
  29. A obja = (A)obj;
  30. return this.a.equals(obja.a);
  31. }
  32.  
  33. @Override
  34. public int hashCode() {
  35. return 1;
  36. }
  37.  
  38. }

代码结果:

2
1

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

  1. hashCode之一--两个对象值相同,有相同的hash code

    两个对象值相同(x.equals(y) == true),则一定有相同的hash code. 这是java语言的定义:  因为:Hash,一般翻译做“散列”,也有直接音译为"哈希" ...

  2. Java基础(六)判断两个对象相等:equals、hashcode、toString方法

    1.equal方法 Object类中的equal方法用于检测一个对象是否等于另外一个对象.在Object类中,这个方法将判断两个对象是否具有相同的引用.如果两个对象具有相同的引用,它们一定是相等的.然 ...

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

    这个得看情况,如果该对象重写了equals方法,那么可能会出现equals相同,但hashcode不同的情况,但假如没有重写equals方法,那么它默认继承是Object的equals方法,根据源码可 ...

  4. C# 对象哈希码

    FCL的设计者认为,如果能将任何对象的任何实例放到哈希集合中,能带来很多好处.但是这里说一点,还是会存在,哈希码类似的情况,这一点大型网站架构这本书中有介绍,最好做下MD5算法.为此,System.O ...

  5. CRUD搬砖两三年了,怎么阅读Spring源码?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! ‍连读同事写的代码都费劲,还读Spring? 咋的,Spring 很难读! 这个与我们码农朝夕 ...

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

    现在应该经常用到记录操作日志,修改和新增必定涉及到两个实体的属性值的变动. 利用反射,将变动记录下来. 切记,类中的属性字段上面需要打上Description标签: 例如: /// <summa ...

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

    java比较两个对象是否相等直接使用equals方法进行判断肯定是不会相同的. 例如: Person  person1  =new Person("张三"); Person  pe ...

  8. 判断java中两个对象是否相等

    java中的基本数据类型判断是否相等,直接使用"=="就行了,相等返回true,否则,返回false. 但是java中的引用类型的对象比较变态,假设有两个引用对象obj1,obj2 ...

  9. js中两个对象的比较

    代码取自于underscore.js 1.8.3的isEqual函数. 做了一些小小的修改,主要是Function的比较修改. 自己也加了一些代码解读. <!DOCTYPE html> & ...

随机推荐

  1. web自定义控件UserControl

    今天做了两个自定义控件,之前用WPF也做过,但是感觉跟今天的不太一样.首先是在项目中建了一个UserContral的控件界面,把需要的控件拖到里面,再给按钮添加事件.我们公司的控件都是买的Dev Ex ...

  2. [转]Integer.valueOf(String) 方法之惑

    具体问题以前偶然遇到过,好象是一个java答题得分的论坛,当时做错还研究了下怎么回事,但是前两天遇到类似问题却没想起来.巩固下基础,转了下面文章. 以下内容转自:http://www.importne ...

  3. asp.net core StaticFiles中间件修改wwwroot

    new StaticFileOptions() { FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentD ...

  4. 解决一个报表EdmFunction报错问题

        最近测试组提了一个bug,说是某个报表点击查询报错,查看错误log,错误信息如下. 类型"Ticket.Data.SqlFuns"上指定的方法"Boolean C ...

  5. 安装apache+php+mysql

    #yum -y install httpd   安装完成之后查看安装时生成了哪些文件: #rpm -ql httpd   绑定域名(如果没有域名可以跳过): #cd /etc/httpd/conf.d ...

  6. 解决visualsvn监听ip 错误的问题

    系统重启+休眠之类的,弄几次,莫名其妙的svn就连接不上了, 有时候启动不起,有时候是启动连接不上,发现监听的ip错了 TCP    [::]:443               [::]:0     ...

  7. HDU 4035 Maze 概率dp,树形dp 难度:2

    http://acm.hdu.edu.cn/showproblem.php?pid=4035 求步数期望,设E[i]为在编号为i的节点时还需要走的步数,father为dfs树中该节点的父节点,son为 ...

  8. C语言中文件的读取和写入

    在C语言中写文件 //获取文件指针 FILE *pFile = fopen("1.txt", //打开文件的名称 "w"); // 文件打开方式 如果原来有内容 ...

  9. ubuntu下 GCC编译程序出现 undefined reference to `std::ios_base::Init::Init()'问题

    网上的解释是:“ you need to add -lstdc++, or use 'g++' rather than 'gcc' as your driver program.”,也就是说如果想要使 ...

  10. ubuntu连接Android调试

    从这周开始尝试Android开发,记下点滴. 安装JDK.下载ADT不说,连接手机调试的时候出错,一堆问号??????????.网上一查,属于典型错误.试下来,有几步比较关键,容易忽视: 1.我机器上 ...