PriorityQueue:优先级队列; 在介绍该类之前,我们需要先了解一种数据结构--堆,在有些书上也直接称之为优先队列: 堆(Heap)是是具有下列性质的完全二叉树:每个结点的值都 >= 其左右子结点的值,称为最大堆(Max Heap,或称大顶堆);每个结点的值都 <= 其左右子结点的值,称为最小堆(Min Heap,或称小顶堆): Note:上述定义摘自<大话数据结构>,其定义并不是很准确,堆有很多种,完全二叉树只是其一种实现方式,也是最常见的一种实现方式.在<数据结构…
本篇我们来介绍一个最常用的Map结构--HashMap 关于HashMap,关于其基本原理,网上对其进行讲解的博客非常多,且很多都写的比较好,所以.... 这里直接贴上地址: 关于hash算法: Hash算法 Hash时取模一定要模质数吗? 关于HashMap: 深入Java集合学习系列:HashMap的实现原理 漫画:什么是HashMap? JDK 源码中 HashMap 的 hash 方法原理是什么? What is the use of Holder class in HashMap?(H…
关于WeakHashMap其实没有太多可说的,其与HashMap大致相同,区别就在于: 对每个key的引用方式为弱引用; 关于java4种引用方式,参考java Reference 网上很多说 弱引用指向 Entry,这种说法是完全错误的 在key被回收时,对应的value并没有回收,只有在调用WeakHashMap的方法时才会回收value; 具体请看下列源码解析: /** * 数据结构原理几乎与HashMap一致; * WeakHashMap 不会阻止Entry.key被回收; * Weak…
ArrayDeque,从名字上就可以看出来,其是通过数组实现的双端队列,我们先来看其源码: /** 有自动扩容机制; 不是线程安全的; 不允许添加null; 作为栈使用时比java.util.Stack快; 作为队列使用时比LinkedList快; 支持fast-fail; * @since 1.6 */ public class ArrayDeque<E> extends AbstractCollection<E> implements Deque<E>, Clone…
IdentityHashMap,使用什么的跟HashMap相同,主要不同点在于: 数据结构:使用一个数组table来存储 key:value,table[2k] 为key, table[2k + 1] 为value,也即: key:value ==> table[2k]:table[2k + 1](HashMap使用数组 + 链表); IdentityHashMap 中的 key 和 value 通过==来比较是否相等(HashMap通过equals()); IdentityHashMap 中的…
在之前讲LinkedHashMap的时候,我们说起可以用来实现LRU(least recent used)算法,接下来我看一下其中的一个具体实现-----android sdk 中的LruCache. 关于Lru算法,请参考漫画:什么是LRU算法? talk is cheap, I am gonna show you something really expensive. package android.util;// 该类是从Android sdk 中摘录 public class LruCa…
LinkedHashMap继承自HashMap,除了提供HashMap的功能外,LinkedHashMap还是维护一个双向链表(实际为带头结点的双向循环链表),持有所有的键值对的引用: 这个双向链表定义了迭代器的迭代顺序,默认按插入顺序迭代; 也可以在构造时设置为按照LRU方式(访问顺序)迭代(from least-recently accessed to most-recently access-order),最近最少访问的键值对放在链表最前(头结点之后的第一个结点); 废话不多说,直接看源码…
最近刚好学习完成数据结构与算法相关内容: Data-Structures-and-Algorithm-Analysis 想结合Java中的容器类加深一下理解,因为之前对Java的容器类理解不是很深刻,且在网上找了半天没有找到太好的关于容器类细节的讲解(其中找到一些博客,讲得很好,但是其中还是有些东西没有触碰到我原来的理解痛点),还是决定自己写一个Java容器解析系列. <Java编程思想>书中对容器进行完整的类关系图如下: 官方文档:Java Collection Framework 本系列将…
前面介绍了List和Queue相关源码,这篇开始,我们先来学习一种java集合中的除Collection外的另一个分支------Map,这一分支的类图结构如下: 这里为什么不先介绍Set相关:因为很多Set实现类是通过对应的Map来实现,使用Map中key不能重复的特性,往Set中add元素的本质就是Map的put(),这里先介绍Map,后续介绍Set的时候再做具体介绍 首先,我们来看Map接口: /** Map将key映射到value(存储键值对); 一个map不能存在重复的key; 一个k…
首先我们来看一下Queue接口: /** * @since 1.5 */ public interface Queue<E> extends Collection<E> { // 添加指定元素,在添加失败时(队列满),抛出IllegalStateException boolean add(E e); // 添加指定元素,在添加失败时(队列满),返回false boolean offer(E e); // 删除并返回头部,当队列为空时,抛出NoSuchElementException…