1、android源码中维护有键值对,通过键可以找到值

  Java中Object是所有类的父类,对于键值对的保存如果使用个ObjectArray数组,比如N个位置存放键,N+1的位置就存放值,那么如果键值对很多是,查找效率不高。

  在android源码中可以查看ArrayMap.java文件,其维护了键值对,其原理是通过键(key值)得到一个hash值,在根据hash值来确定index。

  ArrayMap类有两个数字mArray和mHashes,mArray里面就是存放的键值对,比如N个位置存放键,N+1的位置就存放值;mHashes存放的是key值的hash值,这个hash值从小到大排列,通过key值算出hash值,在mHashes数组中通过二分法查找并返回所有的index1信息,可能有多个相等的hash值,根据index1的值乘以2得到mArray中对应的index2,如果mHashes数组中有多个相同的hash,把key值取出来比较,index2+1就是值了,注意,虽然hash值是从小到到排列的,但是其和键值对是一一对应的。

  hash值和键值对一一对应的原因是存放的时候,根据key计算(indexofkey(k))是index,如果index大于等于0,说明mArray里面已经存放了键值对,这个时候直接替换值就可以,如果index小于0,对index取反,取法后的值除2就是hash值在mhashes数组中的位置,这个index可能在mArray数组的中间,需要移动后面的键值对,或者mArray需要扩容,mhashes数组可能也需要移动,在对着两个数组赋值

最新文章

  1. 链接的热键属性accesskey
  2. git init 和 git init --bare 的区别
  3. Linux文件查找工具之find “大宝剑”--转载
  4. VC++全局变量初始化
  5. 通过Javascript数组设计一个省市联动菜单
  6. 一种简单的权限管理ER图设计
  7. PHP中如何设置error_reporting错误报告级别
  8. Oracle表、列、约束的操作
  9. git 查看某个文件的历史修改版本
  10. 使用docker-compose 大杀器来部署服务 上(转)
  11. 无法加载协定为“NM3.IClrService”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分
  12. 使用第三方jar时出现的问题
  13. JS_正则表达式_使用字符串创建的正则表达式_反斜杠也需要添加转义符
  14. MySQL三层结构、用户权限、索引设计原则
  15. Windows上的字符转换之CP_ACP和CP_OEMCP
  16. HTML:foreach
  17. MySQl 主从配置实战
  18. Android Studio INSTALL_FAILED_UID_CHANGED的解决办法
  19. Python3基础 tuple 通过拆分元素 把元组的数据删除
  20. Android之Bean属性通知类

热门文章

  1. tensorflow 语法及 api 使用细节
  2. Docker+Jenkins持续集成
  3. 初识Django框架——环境搭建前你需要了解的几点
  4. 【2017 Multi-University Training Contest - Team 2】 Is Derek lying?
  5. iOS报错 -pie can only be used when targeting iOS 4.2 or later
  6. vim-大小写装换
  7. Mysql数据库存储引擎--转
  8. WCF 字节数据传输
  9. [Javascirpt AST] Babel Plugin -- create new CallExpression
  10. iOS Threading编程指南 官方文档翻译第一篇(序言)