
集合
吴顺达
这个作者很懒,什么都没留下…
展开
-
ArrayList 一篇就够
平常开发中以下语句可能是最经常写的语句之一List<Integer> list = new ArrayList<>();继承关系public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.SerializableArrayList顶层接口是Collection,List,RandomAcce原创 2020-11-11 17:20:18 · 259 阅读 · 1 评论 -
LinkedList 一篇就够
创建List<Integer> list = new LinkedList<>();结构 双向链表继承关系public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, SerializableSerializable接口中内容是空的,是一个标志接口,一个类只有实现了Ser原创 2020-11-11 21:48:21 · 175 阅读 · 0 评论 -
Iterator简介 LinkedList使用迭代器优化移除批量元素原理
public interface Iterator<E> { /** *是否还有下一个元素 */ boolean hasNext(); /** *下一个元素 */ E next(); /** * 从集合中删除最后一个返回的元素 */ default void remove() { throw new UnsupportedOperationException("remove原创 2020-11-12 20:12:16 · 700 阅读 · 0 评论 -
LinkedHashMap源码阅读
LinkedHashMap源码阅读原创 2020-11-13 23:36:24 · 157 阅读 · 0 评论 -
数组 List 去除重复数据 多种实现及性能分析
有序的情况下去重单指针法:前者与后者比01、使用两个for循环实现List去重(有序)双层针法:02、使用List集合contains方法循环遍历(有序)双层针法:contains方法调用indexof方法,内部实现还是循环遍历03、使用HashSet实现List去重(无序)04、使用TreeSet实现List去重(有序)05、使用java8新特性stream实现List去重(有序)桶排序法:...原创 2020-11-22 15:01:28 · 442 阅读 · 0 评论 -
BlockingQueue 的使用与源码阅读
结构其中数组是循环使用的,真实中不存在从3到1的指针,使用的是putIndex,takeIndex两个下标索引。当此时存放的元素putIndex等于数组的长度-1时,putIndex下次就会变成0,又从头开始存放元素。takeIndex原理一样。基于数组实现的,并且内部持有一把ReentrantLock(读写一把)。ArrayBlockingQueue的使用简单说一下情况,后面从方法中分析。生产线程将元素放入队列中时需要先获取锁,获取到锁后向队列存放元素。消费线程获取队列中元素时也需要先获取锁,原创 2020-11-25 19:04:13 · 155 阅读 · 0 评论 -
PriorityQueue PriorityBlockingQueue 优先级队列与优先级阻塞队列 源码解析
试想一下,如果要在一堆数据中找出最大的或者最小的是不要进行一次遍历,时间复杂度为O(N)还能不能优化,比如O(1)的时间复杂度就能获取到。这就是这篇博客需要说的PriorityQueue优先级队列。先看结构完全二叉树:一棵有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,节点得插入永远在下一个位置。下面得紫色的那排小字就是节点的序号。那么第N个元素的左孩子queue [2 * n + 1]右孩子就是queue [2 *(n + 1)]。看到源码就会发现PriorityQueue存储原创 2020-11-26 17:32:25 · 641 阅读 · 0 评论 -
Java List的remove()方法陷阱以及性能优化
Java List在进行remove()方法是通常容易踩坑,主要有一下几点循环时:问题在于,删除某个元素后,因为删除元素后,后面的元素都往前移动了一位,而你的索引+1,所以实际访问的元素相对于删除的元素中间间隔了一位。使用for循环不进行额外处理时(错误)//错误的方法for(int i=0;i<list.size();i++) { if(list.get(i)%2==0) {...原创 2019-05-25 17:55:02 · 34172 阅读 · 17 评论 -
别再问HashMap原理和扩容机制了 一篇彻底搞定HashMap源码
核心方法Node<K,V>[] resize()第一次初始化时候调用存放的键值对的数量大于第三种:HashMap不是第一次扩容。如果HashMap已经扩容过的话,那么每次table的容量以及threshold量为原有的两倍。原创 2020-11-10 14:24:11 · 600 阅读 · 1 评论 -
万字长文 图文阅读 JDK8 ConcurrentHashMap源码 带你吊打面试官
ConcurrentHashMap结构数组+链表+红黑树。链表大于8转红黑树,红黑树节点数小于6退回链表。跟HashMap是一样的。只是支持并发的操作存放的key-value的Node节点。结构几乎一样,但是有个很重要的地方,val,next都被volatile,保证在多个线程之间的可见性。static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key原创 2020-11-21 23:19:01 · 1576 阅读 · 7 评论 -
延迟队列 DelayQueue 使用与源码解析
当内存中有一堆的客户信息,需要实时移除VIP到期的客户的特权时有以下做法。做法1:定时一段时间检查一遍所有的元素,如果客户的VIP到期日期小于当前,则取消客户的VIP特权。做法2:利用优先队列小顶堆的结构,将最快要过期的客户信息放置在堆顶,一个消费线程去poll堆顶元素并且处理,这样就不用去遍历全部的元素了。当日期不到时便让线程等待多长时间,当时间到时唤醒线程处理。以上做法2有现成的队列可以使用,就是接下来要说的延迟队列。DelayQueue结构是不是跟优先队列很像。DelayQueue其原创 2020-11-30 19:30:37 · 384 阅读 · 0 评论