Java中hashCode方法的理解以及此小结的总结练习(代码)
笔记:
“散列码”就是用来把一堆对象散到各自的队列里去的一种标识码。
举个形象一点的例子,一年有 365 天,从 1 编号到 365,下面我定义一种编码方法,每个人按照他生日那天的编号作为他的标识码,这样,一群人每个人就会有一个标识码。
这个标识码有什么用呢?好,下面我说,请所有单号的人站到一起,所有双号的人站在一起。此后,当我要找一个人的时候,如果知道他的编号是单号,那我只需要到前面一堆人里去找,查找效率提高了一倍。
如果我说,请编号能被 16 整除的人站到一起,被 16 除余 1 的人站到一起,被 16 除余 2 的人站到一起…… 此后,当我要找一个人的时候,查找效率就会提高到 16 倍。
这就是散列码。所以,一个好的散列码算法,配合一个适当的存储机制,就能够实现高效的存储管理。
那么,不好的散列码算法会有多糟糕呢?比如,hashCode() 返回一个常量,那么,无论什么存储机制都会退化,所有的人都站在一堆里,查找效率无法提高。不过,也就只是影响效率,不会影响“正确性”,因为散列码的本性决定了,所有的算法都不应该假设两个不同的对象必须有不同的散列码。
总结:
EqualsTest:
- package equals;
- /**
- * 此程序实现了Employee类和Manager类的equals,hashCode和toString方法
- * @author 大凌轩
- *
- */
- public class EqualsTest {
- public static void main(String[] args) {
- Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
- Employee alice2 = alice1;
- Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
- Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);
- System.out.println("alice1 == alice2: " + (alice1 == alice2));
- System.out.println("alice1 == alice3: " + (alice1 == alice3));
- System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));
- System.out.println("alice1.equals(bob): " + alice1.equals(bob));
- System.out.println("bob.toString(): " + bob);
- Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);
- Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
- boss.setBonus(5000);
- System.out.println("boss.toString(): " + boss);
- System.out.println("carl.equals(boss): " + carl.equals(boss));
- System.out.println("alice1.hashCode(): " + alice1.hashCode());
- System.out.println("alice3.hashCode(): " + alice3.hashCode());
- System.out.println("bob.hashCode(): " + bob.hashCode());
- System.out.println("carl.hashCode(): " + carl.hashCode());
- }
- }
Employee:
- package equals;
- import java.time.LocalDate;
- import java.util.Objects;
- public class Employee {
- private String name;
- private double salary;
- private LocalDate hireDay;
- public Employee(String name, double salary, int year, int month, int day) {
- this.name = name;
- this.salary = salary;
- hireDay = LocalDate.of(year, month, day);
- }
- public String getName() {
- return name;
- }
- public double getSalary() {
- return salary;
- }
- public LocalDate getHireDay() {
- return hireDay;
- }
- public void raiseSalary(double byPercent) {
- double raise = salary * byPercent / 100;
- salary += raise;
- }
- public boolean equals(Object otherObject) {
- // a quick test to see if the objects are identical
- if (this == otherObject)
- return true;
- // must return false if the explicit parameter is null
- if (otherObject == null)
- return false;
- // if the classes don't match, they can't be equal
- if (getClass() != otherObject.getClass())
- return false;
- // now we know otherObject is a non-null Employee
- Employee other = (Employee) otherObject;
- // test whether the fields have identical values
- return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
- }
- public int hashCode() {
- return Objects.hash(name, salary, hireDay);
- }
- public String toString() {
- return getClass().getName() + "[name=" + name + ", salary=" + salary + ", hireDay=" + hireDay + "]";
- }
- }
Manager:
- package equals;
- public class Manager extends Employee {
- private double bonus;
- public Manager(String name, double salary, int year, int month, int day) {
- super(name, salary, year, month, day);
- bonus = 0;
- }
- public double getSalary() {
- double baseSalary = super.getSalary();
- return baseSalary + bonus;
- }
- public void setBonus(double bonus) {
- this.bonus = bonus;
- }
- public boolean equals(Object otherObject) {
- if (!super.equals(otherObject))
- return false;
- Manager other = (Manager) otherObject;
- // super.equals checked that this and other belong to the same class
- return bonus == other.bonus;
- }
- public int hashCode() {
- return super.hashCode() + 17 * new Double(bonus).hashCode();
- }
- public String toString() {
- return super.toString() + "[bonus=" + bonus + "]";
- }
- }
Java中hashCode方法的理解以及此小结的总结练习(代码)的更多相关文章
- java中hashCode方法与equals方法的用法总结
首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...
- 对Java中HashCode方法的深入思考
前言 最近在学习 Go 语言,Go 语言中有指针对象,一个指针变量指向了一个值的内存地址.学习过 C 语言的猿友应该都知道指针的概念.Go 语言语法与 C 相近,可以说是类 C 的编程语言,所以 Go ...
- Java中hashCode()方法以及HashMap()中hash()方法
Java的Object类中有一个hashCode()方法: public final native Class<?> getClass(); public native int hashC ...
- java中hashCode()方法的作用
hashcode方法返回该对象的哈希码值. hashCode()方法可以用来来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的位置,Map在搜索一个对象的时候先 ...
- Java中join()方法的理解
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程. 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. t.join ...
- Java中hashcode的理解
Java中hashcode的理解 原文链接http://blog.csdn.net/chinayuan/article/details/3345559 怎样理解hashCode的作用: 以 java. ...
- Java中hashCode的作用
转 http://blog.csdn.net/fenglibing/article/details/8905007 Java中hashCode的作用 2013-05-09 13:54 64351人阅 ...
- java 中hashcode和equals 总结
一.概述 在Java中hashCode的实现总是伴随着equals,他们是紧密配合的,你要是自己设计了其中一个,就要设计另外一个.当然在多数情况下,这两个方法是不用我们考虑的,直 ...
- c#和java中的方法覆盖——virtual、override、new
多态和覆盖 多态是面向对象编程中最为重要的概念之一,而覆盖又是体现多态最重要的方面.对于像c#和java这样的面向对象编程的语言来说,实现了在编译时只检查接口是否具备,而不需关心最终的实现,即最终的实 ...
随机推荐
- 黑马程序员spring data jpa 2019年第一版本
第一步首先创建一个maven工程,导入对于的pom依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...
- ceph bluestore与 filestore 数据存放的区别
一. filestore 对象所在的PG以文件方式放在xfs文件中 1 查看所有的osd硬盘,跟其他linux其他硬盘一样,被挂载一个目录中. [root@hz-storage1 ~]# df -h ...
- 019.Kubernetes二进制集群存储longhorn
一 Longhorn存储部署 1.1 Longhorn概述 Longhorn是用于Kubernetes的开源分布式块存储系统. 提示:更多介绍参考:https://github.com/longhor ...
- Hills——一道转移方程很“有趣”的线性DP
题目描述 Welcome to Innopolis city. Throughout the whole year, Innopolis citizens suffer from everlastin ...
- 洛谷 P3592 [POI2015]MYJ
题意 给定\(m\)个区间\([a_i,b_i]\)以及\(c_i\),对于一个含有\(n\)个元素的序列\(ans[]\),区间\(i\)对其的贡献为\(\min\{ans_i\}(i\in[a_i ...
- Code Forces 833 A The Meaningless Game(思维,数学)
Code Forces 833 A The Meaningless Game 题目大意 有两个人玩游戏,每轮给出一个自然数k,赢得人乘k^2,输得人乘k,给出最后两个人的分数,问两个人能否达到这个分数 ...
- Sta,题解
题目: 分析: 这个有点过于简单,两次Dfs处理出Dp[i],Son[i],Deep[i],Val[i](分别表示以1为根时i所有子树的深度之和,以1为根时i子树节点个数,以1为根时i深度,以i为根时 ...
- Uni-app登录态管理(vuex)
应用中,保持登录状态是常见需求,本文讲解使用uni-app框架时如何保持用户登录状态. 即:初次进入应用为未登录状态------->登录---------->关闭应用,再次打开------ ...
- 【第五空间智能安全大赛】hate_php WriteUp
环境:https://www.ctfhub.com/#/challenge 打开题目可以看到源码: 阅读源码发现过滤掉了f l a g . p h / ; " ' ` | [ ] _ =这些 ...
- centos彻底删除文件夹创建文件
centos彻底删除文件夹.文件命令(centos 新建.删除.移动.复制等命令: 1.新建文件夹 mkdir 文件名 新建一个名为test的文件夹在home下 view source1 mkdir ...