当前位置:   article > 正文

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

unity 数据结构

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

一,数组(Array)

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

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

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

实例:

  1.  string[] arr;
  2.     void Start()
  3.     {
  4.         //必须初始一个长度;
  5.         arr = new string[3];
  6.         //赋值;
  7.         arr[0] = "abc";
  8.         arr[1] = "bm";
  9.         arr[2] = "r";
  10.         //修改;
  11.         arr[2] = "bb";
  12.     }


二,动态数组(ArrayList)

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

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

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

实例:

  1.  ArrayList arrayList;
  2.     void Start()
  3.     {
  4.         arrayList = new ArrayList();
  5.         //增加
  6.         arrayList.Add("asdf");
  7.         arrayList.Add(0);
  8.         arrayList.Add('c');
  9.         arrayList.Add(3);
  10.         //删除
  11.         arrayList.Remove(0);//按内容直接删除
  12.         arrayList.RemoveAt(0);//按坐标删除
  13.         //修改
  14.         arrayList[0] = "asdfsdfa";
  15.  
  16.  
  17.         for (int i = 0; i < arrayList.Count; i++)
  18.         {
  19.             Debug.Log(arrayList[i]);
  20.         }
  21.     }


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

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

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

实例:

  1.   List<int> numberList;
  2.     void Start()
  3.     {
  4.         numberList = new List<int>();
  5.         //增加
  6.         numberList.Add(0);
  7.         numberList.Add(5);
  8.         numberList.Add(9);
  9.         //删除
  10.         numberList.Remove(0);
  11.         //修改
  12.         numberList[0] = 45;
  13.     }


四,双向链表(LinkedList)

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

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

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

实例:

  1.  LinkedList<int> numLinkedList;
  2.     void Start()
  3.     {
  4.         numLinkedList = new LinkedList<int>();
  5.         //增加
  6.         numLinkedList.AddLast(1);
  7.         numLinkedList.AddLast(5);
  8.         numLinkedList.AddLast(8);
  9.         numLinkedList.AddFirst(78);//插入到第一个;
  10.         numLinkedList.AddLast(0);//插入到最后一个;
  11.  
  12.         //删除
  13.         numLinkedList.Remove(1);
  14.         //获取元素只能从头按顺序遍历,不能通过下标查找;
  15.         foreach (int item in numLinkedList)
  16.         {
  17.             Debug.Log(item);
  18.         }
  19.     }


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

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

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

缺:不能通过下标访问;

实例:

  1.  Queue<string> strQueue;
  2.     void Start()
  3.     {
  4.         strQueue = new Queue<string>();
  5.         //将对象添加到 Queue 的结尾处。
  6.         strQueue.Enqueue("星期日");
  7.         strQueue.Enqueue(null);
  8.         strQueue.Enqueue("星期一");
  9.         strQueue.Enqueue("星期二");
  10.         strQueue.Enqueue("星期三");
  11.         strQueue.Enqueue("星期四");
  12.         strQueue.Enqueue("星期五");
  13.         strQueue.Enqueue("星期六");
  14.         //移除并返回位于 Queue 开始处的对象。(及星期日);最先进入的最先删除;
  15.         strQueue.Dequeue();
  16.  
  17.         string str = strQueue.Dequeue();
  18.         Debug.Log(str);
  19.     }

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

  1.  void Start()
  2.     {
  3.  
  4.         GetAllChild(transform);
  5.     }
  6.  
  7.     //使用队列实现
  8.     public void GetAllChild(Transform parent)
  9.     {
  10.         //队列存放需要被遍历的节点
  11.         //加入的逻辑为:当前节点的子节点,从第一个子节点到最后一个子节点顺序加入
  12.         Queue<Transform> queue = new Queue<Transform>();
  13.         queue.Enqueue(parent);
  14.         while (queue.Count > 0)
  15.         {
  16.             //当前访问的子节点
  17.             Transform current = queue.Dequeue();
  18.             //输出当前节点的名字
  19.             Debug.Log(current.name);
  20.             //如果当前节点有子节点,则将其加入队列,留待以后遍历
  21.             for (int i = 0; i < current.childCount; i++)
  22.             {
  23.                 queue.Enqueue(current.GetChild(i));
  24.             }
  25.         }
  26.     }

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

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

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

优缺点:
同Queue,只是先进后出

实例:

  1.     Stack<string> stack;
  2.     void Start()
  3.     {
  4.         stack = new Stack<string>();
  5.         //插入一个元素
  6.         stack.Push("A");
  7.         stack.Push("B");
  8.         stack.Push("C");
  9.         stack.Push("D");
  10.         stack.Push(null);
  11.         //移除顶部一个元素;D最后进入,D在顶部被移除;
  12.        // stack.Pop();
  13.         //返回在 Stack 的顶部的对象,但不移除它。
  14.         string str = stack.Peek();
  15.  
  16.         Debug.Log(str);
  17.         foreach (string item in stack)
  18.         {
  19.             Debug.Log(item);
  20.         }
  21.     }


七,Dictionary

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

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

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

实例:

  1.  Dictionary<int, string> dic;
  2.     void Start()
  3.     {
  4.         dic = new Dictionary<int, string>();
  5.         //赋值
  6.         dic.Add(0, "a");
  7.         dic.Add(1, "b");
  8.         dic.Add(2, "c");
  9.         dic.Add(3, "d");
  10.         //移除
  11.         dic.Remove(0);
  12.         //根据key,获取到对应的value
  13.         string str = dic[3];
  14.  
  15.         Debug.Log(str);
  16.         //遍历字典;
  17.         foreach (var item in dic)
  18.         {
  19.             Debug.Log(item.Value);
  20.         }
  21.     }


————————————————

原文链接:https://blog.csdn.net/f402455894/article/details/118180929

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/95407
推荐阅读
相关标签
  

闽ICP备14008679号