美文网首页
PHP 数组的底层实现

PHP 数组的底层实现

作者: lotusgrm | 来源:发表于2020-10-02 21:44 被阅读0次

PHP 数组的底层主要是通过 HashTable 实现,HashTable 通过映射函数或者散列函数将 String Key 转换成一个普通的数字下标,然后再将 Value 值存储到下标对应的数组元素中

HashTable 主要包含两部分:1.存储元素的数组 2.散列函数或者映射函数

随机访问
如果我们指定一个 Key=>Value 的映射关系,Key 是一个 String 类型的,则先通过 Time 33 算法将 String 转换成一个 Int 整型,然后再通过 PHP 里面特定的散列算法映射成 Bucket 数组中的一个下标,将 Value 值存储到对应的下标元素中,当我们通过 Key 访问数组元素时,只需要再通过相同的算法计算出对应的 Key,就能实现随机访问数组元素

顺序访问
存储在 HashTable 中的数组是无序的,但是 PHP 中的数组是有序的,为了实现 HashTable 的有序性,PHP 引入了一个中间映射表,该表是一个大小和 Bucket 数组相同的数组,数组中存放的是整形数据,主要用于存放元素实际存储的 Value 的下标值,当引入中间映射表之后,Bucket 中的数据是有序的,而中间映射表中的数据是无序的,当我们顺序访问的时候只需要遍历 Bucket 中的数据即可

Hash 冲突
PHP 解决 Hash 冲突采用的是链地址法,将出现冲突的 Bucket 串成链表,这样通过中间映射表映射出来的就不再是一个元素而是一个链表,通过散列函数定位到对应的 Bucket 链表时,需要遍历链表,逐个对比 key 值,直至找出对应的目标值

PHP 实现扩容
1.当删除的元素所占比例超出阈值的时候,则需要移除已经被逻辑删除的 Bucket,将后面的 Bucket 补位到前面,因为 Bucket 的下标发生了变动,所以需要更新每元素在中间映射表中实际存储的下标值
2.当没有超出阈值的时候,PHP 会申请一个大小是原来两倍的新数组,并将旧数组中的数据复制到新数组中,因为数组长度发生了变化,所以 key->value 的映射关系需要重新计算,这个就是重建索引

相关文章

  • php数组底层实现

    最近面试遇到这个,因为自己已经开始自我嫌弃php了,之前准备的时候就没看这块了,现在被问了主语言,不会就他喵的很尴...

  • PHP 数组的底层实现

    PHP 数组的底层主要是通过 HashTable 实现,HashTable 通过映射函数或者散列函数将 Strin...

  • JDK1.8关于HashMap的变化

    底层实现原理 ++1.7++HashMap底层是使用数组+链表实现 ++1.8++HashMap底层是使用数组+链...

  • ArrayList和LinkedList的区别

    1.底层实现层面: ArrayList底层是由数组实现,是一个动态数组,而LinkedList底层是一个双向链表。...

  • 2018.01.03 周三--【技术文章】《PHP扩展及核心》

    一、主要内容: 1️⃣php扩展的概念和底层实现 2️⃣编写一个php扩展的步骤 3️⃣php底层,Zend 引擎...

  • php哈希冲突攻击解析

    一段攻击代码 插入结果 php5(5.2) php7 php 数组的实现 php 中的数组是 php 中非常好用的...

  • ArrayList

    基本使用 问题 Q:ArrayList底层实现是什么?A:底层实现是数组,ArrayList内部定义了一个数组来存...

  • ArrayList和LinkedList的区别

    ArrayList底层由数组实现,LinkedList底层由链表实现。 通常来说:ArrayList在随机访问元素...

  • PHP Array

    php的存储在内部是通过hashtable实现的,所以可以认为PHP的数组只有关联数组,且数组有很多用途:数组、栈...

  • ArrayList和LinkedList底层

    ArrayList底层实现是数组object,而LinkedList底层实现是双向链表(JDK1.7开始)。 故A...

网友评论

      本文标题:PHP 数组的底层实现

      本文链接:https://www.haomeiwen.com/subject/bfliuktx.html