基本概念
- PHP中数组是个强大的数据结构,堪称一绝,数组、关联数组一网打尽,既可以是连续的数组也可以是存储key=>value映射的map。
- PHP使用HashTable来存储键-值对,但是又对HashTable进行了一些额外的设计来保证数组的有序,维护着K-V的一种对应关系,可以快速地根据键来检索到值,而且查找地时间复杂度为O(1)
- HashTable示意图:
- key: 可以是数字也可以是字符串
- value:目标数据
- bucket:桶,hashtable地存储单元,一个用来存储k-v的容器
- slot: 槽,一个slot可以拥有一个bucket或者多个
- 当存在hash冲突的时候,PHP采用的是链地址法来解决,将同一个slot中的bucket通过链表连接起来(如图所示)
- PHP中的hashtable的改进
- 首先是再桶中新增h字段
- 再把hash函数拆分为hash1和hash2
- hash1:将key映射为h值
- hash2:将h值映射为slot中的索引值 - 这样桶中的key全部都是字符串的key
为什么要进行拆分?
①将key可能为字符串也可能为数字的情况分开,桶中的h为数字的key,key为字符串的key
②用hash1生成的hash值(h)可以加快字符串key之间的比较速度,由于计算出来的hash值是不相同的,所以每次进行插入查找不用先检查key是否有重复,所以可以用来提高速度
PHP7中的数组
未完待续