【Java】JDK集合类源码设计相关笔记

前言

目的:

  1. 收集JDK集合类的类图。
  2. 记录一些有意思的设计。
  3. 将之前写过的文章建立联系。

1. Iterable

在这里插入图片描述

2. RandomAccess

Iterable 接口实现中,有少部分类实现了 RandomAccess
在这里插入图片描述

2.1 RandomAccess 使用索引进行二分查找

	if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
        return Collections.indexedBinarySearch(list, key);
	else
        return Collections.iteratorBinarySearch(list, key);

【Java】JDK借助RandomAccess接口 ,定制ArrayList与LinkedList的二分查找策略


  • BINARYSEARCH_THRESHOLD 阈值讨论
    private static final int BINARYSEARCH_THRESHOLD   = 5000;

the reasoning is benchmarks. Oracle engineers (because that version comes from Oracle JDK) benchmarked the performance of the two solutions and observed the Iterator solution perfomed better on larger data-sets.

Stackoverflow 讨论, 结论是 Oracle 的工程师测试大数据时,基于iterator的二分查找效率更高。

3. Map

在这里插入图片描述

3.1 HashMap

  • Java 对象同时重写 hashCode 和 equals 方法是避免hash冲突时,覆盖旧对象(以对象作为Key)
    在这里插入图片描述
  • 关于 hashcode 和 equals 方法是否冗余的讨论
    Stackoverflow 讨论, 结论是 hashcode 提供快速验证两个对象是否一致,equals用于准确判断是否一致。上文的源码用法也恰巧符合这一观点,e.hash == hash 如果不成立,则立马逻辑短路,不再使用 equals方法。

3.2 IdentityHashMap

  • 与HashMap处理 hashCode 的方式相反
    HashMap 内部使用了 native的hashCode 作为寻址方法,忽略掉重写的hashCode方法。
    言下之意就是不管引用的内容怎么变,依旧能够用使用该引用正常寻址。
    在这里插入图片描述
    【Java】IdentityHashMap 的使用场景

4. Collections 工具类

4.1 Collections.shuffle() 洗牌

可以对List进行原地洗牌,无状态的接口,使用起来很舒服。

在这里插入图片描述
PS: System.in.read() 可以控制线程暂停,比如输入回车就能继续执行,起到一个类似断点的作用

猜你喜欢

转载自blog.csdn.net/chenghan_yang/article/details/143879234
今日推荐