0
点赞
收藏
分享

微信扫一扫

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString


5.2.3 HashCode方法

  1. String类型散列码,其实这种做法是Rabin-Karp:

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString_java

Rabin-Karp 字符串编码

维基百科:https://zh.wikipedia.org/wiki/%E6%8B%89%E5%AE%BE-%E5%8D%A1%E6%99%AE%E7%AE%97%E6%B3%95

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString_数据结构_02

力扣题目:https://leetcode-cn.com/problems/longest-duplicate-substring/solution/zui-chang-zhong-fu-zi-chuan-by-leetcode-0i9rd/

Object 类的哈希值获取:实际存放数据的地址

​​jdk8u/jdk8u/hotspot: 87ee5ee27509 src/share/vm/runtime/synchronizer.cpp​​

生成源码(JDK1.8),总结,共六种方式获取哈希:

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString_核心技术_03

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString_类与对象_04

实际上,JDK6和JDK7使用的是 第一种随机数,JDK8使用的是第六种线程状态结合xorshift,啊啊啊,被腾讯云骗了(写的第一个和第五,应该是第一和第六吧),公众号那里发错了

o(╥﹏╥)o,眼睛看到的才是真相,不能太轻信:

JDK6截图:

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString_散列表_05

JDK8截图:

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString_类与对象_06

参考下面这篇:

​​java默认的hashcode方法到底得到的是什么? - 云+社区 - 腾讯云​​

其他参考文档:

​​What does java mean by native and how to view the source code, such as hashcode​​

从源码看Java中Object类中hashCode方法的实现_weixin_42559495的博客

自己如何选用哈希码?

  1. 区分度不能太低。比如所有哈希码都返回1,哈希比较相当于失效,比较、排序效率大大降低。
  2. 区分度不能太高。比如所有元素都返回它的唯一ID。实际上这样就相当于没有设置哈希码,直接使用equals过滤,同样也没有起到哈希码粗略筛选的作用。
  3. 常用的哈希码形式:
  1. 字符串长度
  2. 数值固定除数求余,除数通常为质数
  3. Rabin-Karp类数值新元素参与累加求值
  4. 可参考哈希表写法

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString_散列表_07

 

5.2.4 toString 方法

Object默认方法:类名@16进制哈希码

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString_散列表_08

StringBuilder和StringBuffer默认:生成字符串对象

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString_类与对象_09

重写 toString 通常为了打印数据

public class Main {
public static void main(String[] args){
Main solution = new Main();
A a = solution.new A();
System.out.println(a);//打印类时,会自动调用 toString 方法
}

class A{
@Override
public String toString() {
return "My name is A, Ha ha ha!";
}
}
}

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString_散列表_10

   系列内容

《Java 核心技术 卷1》 笔记:第一章 Java程序设计概述

《Java 核心技术 卷1》 笔记:第二章 Java程序设计环境

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(1)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(2)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(3)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(4)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(5)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(6)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(7)大数处理、数组、多维数组、控制台传参

《Java 核心技术 卷1》 笔记 第四章:类与对象

《Java 核心技术 卷1》 笔记 第四章:类与对象(2) GregorianCalendar 与 类的基本组成

《Java 核心技术 卷1》 笔记 第四章:类与对象(3) 构造器全局私有方法

《Java 核心技术 卷1》 笔记 第四章:类与对象(4) 静态字段+静态方法+工厂方法

《Java 核心技术 卷1》 笔记 第四章:类与对象(5) 形参与实参 构造器的默认值与默认构造

《Java 核心技术 卷1》 笔记 第四章:类与对象(6) 构造器调用与初始化块

《Java 核心技术 卷1》 笔记 第四章:类与对象(7) 注释、JavaDoc与类设计

《Java 核心技术 卷1》 笔记 第五章 继承

《Java 核心技术 卷1》 笔记 第五章 继承(2)

《Java 核心技术 卷1》 笔记 第五章 继承(3)

《Java 核心技术 卷1》 笔记 第五章 继承(4)equals方法

 喜欢的话,点个赞吧~!平时做题,以及笔记内容将更新到公众号。

关注公众号,互相学习:钰娘娘知识汇总

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString_java_11

举报

相关推荐

0 条评论