DotNet 源码学习——QUEUE
1、Queue声明创建对象。(Queue为泛型对象。)
public class Queue<T> :IEnumerable<T>,System.Collections.ICollection,IReadOnlyCollection<T>
本质为Array对象存储数据。
Queue<string> qy = new Queue<string>();
private T[] _array
public Queue()
{
_array = Array.Empty<T>();
}
Queue<int> qy1 = new Queue<int>();
public Queue(int capacity)
{
if (capacity < )
throw new ArgumentOutOfRangeException(nameof(capacity), capacity, SR.ArgumentOutOfRange_NeedNonNegNum);
_array = new T[capacity];
}
Queue<int> qy2 = new Queue<int>(new List<int>()); public Queue(IEnumerable<T> collection)
{
if (collection == null)
throw new ArgumentNullException(nameof(collection)); _array = EnumerableHelpers.ToArray(collection, out _size);
if (_size != _array.Length) _tail = _size;
}
2、队列的空间是实际存储值的两倍,如果小于两倍则每次增场4的长度。
if (_size == _array.Length)
{
int newcapacity = (int)((long)_array.Length * (long)GrowFactor / );
if (newcapacity < _array.Length + MinimumGrow)
{
newcapacity = _array.Length + MinimumGrow;
}
SetCapacity(newcapacity);
}
3、Queue为先进先出。
进队列在数组末尾赋值
public void Enqueue(T item)
{
if (_size == _array.Length)
{
int newcapacity = (int)((long)_array.Length * (long)GrowFactor / );
if (newcapacity < _array.Length + MinimumGrow)
{
newcapacity = _array.Length + MinimumGrow;
}
SetCapacity(newcapacity);
} _array[_tail] = item;
MoveNext(ref _tail);
_size++;
_version++;
}
出队列则从头部取值
public T Dequeue()
{
int head = _head;
T[] array = _array; if (_size == )
{
ThrowForEmptyQueue();
} T removed = array[head];
if (RuntimeHelpers.IsReferenceOrContainsReferences<T>())
{
array[head] = default!;
}
MoveNext(ref _head);
_size--;
_version++;
return removed;
}
4、TryDequeue 与 Dequeue()区别在于 TryDequeue 判断size为0时,返回false 并out 泛型的默认值
public bool TryDequeue([MaybeNullWhen(false)] out T result)
{
int head = _head;
T[] array = _array; if (_size == )
{
result = default!;
return false;
} result = array[head];
if (RuntimeHelpers.IsReferenceOrContainsReferences<T>())
{
array[head] = default!;
}
MoveNext(ref _head);
_size--;
_version++;
return true;
}
注:MaybeNullWhenAttribute(Boolean) 返回值条件。 如果方法返回此值,则关联的参数可能为 null
5、Peek 仅仅时查看一下下一个要返回的值,不从数组移除
if (_size == )
{
result = default!;
return false;
} result = _array[_head];
return true;
随是拙见,但为原创,转载注明出处,敬谢
Queue 常用的方法大约就这些。先写道这里,碎觉。
以下为公众号,一起学起来~

DotNet 源码学习——QUEUE的更多相关文章
- DotNet源码学习-HASHSET(初探)
命名空间:System.Collections.Generic 先看一下官方说明:类提供了高级的设置操作.集是不包含重复元素的集合,其元素无特定顺序. HashSet <T>对象的容量是对 ...
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析
经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...
- Java并发包源码学习之AQS框架(一)概述
AQS其实就是java.util.concurrent.locks.AbstractQueuedSynchronizer这个类. 阅读Java的并发包源码你会发现这个类是整个java.util.con ...
- igmpproxy源码学习——igmpProxyInit()
igmpproxy源码学习--igmpProxyInit()函数具体解释.igmpproxy初始化 在执行igmpproxy的主程序igmpproxyRun()之前须要对igmpproxy进行一些配置 ...
- [Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法
博客首页:http://www.cnblogs.com/kezhuang/p/关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下<[Andr ...
- threadpool源码学习
threadpool源码学习 __all__ = [ 'makeRequests', 'NoResultsPending', 'NoWorkersAvailable', 'ThreadPool', ' ...
- RocketMQ 源码学习笔记————Producer 是怎么将消息发送至 Broker 的?
目录 RocketMQ 源码学习笔记----Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest ...
- RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?
目录 RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest Roc ...
随机推荐
- 从0开发3D引擎(八):准备“搭建引擎雏形”
大家好,现在开始本系列的第三部分,按照以下几个步骤来搭建引擎雏形: 1.分析引擎的需求 2.实现最小的3D程序 3.从中提炼引擎原型 4.一步一步地对引擎进行改进,使其具备良好的架构 5.实现与架构相 ...
- typescript 为什么使用 let呢
为什么是使用let呢 因为已经厌烦了 int var 呵呵
- 推荐一个学java的网站
最近在接触Java发现一个可以用来学习的 很不错的网站 直接扔链接 http://how2j.cn?p=77451
- javascript的对象、类和方法
1.类和对象的概念: 1.所有的事物都是一个对象,而类就是具有相同属性和行为方法的事物的集合 2.在JavaScript中建立对象的目的就是将所有的具有相同属性的行为的代码整合到一起,方便使用者的管理 ...
- linux--->配置lamp环境(centos7 最小版)
这篇博客写的很全,按照顺序敲代码即可 参考:https://www.cnblogs.com/me80/p/7218883.html
- jenkins 与 gitlab 的持续集成
前言介绍 gitlab与jenkins的安装部署请参考之前的文章:这里介绍一下jenkins与gitlab结合的好处. gitlab可以自己实现CICD功能,jenkins也可以结合其他工具来实现CI ...
- Exception | java.security.NoSuchProviderException: no such provider: BC
背景 今天在用PGP key做JWT签名和验签的时候,转换报了如下错误: org.bouncycastle.openpgp.PGPException: exception on setup: java ...
- Activity工作流框架入门(二)API使用DEMO
工作流API使用Demo package activity.demo.test; import java.io.File; import java.io.FileInputStream; import ...
- Django报错Watching for file changes with StatReloader
Django项目运行时出现:Watching for file changes with StatReloader错误 原因:环境里的django或者python的版本有问题 解决方案:升级或者降级D ...
- WTL改变对话框大小
1.让对话框从CdialogResize类继承过来: class CMainDlg : public CDialogImpl<CMainDlg>, public CDoubleBuffer ...