
Java集合
文章平均质量分 88
Java集合
Reset‘
这个作者很懒,什么都没留下…
展开
-
Java集合(七)图解LinkedHashMap原理(源码)
LinkedHashMap继承了HashMap,所以它们有很多相似的地方。原创 2024-07-18 13:13:34 · 1304 阅读 · 0 评论 -
Java集合(六)Java中Comparable和Comparator区别
Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。此外,实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器。T表示可以与此对象进行比较的那些对象的类型。此接口只有一个方法compare,比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。原创 2024-07-18 13:11:13 · 772 阅读 · 0 评论 -
Java集合(五)ArrayList的扩容机制详解(源码)
了解ArrayList的扩容机制是编写高性能Java代码的重要一环。通过深入了解其内部实现,我们能够更好地利用这一数据结构,避免不必要的扩容操作,提高程序的效率。原创 2024-07-18 13:08:46 · 377 阅读 · 0 评论 -
Java集合(四)Java中Iterator(迭代器)实现原理
从源代码里可以看到增删操作都会使modCount++,通过和expectedModCount的对比,迭代器可以快速的知道迭代过程中是否存在list.add()类似的操作,存在的话快速失败!迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。也就是说,modCount记录修改此列表的次数:包括改变列表的结构,改变列表的大小,打乱列表的顺序等使正在进行迭代产生错误的结果。在网上查到说这是集合迭代中的一种“快速失败”机制,这种机制提供迭代过程中集合的安全性。原创 2024-07-18 13:04:23 · 1183 阅读 · 0 评论 -
Java集合(三)Fail-Fast和Fail-Safe及使用场景
外部同步外部同步机制是指通过在代码层面对共享资源(如集合对象、数据结构等)进行显式的同步控制,以确保在多线程环境中的线程安全性。这种同步通常是由程序员手动实现的,并且可以采用 Java 中的各种同步机制来实现,比如使用 synchronized 关键字、使用 Lock 接口及其实现类、使用并发集合类等。相比之下,Java 并发包提供的并发集合类通常隐藏了同步细节,简化了多线程编程,但可能在性能上有一定的开销。但在多线程环境中,不适宜直接使用这些集合进行共享数据的操作,除非采用了外部的同步机制。原创 2024-07-18 13:02:35 · 981 阅读 · 0 评论 -
Java集合(二)JDK1.8 HashMap和ConcurrentHashMap(源码)
原数组长度为 n,所以我们有 n 个迁移任务,让每个线程每次负责一个小任务是最简单的,每做完一个任务再检测是否有其他没做完的任务,帮助迁移就可以了,而 Doug Lea 使用了一个 stride,简单理解就是步长,每个线程每次负责迁移其中的一部分,如每次迁移 16 个小任务。根据 Java7 HashMap 的介绍,我们知道,查找的时候,根据 hash 值我们能够快速定位到数组的具体下标,但是之后的话,需要顺着链表一个个比较下去才能找到我们需要的,时间复杂度取决于链表的长度,为 O(n)。原创 2024-07-17 21:11:50 · 867 阅读 · 0 评论 -
Java集合(二)JDK1.7 HashMap和ConcurrentHashMap(源码)
这个值可以在初始化的时候设置为其他值,但是一旦初始化以后,它是不可以扩容的。简单理解就是,ConcurrentHashMap 是一个 Segment 数组,Segment 通过继承 ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一个 segment,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全。前面我们看到,在插入新值的时候,如果当前的 size 已经达到了阈值,并且要插入的数组位置上已经有元素,那么就会触发扩容,扩容后,数组大小为原来的 2 倍。原创 2024-07-17 21:08:15 · 846 阅读 · 0 评论 -
Java集合(一)HashMap实现原理及散列思想
在 HashMap 中,用于存储所有的{Key,Value}对的真实数组 table ,有一个初始化的容量,但随着插入的元素越来越多,数组的resize机制会被触发,而扩容时,容量永远是2的幂次,这也是为了保证取模运算的高效。比如,26进制的散列函数就有一个巨大的缺陷,就是它所需要的数组空间太大了,在刚刚的示例代码中,仅表示长度为3位的、只有a-z构成的字符串,就需要开一个接近20000(26。,目标是找到一个合适的槽位,找到当前链表中的key和待插入的key相同的节点,或者直到遍历到链表的尾部;原创 2024-07-17 17:48:18 · 1245 阅读 · 0 评论