7.2 基础知识ArrayMap
2024-08-31 22:05:07
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数组可能也需要移动,在对着两个数组赋值
最新文章
- 链接的热键属性accesskey
- git init 和 git init --bare 的区别
- Linux文件查找工具之find “大宝剑”--转载
- VC++全局变量初始化
- 通过Javascript数组设计一个省市联动菜单
- 一种简单的权限管理ER图设计
- PHP中如何设置error_reporting错误报告级别
- Oracle表、列、约束的操作
- git 查看某个文件的历史修改版本
- 使用docker-compose 大杀器来部署服务 上(转)
- 无法加载协定为“NM3.IClrService”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分
- 使用第三方jar时出现的问题
- JS_正则表达式_使用字符串创建的正则表达式_反斜杠也需要添加转义符
- MySQL三层结构、用户权限、索引设计原则
- Windows上的字符转换之CP_ACP和CP_OEMCP
- HTML:foreach
- MySQl 主从配置实战
- Android Studio INSTALL_FAILED_UID_CHANGED的解决办法
- Python3基础 tuple 通过拆分元素 把元组的数据删除
- Android之Bean属性通知类
热门文章
- tensorflow 语法及 api 使用细节
- Docker+Jenkins持续集成
- 初识Django框架——环境搭建前你需要了解的几点
- 【2017 Multi-University Training Contest - Team 2】	Is Derek lying?
- iOS报错 -pie can only be used when targeting iOS 4.2 or later
- vim-大小写装换
- Mysql数据库存储引擎--转
- WCF 字节数据传输
- [Javascirpt AST] Babel Plugin -- create new CallExpression
- iOS Threading编程指南 官方文档翻译第一篇(序言)