HashMap源码阅读--2018-03-14

以前看了java7的HashMap源码,时间长了全忘了,今天重新阅读java8的hashmap,发现变动挺大,记录下。

1.node取代entry。

2.数量超过8个使用红黑树。

阅读中发现transient关键字很多,但是hashmap序列化很正常。找到解释如下:

1.transient 是表明该数据不参与序列化。因为 HashMap 中的存储数据的数组数据成员中,数组还有很多的空间没有被使用,没有被使用到的空间被序列化没有意义。所以需要手动使用 writeObject() 方法,只序列化实际存储元素的数组。

2. 由于不同的虚拟机对于相同 hashCode 产生的 Code 值可能是不一样的,如果你使用默认的序列化,那么反序列化后,元素的位置和之前的是保持一致的,可是由于 hashCode 的值不一样了,那么定位函数 indexOf()返回的元素下标就会不同,这样不是我们所想要的结果.

手写了写入读出

private void writeObject(java.io.ObjectOutputStream s) throws IOException {

int buckets = capacity();

// Write out the threshold, loadfactor, and any hidden stuff

s.defaultWriteObject();

s.writeInt(buckets);

s.writeInt(size);

internalWriteEntries(s);

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,307评论 0 16
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,126评论 0 4
  • 其实我也写作也坚持了有几年,我一直有写博客的习惯,但我有一梦想就像当一个作家,但每次和父母说你“”不要做白日梦了。...
    cca8645a5515阅读 497评论 0 0
  • Sanny在漫游阅读 184评论 0 0
  • 一、Elementary系统概述 Elementary OS作为Ubuntu的扩展分之,号称是最美的Linux发行...
    肆不肆傻阅读 25,164评论 8 24