随笔分类 -  Java集合

摘要:TreeMap TreeMap是红黑树的java实现。相比HashMap来说,TreeMap多实现了一个接口NavigableMap,也就是这个接口,决定了TreeMap与HashMap的不同:HashMap的key是无序的,TreeMap的key是有序的。 源码展示: public class T 阅读全文
posted @ 2021-02-01 10:39 鄙人取个名字好难 编辑
摘要:HashMap基于哈希表的Map接口实现,是以key-value存储形式存在(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同)。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不 阅读全文
posted @ 2021-01-29 23:47 鄙人取个名字好难 编辑
摘要:Hash的定义 散列(哈希)函数:把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值,是一种压缩映射。hashCode是Object的一个方法,返回的是对象的存储地址。 public int hashCode() { int lockWord = shadow$_monitor_; 阅读全文
posted @ 2021-01-28 20:29 鄙人取个名字好难 编辑
摘要:数组与链表在处理数据时各有优缺点,数组查询速度很快而插入很慢,链表在插入时表现优秀但查询无力。哈希表则整合了数组与链表的优点,能在插入和查找等方面都有不错的速度。 Map Map也是基于key-value的数据格式,并且key值不可以重复,每个key对应的value唯一。Map的key也可以为nul 阅读全文
posted @ 2021-01-27 14:40 鄙人取个名字好难 编辑
摘要:数据结构 LinkedBlockingQueue是一个底层为单向链表的,有界的,FIFO阻塞队列;访问和移除操作是在队头,添加操作在队尾进行,并且使用不同的锁进行保护。 LinkedBlockingQueue中维持两把锁,一把锁用于入队,一把锁用于出队,这也就意味着,同一时刻,只能有一个线程执行入队 阅读全文
posted @ 2021-01-27 12:52 鄙人取个名字好难 编辑
摘要:ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,遵循队列的FIFO原则,队尾入队,队首出队。其非阻塞的方式使用自旋CAS(Compare and swap,即比较并交换)的方式来实现。 ConcurrentLinkedQueue 由 head 节点和 tail 节点组 阅读全文
posted @ 2021-01-26 23:48 鄙人取个名字好难 编辑
摘要:ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。线程安全是指,ArrayBlockingQueue内部通过“互斥锁”保护竞争资源,实现了多线程对竞争资源的互斥访问;有界,则是指ArrayBlockingQueue对应的数组是有界限的。 阻塞队列,是指多线程访问竞争资源时,当 阅读全文
posted @ 2021-01-26 18:10 鄙人取个名字好难 编辑
摘要:Queue源码解析 Queue是Java集合框架中的一员,继承于Collection接口。与List、Set相同的是,Queue也实现了一种数据结构,这就是队列。队列是计算机中的一种数据结构,保存在其中的数据具有“先进先出(FIFO,First In First Out)”的特性。 public i 阅读全文
posted @ 2021-01-25 11:26 鄙人取个名字好难 编辑
摘要:HashSet源码分析 底层是HashMap public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable { static final long serialVer 阅读全文
posted @ 2021-01-25 09:51 鄙人取个名字好难 编辑
摘要:LinkedList继承于AbstractSequentialList的双向链表,实现List接口,因此也可以对其进行队列操作,它也实现了Deque接口,所以LinkedList也可当做双端队列使用,还有LinkedList是非同步的。由于LinkedList的底层是双向链表,因此其顺序访问的效率非 阅读全文
posted @ 2021-01-23 17:06 鄙人取个名字好难 编辑
摘要:基于数组实现,是一个动态数组,其容量能自动增长。 ArrayList不是线程安全的,建议在单线程中使用,多线程可以选择Vector或CopyOnWriteArrayList。 实现了RandomAccess接口,可以通过下标序号进行快速访问。 实现了Cloneable接口,能被克隆。 实现了Seri 阅读全文
posted @ 2021-01-22 22:56 鄙人取个名字好难 编辑
摘要:List是Collection三大直接子接口之一,其中的数据可以通过位置检索,用户可以在指定位置插入数据。List的数据可以为空,可以重复。 List Collection主要提供一些通用的方法,而List则针对线性表的结构,提供了对位置以及子表的操作。特有方法如下: public interfac 阅读全文
posted @ 2021-01-22 16:36 鄙人取个名字好难 编辑
摘要:Collection Collection是List、Queue和Set的超集,它直接继承于Iterable,也就是所有的Collection集合类都支持for-each循环。 public interface Collection<E> extends Iterable<E> { //返回集合的长 阅读全文
posted @ 2021-01-22 15:11 鄙人取个名字好难 编辑
摘要:当想要遍历集合时,Java为我们提供了多种选择,通常有以下三种写法: for循环 for循环,就是根据下标来获取元素,这个特性与数组十分吻合。 for (int i = 0, len = strings.size(); i < len; i++) { System.out.println(strin 阅读全文
posted @ 2020-11-25 17:29 鄙人取个名字好难 编辑
摘要:基本概念 树(Tree)是n(n≥0) 个结点的有限集。n=0 时称为空树。在任意一棵非空树中: 1. 有且仅有一个特定的称为根(Root)的结点; 2. 当n>1 时,其余结点可分为m (m>0) 个互不相交的有限集T1 、T2、……、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubT 阅读全文
posted @ 2020-11-24 15:49 鄙人取个名字好难 编辑
摘要:无论是数组还是链表,其对数据的查询表现都比较无力,要想知道一个元素是否在数组或链表中,只能从前向后挨个对比。出现这个问题的根源在于,没有办法直接根据一个元素找到它存储的位置,而哈希表就是解决查询问题的一种方案。 哈希表与Hash函数 哈希表就是通过关键字来获取数据的一种数据结构,它通过把关键字映射为 阅读全文
posted @ 2020-11-24 15:03 鄙人取个名字好难 编辑
摘要:数组 数组在内存中是一段连续的存储单元,每个数据依次放在每个单元中。 创建一个数组,必须声明其长度,以在内存中寻找合适的一段连续存储单元。这也意味着数组的大小是固定的,我们无法动态调整其大小。 想要获取数组中第i个元素,其时间复杂度是 O(1),因为可以根据其地址直接找到它。同理修改也是。 数组对查 阅读全文
posted @ 2020-11-23 15:06 鄙人取个名字好难 编辑
摘要:数组 数组在内存中占据一段连续的内存,所有的数据在内存中连续排列。它的大小是固定的,这一特性使得数组对于插入操作并不友好,分析ArrayList时就会看到这种操作的复杂。但数组对于位置的访问是极其友好的,它支持所谓RandomAccess特性,这使得基于位置的操作可以迅速完成,其时间复杂度为O(1) 阅读全文
posted @ 2020-11-23 14:10 鄙人取个名字好难 编辑

点击右上角即可分享
微信分享提示