文章目录
- 前言
- 1. Iterable
- 2. RandomAccess
- 2.1 RandomAccess 使用索引进行二分查找
- 3. Map
- 3.1 HashMap
- 3.2 IdentityHashMap
- 4. Collections 工具类
- 4.1 Collections.shuffle() 洗牌
前言
目的:
- 收集JDK集合类的类图。
- 记录一些有意思的设计。
- 将之前写过的文章建立联系。
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() 可以控制线程暂停,比如输入回车就能继续执行,起到一个类似断点的作用