![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
集合
CodersCoder
有人见星辰,有人见尘埃。
展开
-
整理一些List的常用使用场景
背景由于工作中使用集合场景较多,而且对list的操作也越来越多,有的可以直接操作,有的需要进一步转换才可以,有一些操作可以得心应手,有一些却需要思考一下才可以,为此整理一些list常用操作,方便以后查找使用~去重1、使用java8中steam的distinct()方法进行List去重public class Test { public static void main(String[] args) { ArrayList<Integer> list1 = new原创 2020-11-15 18:29:12 · 737 阅读 · 0 评论 -
Java集合类学习--ConcurrentHashMap(四)
常用方法4、获取元素获取元素,根据目标key所在桶的第一个元素的不同采用不同的方式获取元素,关键点在于find()方法的重写。public V get(Object key) { Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek; // 计算hash int h = spread(key.hashCode()); // 如果元素所在的桶存在且里面有元素 if ((tab = table) !原创 2020-10-20 18:38:03 · 130 阅读 · 0 评论 -
Java集合类学习--ConcurrentHashMap(三)
常用方法3、扩容和协助扩容每次添加元素后,元素数量加1,并判断是否达到扩容门槛,达到了则进行扩容或协助扩容。参考:http://cmsblogs.com/?p=4777private final void addCount(long x, int check) { CounterCell[] as; long b, s; // 这里使用的思想跟LongAdder类是一模一样的(后面会讲) // 把数组的大小存储根据不同的线程存储到不同的段上(也是分段锁的思想) //原创 2020-10-19 18:41:21 · 94 阅读 · 0 评论 -
Java集合类学习--ConcurrentHashMap(二)
常用方法1、初始化方法 /** * 初始化数组table, * 如果sizeCtl小于0,说明别的数组正在进行初始化,则让出执行权 * 如果sizeCtl大于0的话,则初始化一个大小为sizeCtl的数组 * 否则的话初始化一个默认大小(16)的数组 * 然后设置sizeCtl的值为数组长度的3/4 */ private final Node<K,V>[] initTable() { Node<K,V&原创 2020-10-18 19:27:21 · 87 阅读 · 0 评论 -
Java集合类学习--ConcurrentHashMap(一)
概述ConcurrentHashMap是HashMap的线程安全版本,内部也是使用(数组 + 链表 + 红黑树)的结构来存储元素。相比于同样线程安全的HashTable来说,效率等各方面都有极大地提高。所以使用场景也较HashTable多。源码分析1、构造方法public ConcurrentHashMap() {}public ConcurrentHashMap(int initialCapacity) { if (initialCapacity < 0) t原创 2020-10-17 21:32:26 · 109 阅读 · 1 评论 -
Java集合类学习--TreeMap(二)
TreeMap的常用方法比较多,也比较难是用也比较少,如有学习必要,请参考死磕 java集合系列进行细致学习。原创 2020-10-16 18:24:28 · 197 阅读 · 0 评论 -
Java集合类学习--LinkedHashMap
概述LinkedHashMap 继承了 HashMap。LinkedHashMap内部维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问顺序访问,可以用来实现LRU缓存策略。LinkedHashMap可以看成是 LinkedList + HashMap。LinkedHashMap 的类继承结构图:我们知道 HashMap 是无序的,即迭代器的顺序与插入顺序没什么关系。而 LinkedHashMap 在 HashMap 的基础上增加了顺序:分别为「插入顺序」和「访问顺序」。即遍历 Linke原创 2020-10-15 19:41:32 · 107 阅读 · 0 评论 -
Java集合类学习--TreeMap(一)
概述TreeMap使用红黑树存储元素,可以保证元素按key值的大小进行遍历。TreeMap 类的继承结构如下:可以看出:public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.SerializableTreeMap实现了Map、SortedMap、NavigableMap、Cloneable、Ser原创 2020-10-14 18:45:36 · 303 阅读 · 0 评论 -
Java集合类学习--HashMap(四)
思考HashMap是线程安全的吗?如果多个线程操作同一个HashMap对象会产生哪些非正常现象?链表和红黑树的转换阈值为什么是 8 和 6 ?为什么负载因子是 0.75?为什么容量是 2 的次幂?一般用什么类型的元素作为 Key?为什么?衡量 hash 算法的好坏?String 类的 hashCode 实现?...原创 2020-10-13 18:29:23 · 181 阅读 · 0 评论 -
Java集合类学习--HashMap(三)
常用&核心方法3 、TreeNode.putTreeVal(…)方法插入元素到红黑树中的方法。final TreeNode<K, V> putTreeVal(HashMap<K, V> map, Node<K, V>[] tab, int h, K k, V v) { Class<?> kc = null; // 标记是否找到这个key的节点 boolean原创 2020-10-12 18:44:46 · 106 阅读 · 0 评论 -
Java集合类学习--HashMap(二)
常用&核心方法1 、put 方法public V put(K key, V value) { // 调用hash(key)计算出key的hash值 return putVal(hash(key), key, value, false, true);}static final int hash(Object key) { int h; // 如果key为null,则hash值为0,否则调用key的hashCode()方法 // 并让高16位与整个has原创 2020-10-11 20:56:51 · 94 阅读 · 0 评论 -
Java集合类学习--HashMap(一)
概述HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改的速度都很快,能达到O(1)的平均时间复杂度。它是非线程安全的,且不保证元素存储的顺序。HashMap 是 Java 开发中最常用的容器类之一,也是面试的常客。JDK1.7之前是数组 + 链表 。在 JDK 1.8 做了优化,当链表长度达到一定数量时会把链表转为红黑树。因此,JDK 1.8 中的 HashMap 实现可以理解为「数组 + 链表 + 红黑树」。内部结构示意图:HashMap 的继承结构和类签名原创 2020-10-10 19:01:22 · 166 阅读 · 0 评论 -
Java集合类学习--PriorityQueue
概述PriorityQueue 意为优先队列,表示队列中的元素是有优先级的,也就是说元素之间是可比较的。因此,插入队列的元素要实现 Comparable 接口或者 Comparator 接口。PriorityQueue 的继承结构如下:通过上图可看出,PriorityQueue 没有实现 BlockingQueue 接口,并非阻塞队列。它在逻辑上使用「堆」(即完全二叉树)结构实现,物理上基于「动态数组」存储。源码分析构造器1、简单构造器// 构造器 1:无参构造器(默认初试容量为 11)p原创 2020-10-09 18:30:00 · 202 阅读 · 0 评论 -
Java集合类学习--Map
概述Map 是一个接口,它表示一种“键-值(key-value)”映射的对象(Entry),其中键是不重复的(值可以重复),且最多映射到一个值(可以理解为“映射”或者“字典”)。Map 常用的实现类有 HashMap、TreeMap、ConcurrentHashMap、LinkedHashMap 等,它们的继承结构如下:接口下的方法有:源码分析常用方法// 将键-值对存入 Map,若 key 对应的 value 已存在,则将其替换// 返回原先 key 对应的 value(若不存在,返回原创 2020-09-30 21:12:51 · 155 阅读 · 0 评论 -
Java集合类学习--ArrayBlockingQueue
概述ArrayBlockingQueue是下一个以数组实现的阻塞队列,它是线程安全的。是BlockingQueue接口的一个主要实现类,本文分析该类的常用方法实现。ArrayBlockingQueue 的类继承结构如下:源码分析构造器// 构造器 1:初始化 ArrayBlockingQueue 对象,使用给定的容量public ArrayBlockingQueue(int capacity) { // 调用构造器 2 进行初始化,默认使用非公平锁 this(capacity,原创 2020-09-29 18:59:32 · 170 阅读 · 0 评论 -
Java集合类学习--BlockingQueue
概述BlockingQueue 意为“阻塞队列”,它在 JDK 中是一个接口。所谓阻塞,简单来说就是当某些条件不满足时,让线程处于等待状态。例如经典的“生产者-消费者”模型,当存放产品的容器满的时候,生产者处于等待状态;而当容器为空的时候,消费者处于等待状态。阻塞队列的概念与该场景类似。BlockingQueue 继承自 Queue 接口,它的常用实现类有 ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue 等。源码分析方法定义:用法分析:/原创 2020-09-28 20:02:02 · 119 阅读 · 0 评论 -
Java集合类学习--LinkedList
概述LinkedList 内部是一个双向链表,并且实现了 List 接口和 Deque 接口,因此它也具有 List 的操作以及双端队列和栈的性质。双向链表的结构如下:LinkedList 的继承结构如下:源码分析重要部分1、结点类 Node(内部类)private static class Node<E> { E item; // 存储的数据 Node<E> next; // 后继结点 Node<E> prev; // 前驱结点原创 2020-09-27 20:32:17 · 125 阅读 · 0 评论 -
Java集合类学习--ArrayList
概述ArrayList 是 List 接口的一个实现类,也是 Java 中最常用的容器实现类之一,可以把它理解为「可变数组」。我们知道,Java 中的数组初始化时需要指定长度,而且指定后不能改变。ArrayList 内部也是一个数组,它对数组的功能做了增强:主要是在容器内元素增加时可以动态扩容,这也是 ArrayList 的核心所在。ArrayList 的主要方法与 List 基本一致,因此这里重点分析其内部结构和扩容的原理。源码分析构造器 //指定初始化容量的构造器 public Ar原创 2020-09-26 22:21:28 · 126 阅读 · 0 评论 -
Java集合类学习--Queue, Deque
概述Queue 和 Deque 都是接口。其中 Queue 接口定义的是一个队列,它包含队列的基本操作:入队(enqueue)和出队(dequeue)。Deque 接口继承自 Queue 接口,表示双端队列(Double-ended queue),同时具备「队列」和「栈」的性质。二者的继承关系如下:QueueQueue是一个接口,有如下方法:代码不多,一共200多行,根据操作可以分为三类:入队、出队和遍历。入队:add() 和 offer()二者区别在于:当队列空间已满无法入队时,add原创 2020-09-25 20:36:11 · 1099 阅读 · 0 评论 -
Java集合类学习--Vector
概述Vector 的内部实现与 ArrayList 类似,也可以理解为一个「可变数组」。由于 Vector 目前使用较少,且官方也推荐在无线程安全的需求时使用 ArrayList 代替 Vector,这里仅研究其实现原理。其继承结构如下(省略部分接口):源码分析构造器Vector 对外提供四个构造器:protected Object[] elementData;protected int capacityIncrement;// 无参构造器public Vector() { t原创 2020-09-24 18:16:34 · 95 阅读 · 0 评论 -
Java集合类学习--Set
SetJDK对Set的实现进行了取巧。我们都知道Set不允许出现相同的对象,而Map也同样不允许有两个相同的Key(出现相同的时候,就执行更新操作)。所以Set里的实现实际上是调用了对应的Map,将Set的存放的对象作为Map的Key。Set接口的方法如下:由此可以看出,Set基本上就保持了Collection的原方法,所以,就从Set的实现开始学习。Set的实现主要有HashSet,TreeSet,后续进行细致学习分析。...原创 2020-09-23 17:18:22 · 143 阅读 · 0 评论 -
Java集合类学习--List
ListList 是最常用的容器之一。List继承自Collection ,分析源码时,优先分析接口的源码,因此这里先从 List 接口分析。List 方法列表如下:由于继承自Collection ,所以继承方法就不再学习,找出List中新特有的方法即可。void add(int index, E element)将指定的元素插入此列表中的指定位置(可选操作)。boolean addAll(int index, Collection<? extends E> c)将指定集合中的所原创 2020-09-22 17:56:22 · 154 阅读 · 0 评论 -
Java集合类学习--Collection
CollectionJava 集合框架(Java Collections Framework, JCF)包含很多平时开发中的常用类,例如 List、Set、ArrayList、HashMap、HashSet 等,因此打算先从这里下手。而 Collection 接口又是集合层次中的根接口,最常用的 List 和 Set 接口都继承自它。它们的继承结构如下(常用部分):Collection 接口有很多方法,如下:简单分析:size(): 集合中包含的元素个数;isEmpty(): 集合是否为空原创 2020-09-21 17:10:37 · 131 阅读 · 0 评论