热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity中常用数据结构的,特点,优缺点,实例。

Unity中常用的数据结构有一下几种:Array,ArrayList,List,LinkedList,Queu

Unity中常用的数据结构有一下几种:Array,ArrayList,List,LinkedList,Queue,Stack,Dictionary;就一一分析一下他们的特点,优缺点和用法吧,要是有错误的地方欢迎指正;


一,数组(Array)

特点:


  1. 数组属于线性结构,在内存中是连续存放的。
  2. 数组的元素类型必须相同。
  3. 数组可以直接通过下标访问。
  4. 数组的查找速度非常快,新增和删除速度慢。
  5. 数组在初始化时要指定数组长度。

优缺点:

优:存储在连续内存上;内容都是相同类型;可以通过下标访问,查找的速度很快;

缺:必须指定其长度,元素插入也不方便(过长浪费内存,多段会溢出),新增和删除也很慢;

实例:

string[] arr;void Start(){//必须初始一个长度;arr = new string[3];//赋值;arr[0] = "abc";arr[1] = "bm";arr[2] = "r";//修改;arr[2] = "bb";}

二,动态数组(ArrayList)

特点:


  1. ArrayList的底层其实就是一个数组。
  2. ArrayList在声明时不必指定长度,会根据存储的数据动态的增加或减少长度。
  3. ArrayList会把所有的元素都当做Object处理,因此可以存储不同数据类型的元素。
  4. 插入和删除一个元素时,会移动它之后所有元素的位置,效率低;
  5. ArrayList是非类型安全的,在插入和删除元素时会进行拆箱和装箱问题,影响性能,效率低。

优缺点:

优:可动态增加和删除 ,可存储不同类型;

缺:类型不安全,因为存储的是不同类型,都会当Object来处理。插入值类型会发生装箱,索引取值会拆箱,影响性能,效率低。

实例:

ArrayList arrayList;void Start(){arrayList = new ArrayList();//增加arrayList.Add("asdf");arrayList.Add(0);arrayList.Add('c');arrayList.Add(3);//删除arrayList.Remove(0);//按内容直接删除arrayList.RemoveAt(0);//按坐标删除//修改arrayList[0] = "asdfsdfa";for (int i = 0; i

三,List泛型

list在Unity中是比较常见的数据结构,因为ArrayList相当于Array的一个优化,List又相当于ArrayList的泛型类,成功解决的ArrayList装箱拆箱的问题,及安全又提升了效率;

特点:


  1. List是ArrayList的泛型类。
  2. 泛型List需要在声明时指定具体的类型。
  3. 泛型List没有装箱和拆箱操作,因此List比ArrayList效率高而且类型安全。

优缺点:

优:Array和ArrayList结合,泛型规定了其类型,避免了拆装箱操作,及安全又提升了效率;

实例:

List numberList;void Start(){numberList = new List();//增加numberList.Add(0);numberList.Add(5);numberList.Add(9);//删除numberList.Remove(0);//修改numberList[0] = 45;}


四,双向链表(LinkedList)

特点:


  1. 链表的节点在内存中的空间是不连续的,每块空间称作一个节点,每个节点都存有一个前驱和后置指针,分别指向前一个节点和后一个节点,因此向链表中添加和删除元素的效果高,只需要更改相应节点的指针指向即可。
  2. 链表的查找效率低。查找元素时不能通过下标进行访问,只能从头开始通过地址按顺序查找。

优缺点:

优:插入和删除操作无需调整结构容量,靠各个对象的指针决定,尤其是元素的数量不固定需要在两头插入时;

缺:最大的缺点是存储在内存空间不一定是连续的,无法利用下标查找。

实例:

LinkedList numLinkedList;void Start(){numLinkedList = new LinkedList();//增加numLinkedList.AddLast(1);numLinkedList.AddLast(5);numLinkedList.AddLast(8);numLinkedList.AddFirst(78);//插入到第一个;numLinkedList.AddLast(0);//插入到最后一个;//删除numLinkedList.Remove(1);//获取元素只能从头按顺序遍历,不能通过下标查找;foreach (int item in numLinkedList){Debug.Log(item);}}


五,Queue(队列)

队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队

特点:


  1. 链表是先进先出的原则,最先进入的元素最先被访问,最后进入的元素最后被访问。
  2. Enqueue入队列,Dequeue出队列并返回列首元素,Peek只返回列首元素。 

优缺点:

优:能对集合进行顺序处理(先进先出)。能接受null值,并且允许重复的元素。

缺:不能通过下标访问;

实例:

Queue strQueue;void Start(){strQueue = new Queue();//将对象添加到 Queue 的结尾处。strQueue.Enqueue("星期日");strQueue.Enqueue(null);strQueue.Enqueue("星期一");strQueue.Enqueue("星期二");strQueue.Enqueue("星期三");strQueue.Enqueue("星期四");strQueue.Enqueue("星期五");strQueue.Enqueue("星期六");//移除并返回位于 Queue 开始处的对象。(及星期日);最先进入的最先删除;strQueue.Dequeue();string str = strQueue.Dequeue();Debug.Log(str);}

一层一层的遍历子物体的时候用队列更方便;

void Start(){GetAllChild(transform);}//使用队列实现public void GetAllChild(Transform parent){//队列存放需要被遍历的节点//加入的逻辑为:当前节点的子节点,从第一个子节点到最后一个子节点顺序加入Queue queue = new Queue();queue.Enqueue(parent);while (queue.Count > 0){//当前访问的子节点Transform current = queue.Dequeue();//输出当前节点的名字Debug.Log(current.name);//如果当前节点有子节点,则将其加入队列,留待以后遍历for (int i = 0; i

队列还可以,对消息或事件的发送与受理进行时间上的解耦。搜索消息队列就好,总之对于先进先出的数据,用队列处理最合适;


六,Stack(堆栈)

堆栈(Stack)代表了一个后进先出的对象集合。当您需要对各项进行后进先出的访问时,则使用堆栈。当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素。

特点:


  1. 堆栈是先进后出的原则,最先插入的元素最后被访问,最后插入的元素最先被访问。
  2. Push入栈,Pop出栈并返回栈顶元素,Peek只返回栈顶元素。

优缺点:

同Queue,只是先进后出

实例:

Stack stack;void Start(){stack = new Stack();//插入一个元素stack.Push("A");stack.Push("B");stack.Push("C");stack.Push("D");stack.Push(null);//移除顶部一个元素;D最后进入,D在顶部被移除;// stack.Pop();//返回在 Stack 的顶部的对象,但不移除它。string str = stack.Peek();Debug.Log(str);foreach (string item in stack){Debug.Log(item);}}
七,Dictionary

特点:


  1. 创建字典时需要指定key和value的数据类型。
  2. 字典中的key值是唯一的,value的值可以不唯一。
  3. 可以通过key快速查找对应的value,速度快,但是消耗内存。

优缺点:

优:(以内存换时间,需要键值对,快速操作)dictionary内部使用哈希表来存储元素对应的位置,通过哈希值快速从哈希表定位元素所在的位置索引,从而快速获取key对应的value;

缺:通过更多的内存开销来满足我们对速度的追求。

实例:

Dictionary dic;void Start(){dic = new Dictionary();//赋值dic.Add(0, "a");dic.Add(1, "b");dic.Add(2, "c");dic.Add(3, "d");//移除dic.Remove(0);//根据key,获取到对应的valuestring str = dic[3];Debug.Log(str);//遍历字典;foreach (var item in dic){Debug.Log(item.Value);}}


推荐阅读
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 使用方法:将要控制的角色拖到TargetBody,将相机的焦点拖到CamerPivot,,建议CameraPivot是一个放在TargetBody下的子物体,并且位置应该是在Tar ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 本文介绍了如何处理在Xcode构建过程中出现的多个命令生成相同文件的问题,特别是当这些文件与Info.plist无关时。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • Flowable 流程图路径与节点展示:已执行节点高亮红色标记,增强可视化效果
    在Flowable流程图中,通常仅显示当前节点,而路径则需自行获取。特别是在多次驳回的情况下,节点可能会出现混乱。本文重点探讨了如何准确地展示流程图效果,包括已结束的流程和正在执行的流程。具体实现方法包括生成带有高亮红色标记的图片,以增强可视化效果,确保用户能够清晰地了解每个节点的状态。 ... [详细]
  • Silverlight 实战指南:深入解析用户提交数据的验证与捕获机制
    本文深入探讨了Silverlight中用户提交数据的验证与捕获机制,详细分析了四种主要的验证方法:基本异常处理、DataAnnotation注解、IDataErrorInfo客户端同步验证以及自定义验证策略。通过实例解析,帮助开发者更好地理解和应用这些机制,提升应用程序的数据处理能力和用户体验。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
author-avatar
数到我答应我937
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有