概要
数组、List、Dictionary存储方式对数据的存储和查找方式和优缺点
三种方式对数据的存储
数组:一串连续的空间存放数据
List:内部是使用泛型的数组存储数据,当数量到达数组的上限时会进行扩容,每次扩容一倍
Dictionary:内部使用的是哈希表【结构体数组】存储数据,数量到达上限之后会进行扩容,每次扩容一倍
三种方式的元素增加
- 数组【所有元素的地址都是连续的】
- 尾部增加:将元素放在最后一个元素后的空位里面,当元素超过数组上限的时候将增加失败。
- 非尾部增加:将要插入的位置元素和其后面的所有元素向后移动一位,再把元素添加进去。
- List【所有元素的地址都是连续的】
- 增加元素的时候是按照数组的尾部增加进行添加元素,当元素超过数组上限的时候会进行扩容,每次的容量都增加一倍,扩容后再将元素插入进去
- Dictionary【所有元素的地址不一定是连续的】
- 增加元素的时候会调用哈希函数获取到key被分配到的位置【在数组中的索引】,由于哈希函数得到的结果是分散且平均的,所以连续插入的元素位置会由哈希函数控制在数组中的位置,所以插入的值在字典中的位置是不连续的,当元素达到内部数组的上限时会进行扩容,每次扩大一倍。
三种方式的元素查找
- 数组
- 通过索引查找 : 每个数组的名字可以看作是一个指针,这个指针指向的是这个数组内第一个元素的地址,并且每个数组内只能存储相同类型的元素,所以【要查找元素的地址=第一个元素的地址+每个元素占用的内存大小*对应的索引】直接获取到对应元素的地址,可以很快地找到对应的元素。
- 存值类型:每个元素的大小可以确定
- 存的是引用类型:你可以理解成存进去的是每个对象的地址,这个的大小也可以确定
- List
- 查找的方式跟数组的查找方式一样
- Dictionary
- 查找方式通过Key进行查找,将Key作为参数传递进该Dictionary对应的哈希函数里面,得到对应元素的索引,再通过这个索引到内部的结构体数组内找到对应的元素
小结
其实这三种存储数据的方式本质上都是数组,利用了数组通过索引查找快速得到对应元素的特点来方便用户对数据的管理。