笔记:

“散列码”就是用来把一堆对象散到各自的队列里去的一种标识码。

举个形象一点的例子,一年有 365 天,从 1 编号到 365,下面我定义一种编码方法,每个人按照他生日那天的编号作为他的标识码,这样,一群人每个人就会有一个标识码。

这个标识码有什么用呢?好,下面我说,请所有单号的人站到一起,所有双号的人站在一起。此后,当我要找一个人的时候,如果知道他的编号是单号,那我只需要到前面一堆人里去找,查找效率提高了一倍。

如果我说,请编号能被 16 整除的人站到一起,被 16 除余 1 的人站到一起,被 16 除余 2 的人站到一起…… 此后,当我要找一个人的时候,查找效率就会提高到 16 倍。

这就是散列码。所以,一个好的散列码算法,配合一个适当的存储机制,就能够实现高效的存储管理。

那么,不好的散列码算法会有多糟糕呢?比如,hashCode() 返回一个常量,那么,无论什么存储机制都会退化,所有的人都站在一堆里,查找效率无法提高。不过,也就只是影响效率,不会影响“正确性”,因为散列码的本性决定了,所有的算法都不应该假设两个不同的对象必须有不同的散列码。

总结:

EqualsTest:

  1. package equals;
  2.  
  3. /**
  4. * 此程序实现了Employee类和Manager类的equals,hashCode和toString方法
  5. * @author 大凌轩
  6. *
  7. */
  8. public class EqualsTest {
  9.  
  10. public static void main(String[] args) {
  11. Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
  12. Employee alice2 = alice1;
  13. Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
  14. Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);
  15.  
  16. System.out.println("alice1 == alice2: " + (alice1 == alice2));
  17.  
  18. System.out.println("alice1 == alice3: " + (alice1 == alice3));
  19.  
  20. System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));
  21.  
  22. System.out.println("alice1.equals(bob): " + alice1.equals(bob));
  23.  
  24. System.out.println("bob.toString(): " + bob);
  25.  
  26. Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);
  27. Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
  28. boss.setBonus(5000);
  29. System.out.println("boss.toString(): " + boss);
  30. System.out.println("carl.equals(boss): " + carl.equals(boss));
  31. System.out.println("alice1.hashCode(): " + alice1.hashCode());
  32. System.out.println("alice3.hashCode(): " + alice3.hashCode());
  33. System.out.println("bob.hashCode(): " + bob.hashCode());
  34. System.out.println("carl.hashCode(): " + carl.hashCode());
  35. }
  36.  
  37. }

Employee:

  1. package equals;
  2.  
  3. import java.time.LocalDate;
  4. import java.util.Objects;
  5.  
  6. public class Employee {
  7. private String name;
  8. private double salary;
  9. private LocalDate hireDay;
  10.  
  11. public Employee(String name, double salary, int year, int month, int day) {
  12. this.name = name;
  13. this.salary = salary;
  14. hireDay = LocalDate.of(year, month, day);
  15. }
  16.  
  17. public String getName() {
  18. return name;
  19. }
  20.  
  21. public double getSalary() {
  22. return salary;
  23. }
  24.  
  25. public LocalDate getHireDay() {
  26. return hireDay;
  27. }
  28.  
  29. public void raiseSalary(double byPercent) {
  30. double raise = salary * byPercent / 100;
  31. salary += raise;
  32. }
  33.  
  34. public boolean equals(Object otherObject) {
  35. // a quick test to see if the objects are identical
  36. if (this == otherObject)
  37. return true;
  38.  
  39. // must return false if the explicit parameter is null
  40. if (otherObject == null)
  41. return false;
  42.  
  43. // if the classes don't match, they can't be equal
  44. if (getClass() != otherObject.getClass())
  45. return false;
  46.  
  47. // now we know otherObject is a non-null Employee
  48. Employee other = (Employee) otherObject;
  49.  
  50. // test whether the fields have identical values
  51. return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
  52. }
  53.  
  54. public int hashCode() {
  55. return Objects.hash(name, salary, hireDay);
  56. }
  57.  
  58. public String toString() {
  59. return getClass().getName() + "[name=" + name + ", salary=" + salary + ", hireDay=" + hireDay + "]";
  60. }
  61.  
  62. }

Manager:

  1. package equals;
  2.  
  3. public class Manager extends Employee {
  4. private double bonus;
  5.  
  6. public Manager(String name, double salary, int year, int month, int day) {
  7. super(name, salary, year, month, day);
  8. bonus = 0;
  9. }
  10.  
  11. public double getSalary() {
  12. double baseSalary = super.getSalary();
  13. return baseSalary + bonus;
  14. }
  15.  
  16. public void setBonus(double bonus) {
  17. this.bonus = bonus;
  18. }
  19.  
  20. public boolean equals(Object otherObject) {
  21. if (!super.equals(otherObject))
  22. return false;
  23. Manager other = (Manager) otherObject;
  24. // super.equals checked that this and other belong to the same class
  25. return bonus == other.bonus;
  26. }
  27.  
  28. public int hashCode() {
  29. return super.hashCode() + 17 * new Double(bonus).hashCode();
  30. }
  31.  
  32. public String toString() {
  33. return super.toString() + "[bonus=" + bonus + "]";
  34. }
  35. }

Java中hashCode方法的理解以及此小结的总结练习(代码)的更多相关文章

  1. java中hashCode方法与equals方法的用法总结

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...

  2. 对Java中HashCode方法的深入思考

    前言 最近在学习 Go 语言,Go 语言中有指针对象,一个指针变量指向了一个值的内存地址.学习过 C 语言的猿友应该都知道指针的概念.Go 语言语法与 C 相近,可以说是类 C 的编程语言,所以 Go ...

  3. Java中hashCode()方法以及HashMap()中hash()方法

    Java的Object类中有一个hashCode()方法: public final native Class<?> getClass(); public native int hashC ...

  4. java中hashCode()方法的作用

    hashcode方法返回该对象的哈希码值.      hashCode()方法可以用来来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的位置,Map在搜索一个对象的时候先 ...

  5. Java中join()方法的理解

    thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程. 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. t.join ...

  6. Java中hashcode的理解

    Java中hashcode的理解 原文链接http://blog.csdn.net/chinayuan/article/details/3345559 怎样理解hashCode的作用: 以 java. ...

  7. Java中hashCode的作用

    转  http://blog.csdn.net/fenglibing/article/details/8905007 Java中hashCode的作用 2013-05-09 13:54 64351人阅 ...

  8. java 中hashcode和equals 总结

    一.概述            在Java中hashCode的实现总是伴随着equals,他们是紧密配合的,你要是自己设计了其中一个,就要设计另外一个.当然在多数情况下,这两个方法是不用我们考虑的,直 ...

  9. c#和java中的方法覆盖——virtual、override、new

    多态和覆盖 多态是面向对象编程中最为重要的概念之一,而覆盖又是体现多态最重要的方面.对于像c#和java这样的面向对象编程的语言来说,实现了在编译时只检查接口是否具备,而不需关心最终的实现,即最终的实 ...

随机推荐

  1. 黑马程序员spring data jpa 2019年第一版本

    第一步首先创建一个maven工程,导入对于的pom依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...

  2. ceph bluestore与 filestore 数据存放的区别

    一. filestore 对象所在的PG以文件方式放在xfs文件中 1 查看所有的osd硬盘,跟其他linux其他硬盘一样,被挂载一个目录中. [root@hz-storage1 ~]# df -h ...

  3. 019.Kubernetes二进制集群存储longhorn

    一 Longhorn存储部署 1.1 Longhorn概述 Longhorn是用于Kubernetes的开源分布式块存储系统. 提示:更多介绍参考:https://github.com/longhor ...

  4. Hills——一道转移方程很“有趣”的线性DP

    题目描述 Welcome to Innopolis city. Throughout the whole year, Innopolis citizens suffer from everlastin ...

  5. 洛谷 P3592 [POI2015]MYJ

    题意 给定\(m\)个区间\([a_i,b_i]\)以及\(c_i\),对于一个含有\(n\)个元素的序列\(ans[]\),区间\(i\)对其的贡献为\(\min\{ans_i\}(i\in[a_i ...

  6. Code Forces 833 A The Meaningless Game(思维,数学)

    Code Forces 833 A The Meaningless Game 题目大意 有两个人玩游戏,每轮给出一个自然数k,赢得人乘k^2,输得人乘k,给出最后两个人的分数,问两个人能否达到这个分数 ...

  7. Sta,题解

    题目: 分析: 这个有点过于简单,两次Dfs处理出Dp[i],Son[i],Deep[i],Val[i](分别表示以1为根时i所有子树的深度之和,以1为根时i子树节点个数,以1为根时i深度,以i为根时 ...

  8. Uni-app登录态管理(vuex)

    应用中,保持登录状态是常见需求,本文讲解使用uni-app框架时如何保持用户登录状态. 即:初次进入应用为未登录状态------->登录---------->关闭应用,再次打开------ ...

  9. 【第五空间智能安全大赛】hate_php WriteUp

    环境:https://www.ctfhub.com/#/challenge 打开题目可以看到源码: 阅读源码发现过滤掉了f l a g . p h / ; " ' ` | [ ] _ =这些 ...

  10. centos彻底删除文件夹创建文件

    centos彻底删除文件夹.文件命令(centos 新建.删除.移动.复制等命令: 1.新建文件夹 mkdir 文件名 新建一个名为test的文件夹在home下 view source1 mkdir ...