Stack 是 Vector 的一个子类,本质上也是由动态数组实现的,只不过还实现了先进后出的功能(在 get、set、add 方法的基础上追加了 pop、peek 等方法),所以叫栈。...“是的,总体上来说,Set 集合不是关注的重点,因为底层都是由 Map 实现的,为什么要用 Map 实现呢?三妹你能猜到原因吗?” “让我想想。” “嗯?...head 指向队首的第一个有效的元素,tail 指向队尾第一个可以插入元素的空位,因为是循环数组,所以 head 不一定从是从 0 开始,tail 也不一定总是比 head 大。...3)PriorityQueue PriorityQueue 是一种优先级队列,它的出队顺序与元素的优先级有关,执行 remove 或者 poll 方法,返回的总是优先级最高的元素。...3)TreeMap HashMap 是无序的,所以遍历的时候元素的顺序也是不可测的。TreeMap 是有序的,它在内部会对键进行排序,所以遍历的时候就可以得到预期的顺序。
为什么要使用集合?...我在上面也说了,LinkedList 仅仅在头尾插入或者删除元素的时候时间复杂度近似 O(1),其他情况增删元素的时间复杂度都是 O(n) 。...为什么呢?我觉得还是和底层数据结构有关!ArrayList 底层是数组,而 LinkedList 底层是链表。数组天然支持随机访问,时间复杂度为 O(1),所以称为快速随机访问。...Deque 扩展了 Queue 的接口, 增加了在队首和队尾进行插入和删除的方法,同样根据失败后处理方式的不同分为两类: Deque 接口 抛出异常 返回特殊值 插入队首 addFirst(E e) offerFirst...说一说 PriorityQueue PriorityQueue 是在 JDK1.5 中被引入的, 其与 Queue 的区别在于元素出队顺序是与优先级相关的,即总是优先级最高的元素先出队。
没有按元素值排序的SortedList,在线程安全类中也没有无锁算法的ConcurrentLinkedList,凑合着用Set与Queue中的等价类时,会缺少一些List特有的方法。...(这是为什么呢?)...PriorityQueue 用二叉堆实现的优先级队列,详见入门教程,不再是FIFO而是按元素实现的Comparable接口或传入Comparator的比较结果来出队,数值越小,优先级越高,越先出队。...当入队时队列已满,或出队时队列已空,不同函数的效果见下表: 可能报异常 返回布尔值 可能阻塞等待 可设定等待时间 入队 add(e) offer(e) put(e) offer(e, timeout,...unit) 出队 remove() poll() take() poll(timeout, unit) 查看 element() peek() 无 无 ArrayBlockingQueue 定长的并发优化的
我们在常见的线性结构中,已经知道什么是普通队列了,普通队列就是一种“先进先出,后进后出”的数据结构,即普通队列的出队顺序和入队顺序是一样的,但我们的优先队列,它的出队顺序和入队顺序无关,它的出队顺序是和优先级相关的...为什么使用优先队列? 举一个生活中的例子,就是医院里需要做手术的病人,医院不会根据哪个病人先来就先送去手术室,而是会根据病人生命危险的程度来决定应该谁先进入手术室。...我们可以实现优先队列可以通过普通的线性结构来实现,既不管你是通过数组实现还是链表实现,你会发现在入队时的时间复杂度为O(1),但是在出队时的时间复杂度却为O(n),因为使用顺序结构实现的优先队列在进行出队操作时...,我们需要先遍历这个这个优先队列,找到优先级最高的元素时再进行出队;当然我们也可以使用顺序线性结构实现优先队列,这样我们就可以在出队时让时间复杂度为O(1),但是在入队时,我们的时间复杂度就为O(n)了...有没什么办法让我们实现的优先队列的出队和入队操作效率都很高呢?这就是本文要讲的另外一种数据结构了,我们可以通过堆来实现优先队列,堆也是一种树结构。
具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 喜欢的话麻烦点一下星哈谢谢。...public class Queue接口 { //queue接口是对队列的一个实现,需要提供队列的进队出队等方法。...凑合着用Set与Queue中的等价类时,会缺少一些List特有的方法如get(i)。...4.1.3 PriorityQueue 用平衡二叉最小堆实现的优先级队列,不再是FIFO,而是按元素实现的Comparable接口或传入Comparator的比较结果来出队,数值越小,优先级越高,越先出队...出队时,弹出queue[0],然后把queque[size]拿出来二叉地往下比较调整堆。 初始大小为11,空间不够时自动50%扩容。
,以key的哈希值计算Entry在数组中的index,用拉链法解决哈希冲突。...二者的区别在于,Queue只能在队尾入队,队头出队,而Deque接口则在队头和队尾都可以执行出/入队操作 Queue接口常用方法: add(E)/offer(E):入队,即向队尾追加元素,二者的区别在于如果队列是有界的...,add方法在队列已满的情况下会抛出IllegalStateException,而offer方法只会返回false remove()/poll():出队,即从队头移除1个元素,二者的区别在于如果队列是空的...能够保证入队和出队操作的原子性和一致性,但在遍历和size()操作时只能保证数据的弱一致性。...所以本身是线程安全的,但同样的,只能保证入队和出队操作的原子性和一致性,在遍历时只能保证数据的弱一致性。
put方法流程? 红黑树的特点? 为什么使用红黑树而不使用AVL树? 在解决 hash 冲突的时候,为什么选择先用链表,再转红黑树? HashMap 的长度为什么是 2 的幂次方?...为什么是 0.75? 一般用什么作为HashMap的key? HashMap为什么线程不安全? HashMap和HashTable的区别? LinkedHashMap底层原理?...红黑树是对AVL树的优化,只要求部分平衡,用非严格的平衡来换取增删节点时候旋转次数的降低,提高了插入和删除的性能。 在解决 hash 冲突的时候,为什么选择先用链表,再转红黑树?...CopyOnWriteArrayList中add方法添加的时候是需要加锁的,保证同步,避免了多线程写的时候复制出多个副本。...使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。
public class Queue接口 { //queue接口是对队列的一个实现,需要提供队列的进队出队等方法。...凑合着用Set与Queue中的等价类时,会缺少一些List特有的方法如get(i)。...PriorityQueue 用平衡二叉最小堆实现的优先级队列,不再是FIFO,而是按元素实现的Comparable接口或传入Comparator的比较结果来出队,数值越小,优先级越高,越先出队。...出队时,弹出queue[0],然后把queque[size]拿出来二叉地往下比较调整堆。 初始大小为11,空间不够时自动50%扩容。...当入队时队列已满,或出队时队列已空,不同函数的效果见下表 ArrayBlockingQueue 定长的并发优化的BlockingQueue,也是基于循环数组实现。
public class Queue接口 { //queue接口是对队列的一个实现,需要提供队列的进队出队等方法。...凑合着用Set与Queue中的等价类时,会缺少一些List特有的方法如get(i)。...PriorityQueue 用平衡二叉最小堆实现的优先级队列,不再是FIFO,而是按元素实现的Comparable接口或传入Comparator的比较结果来出队,数值越小,优先级越高,越先出队。...出队时,弹出queue0,然后把quequesize拿出来二叉地往下比较调整堆。 初始大小为11,空间不够时自动50%扩容。...当入队时队列已满,或出队时队列已空,不同函数的效果见下表 ArrayBlockingQueue 定长的并发优化的BlockingQueue,也是基于循环数组实现。
凑合着用Set与Queue中的等价类时,会缺少一些List特有的方法如get(i)。...精讲架构视频资料获取方式 转发 转发 转发 关注我私信回复“架构”即可领取 3.Set 所有Set几乎都是内部用一个Map来实现, 因为Map里的KeySet就是一个Set,而value是假值,全部使用同一个...4.1.3 PriorityQueue 用平衡二叉最小堆实现的优先级队列,不再是FIFO,而是按元素实现的Comparable接口或传入Comparator的比较结果来出队,数值越小,优先级越高,越先出队...出队时,弹出queue[0],然后把queque[size]拿出来二叉地往下比较调整堆。 初始大小为11,空间不够时自动50%扩容。...当入队时队列已满,或出队时队列已空,不同函数的效果见下表: 4.3.1 ArrayBlockingQueue 定长的并发优化的BlockingQueue,也是基于循环数组实现。
扩容过程第二部一个非常重要的方法是transfer方法,采用头插法,把旧数组的元素插入到新数组中。 HashMap大小为什么是2的幂次方?...super E> comparator; 方法: peek()//返回队首元素 poll()//返回队首元素,队首元素出队列 add()//添加元素 size()//返回队列元素个数 isEmpty()...聊到ConcurrenHashMap,需要跟面试官聊到安全性,分段锁segment,为什么放弃了分段锁,与及选择CAS,其实就是都是从效率和安全性触发,嘻嘻~ java8不是用红黑树来管理hashmap...我觉得,回答以上几种ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue等,说出它们的特点,并结合使用到对应队列的常用线程池(如newFixedThreadPool...Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()?
public class Queue接口 { //queue接口是对队列的一个实现,需要提供队列的进队出队等方法。...凑合着用Set与Queue中的等价类时,会缺少一些List特有的方法如get(i)。...4.1.3 PriorityQueue 用平衡二叉最小堆实现的优先级队列,不再是FIFO,而是按元素实现的Comparable接口或传入Comparator的比较结果来出队,数值越小,优先级越高,越先出队...出队时,弹出queue[0],然后把queque[size]拿出来二叉地往下比较调整堆。 初始大小为11,空间不够时自动50%扩容。...) 出队 remove() poll() take() poll(timeout, unit) 查看 element() peek() 无 无 4.3.1 ArrayBlockingQueue 定长的并发优化的
Map接口及其实现类: 用于存储键值对,包括HashMap、TreeMap、LinkedHashMap等。List:有序可重复的集合List是一种有序的集合,允许存储重复的元素。...它的常见实现类包括HashMap、TreeMap、LinkedHashMap等。...taskQueue.offer("Task1"); taskQueue.offer("Task2"); taskQueue.offer("Task3"); // 出队...通过offer()方法添加元素,通过poll()方法出队,通过peek()方法查看队首元素。...通过深入学习和熟练使用集合框架,开发者可以更好地应对各种数据处理场景,写出更加优雅和高效的Java代码。我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!
但是如果按照指定方式出队,结果可以是有序的。...上图第二棵树为什么不满足完全二叉树,因为完全二叉树中每个节点必须是先有左孩子节点然后才能有右孩子节点。...(至于为什么要在向上调整结构之后返回moved,主要是用于迭代器使用,此处暂时不会介绍)。...四、有序出队 我们说过,PriorityQueue这种结构使用的是堆结构,所以他是一种不完全有序的结构,但是我们也提过,可以逐个出队来实现有序输出。...,该方法用于出队头节点并维持堆结构。
大家好,我是冰河~~ 在之前的《并发编程踩坑实录一:盘点JDK中同步容器的两大坑!!》...一文中,我们主要一起学习了JDK中同步容器的两个坑,一个是在使用同步容器时可能会出现 竞态条件 的问题,一个是在使用同步容器时用 迭代器遍历容器 可能会踩坑。...因为同步容器中的所有方法都是使用synchronized锁进行互斥,串行度太高了,无法真正的做到并行。 所以,在JDK1.5之后,JDK中提供了并发性能更好的容器。...非阻塞队列:队列的入队和出队操作不会阻塞。 单端队列:队列的入队操作只能在队尾进行,队列的出队操作只能在队首进行。 双端队列:队列的入队操作和出队操作都可以在队首和队尾进行。...也可以在内部不存在队列,例如SynchronousQueue,SynchronousQueue实现了生产者的入队操作必须等待消费者的出队操作完成之后才能进行。
Queue接口还有一个名为Deque的子接口,它允许我们高效的在队头或队尾添加/删除元素,实现了Deque的接口的集合类即为双端队列的一种实现(比如LinkedList就实现了Deque接口...null E remove() //返回并移除队头元素 add与offer,element与peek,remove与poll看似是三对儿功能相同的方法。...extends V> m) //创建一个新的HashMap,用m的数据填充 常用方法如下: void clear() boolean containsKey(Object key) boolean containsValue...关于WeakHashMap和其他类的具体使用方法及注意事项,大家可以参考官方文档。 下面我们来简单地介绍下另一个Map接口的具体实现——TreeMap。...extends V> m) //构造一个与映射表m含有相同元素的TreeMap,用自然序进行排列 TreeMap(SortedMap<K,?
凑合着用Set与Queue中的等价类时,会缺少一些List特有的方法如get(i)。...CopyOnWriteArraySet:内部是CopyOnWriteArrayList的并发优化的Set,利用其addIfAbsent()方法实现元素去重,如前所述该方法的性能很一般。...4.1.3 PriorityQueue 用平衡二叉最小堆实现的优先级队列,不再是FIFO,而是按元素实现的Comparable接口或传入Comparator的比较结果来出队,数值越小,优先级越高,越先出队...出队时,弹出queue[0],然后把queque[size]拿出来二叉地往下比较调整堆。 初始大小为11,空间不够时自动50%扩容。...当入队时队列已满,或出队时队列已空,不同函数的效果见下表: | | 立刻报异常 | 立刻返回布尔 | 阻塞等待 | 可设定等待时间 | | 入队 | add(e) | offer(e) | put(
本文思维导图 [image] 为什么要学数据结构 了解了基本概念之后,接下来我们再来看看,为什么我们要学习数据结构呢? 在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。...这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。...强化学习阶段 完成了第一波视频+书籍的学习之后,我们应该已经对数据结构有了初步的了解了,对一些简单的数据结构算法也应该有所了解了,比如栈的入栈和出栈,队列的进队和出队,二叉树的先序遍历和后续遍历、层次遍历...对于考卷上的一些知识点,我觉得掌握的并不是很好,于是又买了《王道数据结构》以及一些并没有什么卵用的书回来看,再次强化了基础。...除了在纸上写之外,更好的办法自然是在电脑上敲了,写Java的使用Java写,写C++ 的用C++ 写,总之用自己擅长的语言实现就好,尴尬的是我当时只会c,所以就只好老老实实地用devc++写简单的c语言程序了
非阻塞队列:队列的入队和出队操作不会阻塞。 单端队列:队列的入队操作只能在队尾进行,队列的出队操作只能在队首进行。 双端队列:队列的入队操作和出队操作都可以在队首和队尾进行。...也可以在内部不存在队列,例如SynchronousQueue,SynchronousQueue实现了生产者的入队操作必须等待消费者的出队操作完成之后才能进行。...(建议收藏)》 《我用多线程进一步优化了亿级流量电商业务下的海量数据校对系统,性能再次提升了200%!!...(全程干货,建议收藏)》 《我用多线程优化了亿级流量电商业务下的海量数据校对系统,性能直接提升了200%!!(全程干货,建议收藏)》 《我用10张图总结出了这份并发编程最佳学习路线!!...(建议收藏)》 《我用三天时间开发了一款老少皆宜的国民级游戏,支持播放音乐,现开放完整源代码和注释(建议收藏)!!》 《我是全网最硬核的高并发编程作者,CSDN最值得关注的博主,大家同意吗?
对每一个句子,只有我自己让我是可以读懂的,我才会贴上来。 因为中文和英文的确存在差异,并非每一句英文的意思都可以用中文完全表达出同样的意思,不可避免的存在些个翻译出来比较奇怪的词语。...关于【译者注】:我思故我惑。书里也有很多我读不懂的、不太理解的知识盲区。读的时候我会查找相关资料,但是我就会想,为什么不把我找到的觉得不错的资料分享给读者呢?这就是我的翻译中那些【译者注】的由来。...我觉得你可以参考这篇来建:适用于渗透测试不同阶段的工具收集整理 本书毕竟是一本外语书,有的工具不适合国内环境。大家自行取舍。...而随着新的技术的发展、不断地趋于大和复杂,一些曾经出现过的旧的漏洞又会出现。传统的攻击方法会迸发出新的生机。 这大概就是我们阅读此类书的目的吧。...我从本书中作者的循循善诱中学到了很多,作者不仅逐步深入,还会跟我们讲为什么编程能力对安全人员很重要、为什么我们需要理解底层......我相信如果你认真读了,你会跟我一样收获颇多。
领取专属 10元无门槛券
手把手带您无忧上云