当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2022-07-13
5.2.3 HashCode方法 String类型散列码,其实这种做法是Rabin-Karp: 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 力扣题目:https://leetcode-


5.2.3 HashCode方法

  • String类型散列码,其实这种做法是Rabin-Karp:
  • 《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString_类与对象

    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_java_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,哈希比较相当于失效,比较、排序效率大大降低。
  • 区分度不能太高。比如所有元素都返回它的唯一ID。实际上这样就相当于没有设置哈希码,直接使用equals过滤,同样也没有起到哈希码粗略筛选的作用。
  • 常用的哈希码形式:
  • 字符串长度
  • 数值固定除数求余,除数通常为质数
  • Rabin-Karp类数值新元素参与累加求值
  • 可参考哈希表写法
  • 《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString_类与对象_07

     

    5.2.4 toString 方法

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

    《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString_java_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_数据结构_11

    网友评论