Java 集合
文章平均质量分 94
Java 集合
lcn29
lcn29.github.io
展开
-
【Java 集合】ThreadLocal
在多线程编程中,我们经常面临共享数据的问题,而这可能引发一系列并发性和线程安全性的挑战。Java 提供了许多机制来处理这些问题,比如控制并发的各种锁, 控制线程串行地修改资源, 避免线程安全, 或者通过关键字 volatile 修饰变量, 保证可见性等。而在解决并发共享的方式中, 还有一种方式, 那么就是线程隔离, 每个线程各自维护资源的副本, 从而避免了共享资源的竞争。原创 2023-12-25 21:46:12 · 1097 阅读 · 0 评论 -
【Java 集合】LinkedBlockingDeque
我们知道 LinkedBlockingDeque 的底层实现结构就是一个链表, 而链表绕不开的一个概念就是节点, 所以我们先来看一下 LinkedBlockingDeque 的节点定义。/*** 节点类, 用于存储数据*/// 存储的内容E item;// 上一个节点的指针// 下一个节点的指针item = x;上面的 Node 就是队列中的节点了, 声明的属性item: 存储的内容prev: 上一个节点的指针next: 下一个节点指针。原创 2023-12-21 21:55:13 · 1044 阅读 · 0 评论 -
【Java 集合】ConcurrentHashMap (JDK 1.8 版本)
Map 一种存储键值对 (key-value) 的数据结构, 可以通过 key 快速地定位到需要的 value, 在 Java 中是一个使用频率很高的一个数据结构。一般情况下, 我们都是可以直接使用它的实现类 HashMap 就能满足需求了。但是 HashMap 在多线程情况, 并不是一个线程安全的类。使用在 Java 体系中古老的 Hashtable 作为替代, 该类基本上所有的方法都采用 synchronized 进行线程安全的控制, 虽然保证了线程安全, 但是牺牲了很大的性能。原创 2023-12-20 15:11:46 · 2341 阅读 · 0 评论 -
【Java 集合】LinkedBlockingQueue
我们知道 LinkedBlockingQueue 的底层实现结构就是一个链表, 而链表绕不开的一个概念就是节点, 所以我们先来看一下 LinkedBlockingQueue 的节点定义。// 链表节点类, 数据的主要存储地方// 节点的数据E item;// 下一个节点item = x;通过节点 Node 的定义中就一个数据域和一个指向下一个节点的指针, 明确 LinkedBlockingQueue 就是一个单向链表。原创 2023-12-19 23:19:21 · 1051 阅读 · 0 评论 -
【Java 集合】ArrayBlockingQueue
它是 BlockingQueue 接口的一种实现,通过固定大小的数组来存储元素,同时借助 ReentrantLock 和 ReentrantLock 的 Condition 提供了阻塞操作,使得在队列已满或为空时,线程能够安全地等待。内部借助头尾 2 个指针的移动达到一种循环数组的效果, 避免了整个元素删除时, 数组需要将后面的元素迁移的操作。原创 2023-12-18 22:27:07 · 1007 阅读 · 0 评论 -
【Java 集合】BlockingQueue 简介
在 Java 中容器主要有 2 个大类 Collection 和 Map, 其中 Collection 主用用于数据的直接存储 (Map 则是一种键值对的存储方式, 除了要存储的数据外, 还需要有一个 key 和数据建立一个映射关系)。Collection 使用的最多的大概就是 List, Set 和 Queue。而在日常的开发中, 会根据不同数据的特性, 比如是否可重复, 是否需要有序等条件选择不同的集合, 同时还会考虑其他的因素, 比如线程是否安全。原创 2023-12-18 22:25:03 · 858 阅读 · 0 评论 -
【Java 并发】Thread 介绍
线程是操作系统调度的最小单元, 也叫轻量级进程。它被包含在进程之中, 是进程中的实际运作单位。同一进程可以创建多个线程, 每个线程都有自己独立的一块内存空间, 并且能够访问共享的内存变量。原创 2023-11-26 22:02:59 · 1071 阅读 · 0 评论 -
【Java 并发】并发相关的一些概念
独占锁: 锁同一时刻只能被一个线程持有。共享锁: 锁同时可以被多个线程持有。原创 2023-11-26 21:22:45 · 852 阅读 · 0 评论 -
【Java 集合】 PriorityQueue
一般情况下, 我们使用队列是为了能够建造队列的先进先出 (First-In-First-Out) 模式的, 达到一种资源的公平分配, 先到达的任务 (元素) 先处理, 但有时需要在队列中基于优先级处理对象。存入队列中的任务 (元素) 具有优先级, 需要根据优先级修复里面的数据。而在 JDK 1.5 引入的 PriorityQueue, 就具备了这种功能。原创 2023-11-26 21:05:57 · 947 阅读 · 2 评论 -
【Java 集合】LinkedList
** 当前节点的内容 */E item;/** 下一个节点 *//** 上一个节点 */// 当前节点的数据 = element// 当前节点的后置节点 = next// 当前节点的前置节点 = prevNode 节点中除了指向下一个节点的 next, 还包含指向上一个节点的 prev, 所以 LinkedList 是一个双向的链表。原创 2023-11-26 16:58:54 · 1214 阅读 · 0 评论 -
【Java 集合】ConcurrentLinkedQueue
ConcurrentLinkedQueue 是 Java 中的一个并发队列实现, 位于 java.util.concurrent 包下。它提供了一个基于链表实现的无界线程安全队列, 采用非阻塞算法实现并发操作。无界队列: ConcurrentLinkedQueue 不限制队列的大小, 可以动态地增长非阻塞算法: 内部实现采用了非阻塞算法, 避免了传统锁的性能开销, 提高了并发性能。原创 2023-12-15 22:05:29 · 1576 阅读 · 0 评论 -
【Java 集合】CopyOnWriteArrayList
Copy-On-Write 机制和读写锁都是通过读写分离的思想实现的, 但两者还是有些不同。Copy-On-Write 对写操作做了锁控制, 确保写操作的数据正常, 而对读取操作不做任何的限制, 确保了读取的性能, 但是带来了一定时间 “脏数据” 的问题读写锁: 对整个读写操作都加锁, 在有线程在读取数据, 写线程必须等待, 在写线程变更数据的过程, 读操作也必须等待写操作完成, 通过这种等待, 牺牲了一定的性能, 但是确保了数据的一致。原创 2023-11-26 19:50:17 · 942 阅读 · 0 评论 -
【Java 集合】LinkedHashMap
LinkedHashMap 是基于 HashMap 的实现的, 所以整体的结构是类似的, 唯一不同的是: 链表和红黑树的节点多维持了一个前驱节点指针和后驱节点指针。简单的理解就是 HashMap + 双向链表。因为继承了 HashMap, 直接复用父级 HashMap 的 table 属性, 存储的数据类型依旧是 Node// 继承 HashMap Node 节点的基础上, 追加了一个前驱指针和后驱指针。原创 2023-11-28 00:00:09 · 1275 阅读 · 0 评论 -
【Java 集合】HashSet
HashSet 是一个基于 HashMap 实现的无序列表。它不保证数据存储的顺序, 但是可以保证存储的数据是唯一不重复的, 同时支持存储 null。如果再了解 HashMap 后, HashSet 是几个 Collection 实现中最容易理解的集合, 因为 HashSet 的所有操作都是借助于 HashMap 实现的。原创 2023-11-28 22:59:19 · 457 阅读 · 0 评论 -
【Java 集合】ArrayList
ArrayList 一个动态数组。本身是基于数组进行封装的列表, 提供了自动扩容的功能: 在容量不够的情况下, 自动扩容。支持存储包括 null 在内的所有数据类型。1.1 数组 (Array)了解 ArrayList 之前, 我们需要先了解一下数组的特点数组的内存是连续的, 不存在相邻元素之间还隔着其他内存数组内存储的数据类型都是一样的数组具备了查询快, 增删慢的特点数组在声明的时候需要知道初始的容量, 一个容量一旦确定了, 就不能再改变了基于数组实现的 ArrayList, 同理原创 2022-02-14 10:12:02 · 438 阅读 · 1 评论 -
【Java 集合】 HashMap
JDK1.8 对 HashMap 进行了比较大的优化, 底层实现由之前的 “数组 + 链表” 改为 “数组 + 链表 + 红黑树”。在链表的长度大于等于 8 并且数组的长度大于等于 64 时, 将对应的链表转为红黑树 (本文不涉及红黑树部分的分析, 涉及到时, 只会提一下, 然后跳过)。从上面的代码就是 HashMap 中数据存储的地方: 数组。数组存储的数据类型为 Node, 这个 Node 是链表的定义。原创 2023-11-27 23:57:34 · 1182 阅读 · 0 评论