深圳Unity3D培训
达内深圳龙华中心

150-1322-7143

热门课程

Unity3D中常用的数据结构总结与分析

  • 时间:2017-08-15
  • 发布:深圳Unity3D培训
  • 来源:达内新闻

Unity3D中常用的数据结构总结与分析

1.几种常见的数据结构

这儿首要总结下小匹夫在工作中常碰到的几种数据结构:Array,ArrayList,List,LinkedList,Queue,Stack,Dictionary
数组Array:

数组是最简略的数据结构。其具有如下特色:

    数组存储在接连的内存上。
    数组的内容都是相同类型。
    数组能够直接经过下标拜访。

数组Array的创立:

1 int size = 5; 2 int[] test = new int[size];

创立一个新的数组时将在 CLR 保管堆中分配一块接连的内存空间,来盛放数量为size,类型为所声明类型的数组元素。如果类型为值类型,则将会有size个未装箱的该类型的值被创立。如果类型为引证类型,则将会有size个相应类型的引证被创立。

由所以在接连内存上存储的,所以它的索引速度非常快,拜访一个元素的时刻是稳定的也就是说与数组的元素数量无关,并且赋值与修正元素也很简略。

string[] test2 = new string[3]; //赋值 test2[0] = "chen";
test2[1] = "j";
test2[2] = "d"; //修正 test2[0] = "chenjd";

可是有长处,那么就一定会随同着缺陷。由所以接连存储,所以在两个元素之间刺进新的元素就变得不方便。并且就像上面的代码所显现的那样,声明一个新的数组时,有必要指定其长度,这就会存在一个潜在的问题,那就是当我们声明的长度过长时,显然会浪费内存,当我们声明长度过短的时分,则面对这溢出的风险。这就使得写代码像是投机,小匹夫很厌恶这样的行为!针对这种缺陷,下面隆重推出ArrayList。
ArrayList:

为了处理数组创立时有必要指定长度以及只能寄存相同类型的缺陷而推出的数据结构。ArrayList是System.Collections命名空间下的一部分,所以若要运用则有必要引进System.Collections。正如上文所说,ArrayList处理了数组的一些缺陷。

    不用在声明ArrayList时指定它的长度,这是由于ArrayList方针的长度是依照其中存储的数据来动态添加与减缩的。
    ArrayList能够存储不同类型的元素。这是由于ArrayList会把它的元素都作为Object来处理。因而,参加不同类型的元素是答应的。

ArrayList的操作:

ArrayList test3 = new ArrayList(); //新增数据 test3.Add("chen");
test3.Add("j");
test3.Add("d");
test3.Add("is");
test3.Add(25); //修正数据 test3[4] = 26; //删去数据 test3.RemoveAt(4);

说了那么一堆”长处“,也该说说缺陷了吧。为什么要给”长处”打上引号呢?那是由于ArrayList能够存储不同类型数据的原因是由于把一切的类型都作为Object来做处理,也就是说ArrayList的元素其实都是Object类型的,辣么问题就来了。

    ArrayList不是类型安全的。由于把不同的类型都作为Object来做处理,很有可能会在运用ArrayList时发作类型不匹配的状况。
    如上文所诉,数组存储值类型时并未发作装箱,可是ArrayList由于把一切类型都作为了Object,所以不可避免的当刺进值类型时会发作装箱操作,在索引取值时会发作拆箱操作。这能忍吗?

注:为何说频频的没有必要的装箱和拆箱不能忍呢?且听小匹夫渐渐道来:所谓装箱 (boxing):就是值类型实例到方针的变换(百度百科)。那么拆箱:就是将引证类型变换为值类型咯(仍是来自百度百科)。下面举个栗子~

//装箱,将String类型的值FanyoyChenjd赋值给方针。 int info = 1989; object obj=(object)info; //拆箱,从Obj中提取值给info object obj = 1; int info = (int)obj;

那么定论呢?好吧,请答应小匹夫很low再次引证百度百科。显然,从原理上能够看出,装箱时,生成的是全新的引证方针,这会有时刻损耗,也就是造成功率下降。
List泛型List

为了处理ArrayList不安全类型与装箱拆箱的缺陷,所以呈现了泛型的概念,作为一种新的数组类型引进。也是工作中常常用到的数组类型。和ArrayList很类似,长度都能够灵敏的改动,最大的不同在于在声明List调集时,我们一起需求为其声明List调集内数据的方针类型,这点又和Array很类似,其实List内部运用了Array来完成。

List<string> test4 = new List<string>(); //新增数据  test4.Add(“Fanyoy”);  
test4.Add(“Chenjd”); //修正数据  test4[1] = “murongxiaopifu”; //移除数据  test4.RemoveAt(0);  

这么做最大的长处就是

    即确保了类型安全。
    也取消了装箱和拆箱的操作。
    它交融了Array能够快速拜访的长处以及ArrayList长度能够灵敏改变的长处。

LinkedList

也就是链表了。和上述的数组最大的不同之处就是在于链表在内存存储的排序上可能是不接连的。这是由于链表是经过上一个元素指向下一个元从来摆放的,所以可能不能经过下标来拜访。如图

已然链表最大的特色就是存储在内存的空间纷歧定接连,那么链表相关于数组最大优势和下风就清楚明了了。

    向链表中刺进或删去节点无需调整结构的容量。由于自身不是接连存储而是靠各方针的指针所决议,所以添加元素和删去元素都要比数组要有优势。

    链表适合在需求有序的排序的情境下添加新的元素,这儿还拿数组做比照,例如要在数组中心某个方位添加新的元素,则可能需求移动移动许多元素,而关于链表而言可能仅仅若干元素的指向发作改变罢了。

    有长处就有缺陷,由于其在内存空间中纷歧定是接连摆放,所以拜访时分无法运用下标,而是有必要从头结点开端,逐次遍历下一个节点直到寻找到方针。所以当需求快速拜访方针时,数组无疑更有优势。

综上,链表适合元素数量不固定,需求常常增减节点的状况。
Queue

在Queue这种数据结构中,最早刺进在元素将是最早被删去;反之最后刺进的元素将最后被删去,因而行列又称为“先进先出”(FIFO—first in first out)的线性表。经过运用Enqueue和Dequeue这两个方法来完成对 Queue的存取。

一些需求留意的当地:

    先进先出的情景。
    默认状况下,Queue的初始容量为32, 添加因子为2.0。
    当运用Enqueue时,会判断行列的长度是否满意,若不足,则根据添加因子来添加容量,例如当为初始的2.0时,则行列容量添加2倍。
    乏善可陈。

Stack

与Queue相对,当需求运用后进先出次序(LIFO)的数据结构时,我们就需求用到Stack了。

一些需求留意的当地:

    后进先出的情景。
    默认容量为10。
    运用pop和push来操作。
    乏善可陈。

Dictionary

字典这东西,小匹夫可是喜爱的不得了。看官们自己也能够想想字典是不是很招人喜爱,创立一个字典之后就能够往里面扔东西,添加、删去、拜访那叫一个快字了得。可是直到小匹夫日前看了一个大神的文章,才又想起了那句话“啥功德咋能让你都占了呢”。

那么字典背面究竟隐藏着什么迷雾,拨开重重迷雾之后,是否才是本相?且听下回分。。。等等,应该是下面就让我们来剖析一下字典吧。

说到字典就不得不说Hashtable哈希表以及Hashing(哈希,也有叫散列的),由于字典的完成方法就是哈希表的完成方法,只不过字典是类型安全的,也就是说当创立字典时,有必要声明key和item的类型,这是第一条字典与哈希表的差异。关于哈希表的内容引荐看下这篇博客哈希表。

关于哈希,简略的说就是一种将任意长度的消息压缩到某一固定长度,比方某校园的学生学号规模从00000~99999,一共5位数字,若每个数字都对应一个索引的话,那么就是100000个索引,可是如果我们运用后3位作为索引,那么索引的规模就变成了000~999了,当然会抵触的状况,这种状况就是哈希抵触(Hash Collisions)了。

回到Dictionary,我们在对字典的操作中各种时刻上的优势都享用到了,那么它的下风究竟在哪呢?对嘞,就是空间。以空间换时刻,经过更多的内存开支来满意我们对速度的寻求。在创立字典时,我们能够传入一个容量值,但实践运用的容量并非该值。

而是运用“不小于该值的最小质数来作为它运用的实践容量,最小是3。”(老赵),当有了实践容量之后,并非直接完成索引,而是经过创立额定的2个数组来完成直接的索引,即int[] buckets和Entry[] entries两个数组(即buckets中保存的其实是entries数组的下标),这儿就是第二条字典与哈希表的差异,还记得哈希抵触吗?

对,第二个差异就是处理哈希抵触的战略是不同的!字典会选用额定的数据结构来处理哈希抵触,这就是方才说到的数组之一buckets桶了,buckets的长度就是字典的实在长度,由于buckets就是字典每个方位的映射,然后buckets中的每个元素都是一个链表,用来存储相同哈希的元素,然后再分配存储空间。

因而,我们面对的状况就是,即使我们新建了一个空的字典,那么随同而来的是2个长度为3的数组。所以当处理的数据不多时,仍是稳重运用字典为好,许多状况下运用数组也是能够接受的。

想知道更多关于IT行业的信息吗?想远远不如行动,行动起来,一起加入达内,一起进入IT行业,跟着达内的脚步,一起走进如今的互联网信息时代,带给你不一样的色彩生活——【深圳Unity3D培训

深圳达内

上一篇:【Unity3D技巧】一个简单的Unity-UI框架的实现
下一篇:Unity3D编程学习分享

增强现实技术(AR)及扩展应用

【深圳Unity3D培训】了解AssetBundle

【深圳Unity3D培训】基于Socket通信的小实例

【深圳Unity3D培训】为什么最近好多游戏公司都倒闭了?10个理由

选择城市和中心
贵州省

广西省

海南省