这几天都有要学习一些有关于unity3d中有关可用数组存储这方面的知识,同时有在网上收集一些资料。
原文(转载):http://blog.csdn.net/jbjwpzyl3611421/article/details/11113529
(给大家看三篇文档Dictionary,HashTable)原帖:http://tieba.baidu.com/p/2696435222
(Hashtable和Dictionary学习笔记)原文:http://www.unitymanual.com/blog-46104-1756.html
(C#中数组、ArrayList和List三者的区别)原文:http://blog.csdn.net/zhang_xinxiu/article/details/8657431
第一篇比较基础说的也比较详细,就贴一下:(我这边只贴关于C#的代码)
Built-in array
ArrayList
Hashtable
Generic List
Generic Dictionary
2D Array
1. 内置数组build-in-Array:
例如:int[] myArray = new int[10];
优点:最高效,唯一能在unity监视面板中看到的数组
缺点:数组成员只能是同一种类型;数组长度不可变,但是可确定数组最大长度,用不到的留空,
尽量用这种数组。
(写法和c有些差,一般用的最多的数组,最重要的问题就是长度不可变,在不确定长度或者数组可能有较多的扩充的时候最好换别的数组来存储)
2. ArrayList:
ArrayList是命名空间System.Collections下的一部分,在使用该类时必须进行引用,同时继承了IList接口,提供了数据存储和检索。ArrayList对象的大小是按照其中存储的数据来动态扩充与收缩的。所以,在声明ArrayList对象时并不需要指定它的长度。
例如:ArrayList array = new ArrayList ();
优点:数组长度是动态的。
缺点:
(1)在ArrayList中插入不同类型的数据是允许的,在我们使用ArrayList处理数据时,很可能会报类型不匹配的错误,也就是ArrayList不是类型安全的。
(2)因为ArrayList会把所有插入其中的数据当作为object类型来处理,在存储或检索值类型时通常发生装箱和取消装箱操作,带来很大的性能耗损。
装箱和拆箱:
装箱和拆箱是值类型和引用类型之间相互转换是要执行的操作。
(1)装箱在值类型向引用类型转换时发生
(2)拆箱在引用类型向值类型转换时发生
(装箱很耗性能,拆箱性能可以忽略不计)
例如:
int i=1
object o=i;//装箱
int b=(int)o;//拆箱
3.Generic List:因为ArrayList存在不安全类型与装箱拆箱的缺点,所以出现了泛型的概念。List类是ArrayList类的泛型等效类,它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。
例如:List<int> a = new <int>();
优点:节省资源,不易出错
比较重要的是Generic List不能在iPhone中使用!
c#中使用:必须声明using System.Collections.Generic; 命名空间
后面有关Hashtable和Dictionary可以查看第2、3篇转载的文章
4.Generic Dictionary
Dictionary<string, string>是一个泛型 他本身有集合的功能有时候可以把它看成数组, 他的结构是这样的:Dictionary<[key], [value]> ,
他的特点是存入对象是需要与[key]值一一对应的存入该泛型, 通过某一个一定的[key]去找到对应的值,[key]不能重复,它的单个数组是KeyValuePair<key, value>,[value]可以是string,int 和一个类等等.
例如:Dictionary<string, string> dic = new Dictionary<string, string>();
优点:有泛型优势,且读取速度较快,容量利用更充分,推荐单线程使用
缺点:Dictionary使用索引器取值时,如果键不存在就会引发异常,可使用ContarnsKey()来判断,经常取值最好用TryGetValue方法来获取集合中对应的键值。
不能在iPhone中使用!
注意:遍历键值对用KeyValuePair
5、Hashtable
Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对.
例如:Hashtable hash = new Hashtable ();
优点:多线程程序中推荐使用Hashtable,默认的Hashtable允许单线程写入,多线程读取,对Hashtable进一步调用Synchronized()可以获得完全线程安全的类型,而Dictionary非线程安全,必须人为使用Lock语句进行保护,效率大减。
缺点:Hashtable的元素属于Object类型,所以在存储或检索值类型时通常发生装箱和拆箱操作。
注意:遍历哈希表遍历哈希表需要用到DictionaryEntry Object
差不多就到这,好不容易项目终于结束了,虽然不是商业用途,但是和上一个项目一样都没有得到预想的结果,就这样不了了之,什么时候才能做出像样的作品,再过几天就要去实习,还有很多东西要学,加油!