1. hashMaphashCode() equa()的使用
  2.  
  3. java的集合中,判断两个对象是否相等的规则是:
  4. ,判断两个对象的hashCode是否相等
  5. 如果不相等,认为两个对象也不相等,完毕
  6. 如果相等,转入2
  7. ,判断两个对象用equals运算是否相等
  8. 如果不相等,认为两个对象也不相等
  9. 如果相等,认为两个对象相等 
  10.  
  11. 复制代码
  12. import java.util.HashSet;
  13. import java.util.Iterator;
  14. import java.util.Set;
  15.  
  16. import android.app.Activity;
  17. import android.os.Bundle;
  18.  
  19. public class TestCollectionActivity extends Activity {
  20. /** Called when the activity is first created. */
  21.  
  22. @Override
  23. public void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.main);
  26.  
  27. Set<Person> hashSet = new HashSet<Person>();
  28. hashSet.add(new Person("张先生", ));
  29. hashSet.add(new Person("张太太", ));
  30. hashSet.add(new Person("张先生", ));
  31. hashSet.add(new Person("网先生", ));
  32. hashSet.add(new Person("网先生", ));
  33. hashSet.add(new Person("张先生", ));
  34. /** 最后结果输出为:
  35. *      张先生 12121212
  36. 张太太 12121213
  37. 网先生 12121210
  38. 张先生 12121210
  39.  
  40. 如果不添加hashCode()和equals(),所有person成员都将正常输出
  41. 添加hashCode和equals之后,若a.hashCode() = b.hashCode且equals返回为true,此时原先的成员将被替代,
  42. 导致了上面的结果输出
  43. */
  44.  
  45. Iterator<Person> it = hashSet.iterator();
  46. while(it.hasNext()) {
  47. Person person = it.next();
  48. System.out.println(person.getName() + " " + person.getId_card());
  49. }
  50.  
  51. }
  52.  
  53. public class Person {
  54. private String name;
  55. private long id_card;
  56. public Person(String name, long id_card) {
  57. this.name = name;
  58. this.id_card = id_card;
  59. }
  60.  
  61. public long getId_card(){
  62. return id_card;
  63. }
  64.  
  65. public String getName() {
  66. return name;
  67. }
  68.  
  69. public int hashCode() {
  70. int result = ;
  71. result = (int)(id_card ^(id_card>>));
  72. return result;
  73. // final int PRIME = 31;
  74. // int result = 1;
  75. // result = PRIME * result + (int)(id_card ^ (id_card >>32));//long型数据取(int)位
  76. // result = PRIME * result + ((name == null) ? 0 : name.hashCode());
  77. // return result;
  78. }
  79.  
  80. public boolean equals(Object obj) {
  81. if (this == obj)
  82. return true;
  83. if (obj == null)
  84. return false;
  85. if (getClass() != obj.getClass())
  86. return false;
  87. final Person other = (Person) obj;
  88. if (id_card != other.id_card)
  89. return false;
  90. if (name == null) {
  91. if (other.name != null)
  92. return false;
  93. } else if (!name.equals(other.name))
  94. return false;
  95. return true;
  96. }
  97. }
  98. }
  99. 复制代码
  100.  
  101. hashCode()和equal()由输出情况可得知:添加hashCode()和equals()之后,若a.hashCode() = b.hashCodeequals返回为true,此时原先的成员将被替代,导致了上面的结果输出。
  102.  
  103. hashCode用于快速判断两个对象是否相等,如果相等,则根据equal的返回值确定是否覆盖,equal()返回true则覆盖。
  104.  
  105. 下面是补充:
  106.  
  107. =====================================
  108. 为什么要重载equal方法?
  109. 答案:因为Objectequal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等;如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法。
  110. 为什么重载hashCode方法?
  111. 答案:一般的地方不需要重载hashCode,只有当类需要放在HashTableHashMapHashSet等等hash结构的集合时才会重载hashCode,那么为什么要重载hashCode呢?就HashMap来说,好比HashMap就是一个大内存块,里面有很多小内存块,小内存块里面是一系列的对象,可以利用hashCode来查找小内存块hashCode%size(小内存块数量),所以当equal相等时,hashCode必须相等,而且如果是object对象,必须重载hashCodeequal方法。
  112. 为什么equals()相等,hashCode就一定要相等,而hashCode相等,却不要求equals相等?
  113. 答案:、因为是按照hashCode来访问小内存块,所以hashCode必须相等。
  114. HashMap获取一个对象是比较keyhashCode相等和equaltrue
  115. 之所以hashCode相等,却可以equal不等,就比如ObjectAObjectB他们都有属性name,那么hashCode都以name计算,所以hashCode一样,但是两个对象属于不同类型,所以equalfalse
  116. 为什么需要hashCode?
  117. 通过hashCode可以很快的查到小内存块。
  118. 通过hashCode比较比equal方法快,当get时先比较hashCode,如果hashCode不同,直接返回false

微信公众号【黄小斜】大厂程序员,互联网行业新知,终身学习践行者。关注后回复「Java」、「Python」、「C++」、「大数据」、「机器学习」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「笔试」、「面试」、「面经」、「计算机基础」、「LeetCode」 等关键字可以获取对应的免费学习资料。

hashMap的hashCode() 和equal()的使用的更多相关文章

  1. java——HashCode和equal方法

    equals()反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值. 而hashCode()是对象或变量通过哈希算法计算出的哈希值. 之所以有hashCode方 ...

  2. hashCode和equal

    转自:https://www.cnblogs.com/dolphin0520/p/3681042.html hashCode方法在Object类中: public native int hashCod ...

  3. java hashcode()和equal()方法比较

    通常equals,toString,hashCode,在应用中都会被复写,建立具体对象的特有的内容. 之所以有hashCode方法,是因为在批量的对象比较中,hashCode要比equals来得快,很 ...

  4. HashCode和equal方法

    equals()反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值. 而hashCode()是对象或变量通过哈希算法计算出的哈希值. 之所以有hashCode方 ...

  5. HashMap中hashCode()和equals()重要性

    Java中HashMap根据hashCode()和equals()方法来获取键值对的索引,同时也通过这两个方法由key值获取value值.如果没有这两个方法,那么当有两个相同的 hash值时,可能会被 ...

  6. HashMap与HashCode有关,用Sort对象排序

    遍历Map,使用keySet()可以返回set值,用keySet()得到key值,使用迭代器遍历,然后使用put()得到value值. 上面这个算法的关键语句: Set s=m.keySet(); I ...

  7. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序

    HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不 ...

  8. 对hashmap与hashcode()、equals()的理解

    1.equals方法没被重写的时候   比较的只是对象的地址  重写之后 比较的才是对象里的内容 2.重写equals的时候 务必需要重写hashcode 不然在用到容器的时候 会出现问题 因为容器会 ...

  9. HashMap/HashSet,hashCode,哈希表

    hash code.equals和“==”三者的关系 1) 对象相等则hashCode一定相等: 2) hashCode相等对象未必相等. == 是比较地址是否相等,JAVA中声明变量都是引用嘛,不同 ...

随机推荐

  1. HDU4460

    #include <iostream> #include <queue> #include <vector> #include <cstring> #i ...

  2. centos7制作本地yum源

    创建想要挂载的路径 mkdir /mnt/cdrom 挂载本地镜像到创建的目录 mount -t iso9660 /dev/cdrom /mnt/cdrom/ mount: /dev/sr0 is w ...

  3. $("").append无反应

    网页中F12看控制台提示“ReferenceError: $ is not defined” 解决: script src路径出了问题,改为 <script type="text/ja ...

  4. Convert Spaces to Tabs

    :set tabstop=2 " To match the sample file :set noexpandtab " Use tabs, not spaces :%retab! ...

  5. 安装virtualbox出现2503、2502的错误提示解决方法

    安装virtualbox右键选择以管理员的身份打开即可

  6. EF学习笔记(九):异步处理和存储过程

    总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇:EF学习笔记(八):更新关联数据 本篇原文:Async and Stored Procedures 为何要采用异步? ...

  7. MATLAB2016a安装破解教程

    首先,下载软件:下面是某博主的分享,可以下载软件. 链接:https://pan.baidu.com/s/1i6BgD8p       密码:17gg  第一步:安装软件 1,下载文件,得到R2016 ...

  8. ARM指令学习

    跳转指令 直接向程序计数器PC写入i跳转地址值,可以实现在4GB的地址空间中的任意跳转. ARM跳转指令可以完成向前或向后的32MB的地址空间的跳转. -B 跳转指令 -BL 带返回的跳转指令 -BL ...

  9. Azure Sphere–“Object reference not set to an instance of an object” 解决办法

    在开发Azure Sphere应用时,如果出现项目无法编译,出现“Object reference not set to an instance of an object”时,必须从下面两个方面进行检 ...

  10. Senparc.Weixin SDK v5.0 升级公告

    经过五年半的持续维护,Senparc.Weixin SDK 逐步丰满和完善,在升级的过程中,我们为基础库(Senparc.Weixin.dll)加入了许多通用的功能,例如加密/解密算法.通用缓存方法等 ...