重写 hashcode真有那么简单嘛?( 二 )


总结:恍然大悟 , 原来是这样 , 那我这个对象 , 不存在这些散列集合中不就不用遵守这个规则了嘛 。哈哈 , 大聪明 , 理论上确实是这样 。但是这篇文章我还想再写长一些 , 多占用一些面试时间 , 毕竟我还有主动权机会 。
hashcode()”伪源码“

  • 首先声明一点:Object 提供的 hashCode()方法返回值是不会重复的(也就是说每个对象返回的值都不一样) 。
有人说 , 扯淡嘛 , 我看了Object类中的hashcode()方法 , 里面什么也没有啊 , 只有方法 , 没看到实现 , 哪里来的返回值呢 。
public native int hashCode();关键字 native首先看到看关键字 native , 知识盲区来了 , 很多人不知道 这是啥东西 , 当然 , 说起这个 , 就要从盘古开天辟地开始讲了 , 我们这一节也不着重讲这个 , 篇幅有限 , 感兴趣的去问问度娘吧 。
  • 先看概念:
native 用来修饰方法 , 用 native 声明的方法表示告知 JVM 调用 , 该方法在外部定义 , 我们可以用任何语言去实现它 。简单地讲 , 一个native Method就是一个 Java 调用非 Java 代码的接口 。
  • 简单来说:我们在日常编程中看到native修饰的方法 , 只需要知道这个方法的作用是什么 , 至于别的就不用管了 , 操作系统会给我们实现 。
原来是这样 , 要是我写的代码也能这样就好了 , 我就写个方法 , 用 native 修饰 , 然后操作系统就给我自动实现 。
想的美了 , 其实操作给我们实现 , 也是其他程序员写好的代码提前编译好了 , 换句话来说就是:哪有岁月静好 , 只是有猿替你负重前行罢了 。
  • 作为一个Java程序员 , 我们还是想了解一些底层JDK代码的 。所以 , 必须把源码扒出来 , 哪怕看不懂 。(这是openjdk中的源码) 。
JDK目录
  • 知识盲区 , 有一说一 , 能把 JDK 源码读懂的人 , 真大神也 。
openjdk├ corba:不流行的多语言、分布式通讯接口├ hotspot:Java 虚拟机├ jaxp:XML 处理├ jaxws:一组 XML web services 的 Java API├ jdk:java 开发工具包├ langtools:Java 语言工具└ nashorn:JVM 上的 JavaScript 运行时hotspot目录
  • 什么叫源码 , 什么叫底层 , 这就叫专业!!!
hotspot├─agentServiceability Agent的客户端实现├─make用来build出HotSpot的各种配置文件├─srcHotSpot VM的源代码│├─cpuCPU相关代码(汇编器、模板解释器、ad文件、部分runtime函数在这里实现)│├─os操作系相关代码│├─os_cpu操作系统+CPU的组合相关的代码│└─share平台无关的共通代码│├─tools工具││├─hsdis反汇编插件││├─IdealGraphVisualizer将server编译器的中间代码可视化的工具││├─launcher启动程序“java”││├─LogCompilation将-XX:+LogCompilation输出的日志(hotspot.log)整理成更容易阅读的格式的工具││└─ProjectCreator生成Visual Studio的project文件的工具│└─vmHotSpot VM的核心代码│├─adlc平台描述文件(上面的cpu或os_cpu里的*.ad文件)的编译器│├─asm汇编器接口│├─c1client编译器(又称“C1”)│├─ci动态编译器的公共服务/从动态编译器到VM的接口│├─classfile类文件的处理(包括类加载和系统符号表等)│├─code动态生成的代码的管理│├─compiler从VM调用动态编译器的接口│├─gc_implementationGC的实现││├─concurrentMarkSweepConcurrent Mark Sweep GC的实现││├─g1Garbage-First GC的实现(不使用老的分代式GC框架)││├─parallelScavengeParallelScavenge GC的实现(server VM默认 , 不使用老的分代式GC框架)││├─parNewParNew GC的实现││└─sharedGC的共通实现│├─gc_interfaceGC的接口│├─interpreter解释器 , 包括“模板解释器”(官方版在用)和“C++解释器”(官方版不在用)│├─libadt一些抽象数据结构│├─memory内存管理相关(老的分代式GC框架也在这里)│├─oopsHotSpot VM的对象系统的实现│├─optoserver编译器(又称“C2”或“Opto”)│├─primsHotSpot VM的对外接口 , 包括部分标准库的native部分和JVMTI实现│├─runtime运行时支持库(包括线程管理、编译器调度、锁、反射等)│├─services主要是用来支持JMX之类的管理功能的接口│├─shark基于LLVM的JIT编译器(官方版里没有使用)│└─utilities一些基本的工具类└─test单元测试

经验总结扩展阅读