最近在整理数据结构方面的知识, 系统化看了下Java中经常使用数据结构, 突发奇想用动画来绘制数据流转过程.html
主要基于jdk8, 可能会有些特性与jdk7以前不相同, 例如LinkedList LinkedHashMap中的双向列表再也不是回环的.程序员
HashMap中的单链表是尾插, 而不是头插入等等, 后文再也不赘叙这些差别, 本文目录结构以下:面试
经典的双链表结构, 适用于乱序插入, 删除. 指定序列操做则性能不如ArrayList, 这也是其数据结构决定的.数组
add(E) / addLast(E)缓存
add(index, E)bash
这边有个小的优化, 他会先判断index是靠近队头仍是队尾, 来肯定从哪一个方向遍历链入.微信
if (index < (size >> 1)) { Node<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; }复制代码
靠队尾数据结构
get(index)性能
也是会先判断index, 不过性能依然很差, 这也是为何不推荐用for(int i = 0; i < lengh; i++)的方式遍历linkedlist, 而是使用iterator的方式遍历.学习
remove(E)
底层就是一个数组, 所以按序查找快, 乱序插入, 删除由于涉及到后面元素移位因此性能慢.
add(index, E)
扩容
通常默认容量是10, 扩容后, 会length*1.5.
remove(E)
循环遍历数组, 判断E是否equals当前元素, 删除性能不如LinkedList.
经典的数据结构, 底层也是数组, 继承自Vector, 先进后出FILO, 默认new Stack()容量为10, 超出自动扩容.
push(E)
pop()
Stack的一个典型应用就是计算表达式如 9 + (3 - 1) * 3 + 10 / 2, 计算机将中缀表达式转为后缀表达式, 再对后缀表达式进行计算.
final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { while (count == items.length) notFull.await(); enqueue(e); } finally { lock.unlock(); }复制代码
private E dequeue() { // assert lock.getHoldCount() == 1; // assert items[takeIndex] != null; final Object[] items = this.items; @SuppressWarnings("unchecked") E x = (E) items[takeIndex]; items[takeIndex] = null; if (++takeIndex == items.length) takeIndex = 0; count--; if (itrs != null) itrs.elementDequeued(); notFull.signal(); return x; }复制代码
//定义两条链 //原来的hash值新增的bit为0的链,头部和尾部 Node<K,V> loHead = null, loTail = null; //原来的hash值新增的bit为1的链,头部和尾部 Node<K,V> hiHead = null, hiTail = null; Node<K,V> next; //循环遍历出链条链 do { next = e.next; if ((e.hash & oldCap) == 0) { if (loTail == null) loHead = e; else loTail.next = e; loTail = e; } else { if (hiTail == null) hiHead = e; else hiTail.next = e; hiTail = e; } } while ((e = next) != null); //扩容先后位置不变的链 if (loTail != null) { loTail.next = null; newTab[j] = loHead; } //扩容后位置加上原数组长度的链 if (hiTail != null) { hiTail.next = null; newTab[j + oldCap] = hiHead; }复制代码
·END·
程序员的成长之路
路虽远,行则必至
本文原发于 同名微信公众号「程序员的成长之路」,回复「1024」你懂得,给个赞呗。
回复 [ 520 ] 领取程序员最佳学习方式
回复 [ 256 ] 查看 Java 程序员成长规划