Array 数组
在c#语言中,数组是最简单的数据结构,具有以下3个特点
(1) 数组储存在连续的内存上;
(2)数组的元素都是相同类型或者类型的衍生类型,因此数组又被认为是同质数据结构
(3)数组可以直接通过下标访问。array[i]来访问;
常规操作:
(1)分配储存空间, 声明一个新的数组 int[]arr=new int[5];
(2) 访问数组中的元素数据,通过下标获取某个元素;int i= arr[0];
Mono运行时的托管堆中分配一块连续的内存空间盛放数量为size,连续内存上储存,索引快,两个元素插入之间便不方便;
Arraylist数组
不必声明数组长度,可以储存不同类型元素,
每个元素为obj来处理;(不安全) 插入值类型会发生装箱操作,索引取值时会发生拆箱操作;
list<T>
工作时常用,和Arraylist相似,在声明list集合时,需要指定内部数据的存储类型,
List<string> test =new List<string>();
test.Add("abc");
test[0]="def";
test.RemoveAt(0);
确保类型安全, 类型安全;
取消装箱拆箱 高性能;
可以快速访问,灵活变化
LinedList<T>
链表
U3D中 已经封装好了
LinkedList<T> 链表类 双向列表 Next Previous
LinkedListNode<T> 链表节点
AddFirst 将一个新节点加入该链表的第一个节点位置;
AddLast 将一个新节点加入该链表的最后一个节点位置;
AddBefore 在某个节点前插入新节点
AddAfter 在某个节点后插入新节点;
RemoveFirst 移除第一个节点;
RemoveLast 移除最后一个节点;
Remove 移除指定节点;
队列 &栈
队列,特殊的线性表,(FIFO)先进先出, 像是在超市买菜排队结账;3
初始容量为32
允许在前端 head删除, 而在后端 tail 进行插入
插入操作,队尾, 删除操作,队头
c# U3D Queue<T>
Queue<string> number = new Queue<string>();
number.Enqueue("one");//插入操作 number.Enqueue("Two"); number.Dequeue(); //删除操作
栈 又名堆栈
形象一点就是 把东西堆起来, 先堆进去的最后出来。是也(LIFO)后进先出;
c# U3D Stack<T>
一样是运算受限制的线性表 仅允许在表的一端进行插入 删除运算,栈顶, 栈底,
插入叫进栈 入栈 压栈,把新元素放到栈顶,删除元素 称 出栈 退栈,把顶元素删除,
Stack<T>类有个 push 和pop方法;
peek// 看顶部元素, 偷看。。。
Stack<string> number2 = new Stack<string>();
.peek// 看顶部元素, 偷看。。。
number2.Push("abc"); //入栈 number2.Push("efg"); //出栈 number2.Pop(); //此时删除的是efg、
number2.peek// 看顶部元素, 偷看。。。
count总数, 如果Stack<T>中元素数量count小于其容量,Push操作时间复杂度为O(1);
如果容量需要被扩展,根据需要来重新分配内部数组以自动增大容量,这种情况下Push操作复杂度为O(n),出栈操作Pop操作复杂度为O(1);
Hash Table(哈希表) Dictionary<K,T> 字典
键值对
哈希表 散列表
根据关键码/值(key/value)直接进行访问的数据结构,通过关键码/值映射到表中的一个位置来访问记录,加快查找速度;
C#提供两种机制
冲突避免机制
冲突解决机制
冲突解决策略为开放寻址法
最简单的实现一种就是 线性探查,3个步骤
1 插入新元素时, 使用哈希函数在哈希表中定位元素位置。
2 检查哈希表中该位置是否已经存在元素。如果该位置内容为空,插入并返回,否认执行3
3 如果该位置为i,则检查i+1是否为空,如果已被占用,而检查i+2。依次类推,直到找到为空。
会导致同类哈希的聚集
改进方式为二次探查
每次检查位置空间的步长为平凡倍数,如果位置s被占用,而首先检查s+12处,然后检查 s-12 s+22 s-22 s+32 s-32......
但同样也会导致同类哈希聚集问题
Hashtable herosDic = new Hashtable(); herosDic.Add("111-11-1234", "Hero1"); herosDic.Add("111-12-1234", "Hero2"); herosDic.Add("111-13-1237", "Hero3"); herosDic.Add("111-14-1235", "Hero4"); herosDic.Add("111-15-1235", "Hero5"); if (herosDic.ContainsKey("111-11-1234")) { string heroName = (string)herosDic["111-11-1234"]; Debug.Log("ID111-11-1234" + heroName); } else { Debug.Log("111-11-1234不存在"); }
ContainsKey
ContainsValue
remove(key)
来源 小黄书
Dictionary<K,T> 字典
Dictionary<string, int> student = new Dictionary<string, int>(); student.Add("xiaoming", 0); student.Add("xiaohong", 1); student.Add("xiaobing", 2); foreach (var itme in student) { Debug.Log("val"+itme.Value + "key"+itme.Key); } student.Remove("xiaoming"); //缺点就是耗 内存空间 慎用