![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
集合
文章平均质量分 84
桐花思雨
这个作者很懒,什么都没留下…
展开
-
HashMap的几种遍历方式及循环删除
HashMap遍历从大的方向来说,可分为以下4类迭代器Iterator方式遍历For Each方式遍历Lambda表达式遍历遍历但每种类型下又有不同的实现方式,因此具体的遍历方式又可以分为以下6使用迭代器的方式进行遍历使用迭代器的方式进行遍历使用的方式进行遍历使用的方式进行遍历使用Lambda表达式的方式进行遍历使用的方式进行遍历接下来我们来看每种遍历方式的具体实现代码。原创 2022-09-28 20:48:45 · 5085 阅读 · 4 评论 -
为什么HashSet中使用PRESENT而不是null作为value
无意之中碰到了这个问题,在此记录一下 的部分源码如下原创 2022-06-12 23:45:24 · 495 阅读 · 0 评论 -
ArrayList的动态扩容机制
目录前言`ArrayList` 的动态扩容机制`ArrayList` 的主要属性`ArrayList` 的构造器`ArrayList` 的动态扩容小结初始容量动态扩容大小动态扩容大小测试前言对于 ArrayList 的动态扩容机制想必大家都听说过,之前的文章中也谈到过,不过由于时间久远,早已忘却。所以利用这篇文章做做笔记,加深理解记忆ArrayList 的动态扩容机制要了解其动态扩容机制就必须先看它的源码,源码是基于 jdk 1.8 的ArrayList 的主要属性// 如果不指定容量(空构造器原创 2022-02-26 13:15:28 · 1548 阅读 · 0 评论 -
HashMap为什么是线程不安全的
目录`HashMap` 的线程不安全`HashMap` 中的 `put()` 方法HashMap 的线程不安全HashMap 的线程不安全主要体现在下面两个方面在 jdk 1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况在 jdk 1.8 中,在并发执行 put 操作时会发生数据覆盖的情况对于 jdk 1.7 中 HashMap 的线程不安全,暂且不谈了,我们主要看看 jdk 1.8 中的HashMap 中的 put() 方法该 put() 方法是 jdk 1.8 中的pub原创 2022-01-19 22:21:30 · 493 阅读 · 0 评论 -
ConcurrentHashMap是如何实现线程安全的
目录前言`ConcurrentHashMap` 是如何实现线程安全的初始化数据结构时的线程安全前言我们知道,在日常开发中使用的 HashMap 是线程不安全的,而线程安全类 HashTable 和 SynchronizedMap 只是简单的在方法上加锁实现了线程安全,效率低下,所以在线程安全的环境下我们通常会使用 ConcurrentHashMap,那么 ConcurrentHashMap 又是如何实现线程安全的呢?ConcurrentHashMap 是如何实现线程安全的针对这个问题,可以从以下几原创 2022-01-17 13:58:58 · 7793 阅读 · 3 评论 -
关于Arrays.asList()方法的使用
Arrays.asList 创建的 ArrayList 的使用Arrays.asList() 方法生成的 ArrayList 类对象,在调用 add(),remove() 等方法时会报错public static void main(String[] args) { List<String> list = Arrays.asList("Java", "C++", "Python"); list.add("C#");}通过源码分析 Arrays.asList() 生成的 Array原创 2022-01-15 13:54:18 · 2801 阅读 · 0 评论 -
为什么阿里巴巴禁止在foreach里进行集合(List、Map)元素的remove/add操作
目录`list` 遍历删除元素的问题问题案列一原因分析问题案列二原因分析`modCount` 和 `expectedModCount``list` 遍历删除元素的正确方法倒序移除`foreach` 遍历删除时使用 `CopyOnWriteArrayList`迭代器遍历移除`jdk 1.8` 写法list 遍历删除元素的问题问题案列一public class ArrayTest { public static void main(String[] args) { List<原创 2021-09-04 18:01:55 · 1042 阅读 · 1 评论 -
synchronizedMap,synchronizedList与synchronizedSet
目录`synchronizedMap``synchronizedMap` 概述`synchronizedMap` 的获取示例`synchronizedMap` 源码解读类的基本属性构造函数synchronizedMapsynchronizedMap 概述SynchronizedMap 是集合工具类 Collections 的一个静态内部类SynchronizedMap 实现了 Map 接口,同时实现了接口 Serializable,支持序列化在多线程的情况下,能够保证线程的安全synchro原创 2021-05-01 14:50:57 · 580 阅读 · 0 评论 -
List集合之LinkedList
目录`LinkedList` 概述LinkedList 概述jdk 1.2 的时候添加的集合类,底层是使用双向链表实现的线性表,能够从链表头部或者尾部操作数据元素,可用作双端队列,也可以模拟栈空间的储存实现了 List 接口,因此也可以使用方法 get(index) 访问元素,但是效率较低,因为 get(index) 实际上都是从头或尾开始顺序遍历的实现了 Cloneable, Serializable 标志性接口,支持克隆和序列化是一个线程不安全的类...原创 2021-04-30 22:30:01 · 763 阅读 · 2 评论 -
List集合之ArrayList
目录`ArrayList` 概述ArrayList 概述ArrayList 继承自 AbstractList,实现了 List 接口,底层基于数组实现容量大小动态变化,在物理内存上采用顺序存储结构,即数组。因此可根据索引快速的查找元素,还具有基于索引操作元素的一套方法,允许 null 元素的存在同时还实现了 RandomAccess 标志性接口,这意味着这个集合支持 快速随机访问策略,那么使用传统 for 循环的方式遍历数据会优于用迭代器遍历数据,即使用 get()方法获取数据相比于迭代器遍历更加原创 2021-04-30 19:24:33 · 572 阅读 · 1 评论 -
常用的一些集合工具类
目录前言`jdk` 自带的 `Collections` 集合工具类常用方法前言Java 集合工具类分为两种,一种是 jdk 自带的,一种是第三方提供的(要去他们官网下 jar包,然后导入使用)jdk 自带的 Collections 集合工具类常用方法该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象实现同步控制等方法。这个类不需要创建对象,内部提供的都是静态方法将所有指定的元素添加到指定的集合addAll(Collection<? super T>原创 2021-04-18 00:44:03 · 1750 阅读 · 0 评论 -
Map集合之ConcurrentHashMap
ConcurrentHashMap 与 HashTable 与 HashMap 的比较HashMap在并发环境下,可能会形成环状链表(扩容时可能造成),导致 get 操作时,cpu 空转,所以,在并发环境中使用 HashMap 是非常危险的。并且它是线程不安全的HashTableHashTable 是线程安全的。HashTable 线程安全的策略实现代价却比较大,get/put 所有相关操作都是 synchronized 的,这相当于给整个哈希表加了一把大锁,多线程访问时候,只要有一个线程访问或操作原创 2021-01-21 15:16:37 · 689 阅读 · 0 评论 -
List集合之Vector
Vector 类相比很多同学在刚接触 Java 集合的时候,线程安全的 List 用的一定是 Vector。但是现在用到的线程安全的 List 一般都会用 CopyOnWriteArrayList,很少有人再去用 Vector 了,至于为什么,文章中会具体说到。接下来,我们先来简单分析一下 Vector 的源码Vector 源码Vector 和 ArrayList 的底层实现是一样的,都是由数组实现的Vector 变量public class Vector<E> extends Abs原创 2021-01-21 16:29:31 · 396 阅读 · 1 评论 -
List集合之CopyOnWriteArrayList
CopyOnWriteArrayList 类图CopyOnWriteArrayList 类的思想CopyOnWrite 简称 COW,根据名字来看就是写入时复制。意思就是大家共同去访问一个资源,如果有人想要去修改这个资源的时候,就需要复制一个副本,去修改这个副本,而对于其他人来说访问的资源还是原来的,不会发生变化CopyOnWriteArrayList 源码CopyOnWriteArrayList 的变量CopyOnWriteArrayList 底层是也是由数组实现的。本文我们只解读添加元素和读原创 2021-01-21 16:43:25 · 799 阅读 · 0 评论 -
Set集合之CopyOnWriteArraySet
CopyOnWriteArraySet 类图CopyOnWriteArraySet 简介CopyOnWriteArraySet 继承于 AbstractSet,这就意味着它是一个集合。并且是线程安全的CopyOnWriteArraySet 是通过 CopyOnWriteArrayList 实现的。而CopyOnWriteArrayList 本质是个动态数组,所以 CopyOnWriteArraySet 相当于通过通过动态数组实现的“集合”!CopyOnWriteArrayList 中允许有重复的原创 2021-01-21 16:56:09 · 275 阅读 · 1 评论 -
Map集合之HashTable
HashTable 底层数据结构HashTable 与 HashMap 一样,都是以键值对的形式存储数据。JDK1.8 中 HashMap 的底层结构是数组 + 链表 + 红黑树,而 HashTable 的底层结构是数组 + 链表HashTable 源码HashTable 变量public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io原创 2021-03-27 20:31:15 · 153 阅读 · 0 评论 -
Map集合之LinkedHashmap
LinkedHashmap源码剖析LinkedHashMap简介LinkedHashMap 是 HashMap 的子类,与 HashMap 有着同样的存储结构,但它加入了一个双向链表的头结点,将所有put 到 LinkedHashmap 的节点一一串成了一个双向循环链表,因此它保留了节点插入的顺序,可以使节点的输出顺序与输入顺序相同LinkedHashMap 可以用来实现 LRU 算法LinkedHashMap 同样是非线程安全的,只在单线程环境下使用LinkedHashMap源码publi原创 2021-01-19 00:35:51 · 2219 阅读 · 0 评论 -
Set集合之HashSet添加的数据是如何保证不重复的
HashSet类实现了 Set 接口, 其底层其实是使用了一个 HashMap 去实现的下面我们来看一下源码:HashSet 的几个构造方法// 默认构造函数 底层创建一个HashMappublic HashSet() { // 调用HashMap的默认构造函数,创建map map = new HashMap<E,Object>();} // 带集合的构造函数public HashSet(Collection<? extends E> c) { //原创 2020-09-09 23:39:24 · 667 阅读 · 0 评论 -
Map集合之HashMap
一:HashMap概述HashMap 是通过 put(key,value) 存储,get(key)来获取。当传入 key 时,HashMap 会根据 key 的 hashCode() 方法计算出 hash 值,根据 hash 值将 value 保存在 bucket(桶)里。当计算出的 hash 值相同时,称之为 hash 冲突。HashMap 的做法是用 链表和红黑树 存储相同 hash 值的 value二:Hash冲突,以及解决方法hash 冲突:两个元素通过 hashCode() 计算出的值是一样原创 2020-09-09 00:30:18 · 1336 阅读 · 0 评论