Android HashTable
1.HashTable
HashTable和HashMap一样是一个散列链表,它的容器是一个数组,而每一个数组中的元素都是一个单向的链表。它是Map的一个同步的实现,不支持空key的情况。
2.基本参数
DEFAULT_INITIAL_CAPACITY:默认容量
DEFAULT_LOAD_FACTOR:默认的负载因子,表示散列链表的使用度,数越大那么使用度越高。
entry:链表对象
table:链表的容器是一个数组
threshold:临界点,当达到这个临界点的时候进行扩容,它等于负载因子*容量大小
3.创建一个HashTable
①如果容量是0的话,会创建一个空的HashTable
②如果不是0,会根据传入的容量计算一个n^2的合理容量大小的数组减小碰撞
public Hashtable(int capacity) {
if (capacity == 0) {
@SuppressWarnings("unchecked")
HashtableEntry[] tab = (HashtableEntry[]) EMPTY_TABLE;
table = tab;
threshold = -1; // Forces first put() to replace EMPTY_TABLE
return;
}
if (capacity < MINIMUM_CAPACITY) {
capacity = MINIMUM_CAPACITY;
} else if (capacity > MAXIMUM_CAPACITY) {
capacity = MAXIMUM_CAPACITY;
} else {
capacity = Collections.roundUpToPowerOfTwo(capacity);
}
makeTable(capacity);
}
private HashtableEntry[] makeTable(int newCapacity) {
@SuppressWarnings("unchecked")
HashtableEntry[] newTable = (HashtableEntry[]) new HashtableEntry[newCapacity];
table = newTable;
threshold = (newCapacity >> 1) + (newCapacity >> 2); // 3/4 capacity
return newTable;
}
4.HashTable的函数接口
HashTable的重要函数都是同步方法
synchronized void clear()
synchronized Object clone()
boolean contains(Object value)
synchronized boolean containsKey(Object key)
synchronized boolean containsValue(Object value)
synchronized Enumeration elements()
synchronized Set> entrySet()
synchronized boolean equals(Object object)
synchronized V get(Object key)
synchronized int hashCode()
synchronized boolean isEmpty()
synchronized Set keySet()
synchronized Enumeration keys()
synchronized V put(K key, V value)
synchronized void putAll(Map map)
synchronized V remove(Object key)
5.HashTable的插入
①它是不支持key,value==null的
②它会根据key的hash值以及数组的长度计算元素在数组中的位置,如果有一样的元素那么会覆盖之前的元素
③如果容量已满的话那么会进行扩容
④在数组的当前位置插入元素,如果该位置有元素,将新元素放在首位将并且next指向旧的元素形成链表
⑤查询是获取当前index位置的entry,遍历entry是否有相同元素。
public synchronized V put(K key, V value) {
if (key == null) {
throw new NullPointerException("key == null");
} else if (value == null) {
throw new NullPointerException("value == null");
}
int hash = Collections.secondaryHash(key);
HashtableEntry[] tab = table;
int index = hash & (tab.length - 1);
HashtableEntry first = tab[index];
for (HashtableEntry e = first; e != null; e = e.next) {
if (e.hash == hash && key.equals(e.key)) {
V oldValue = e.value;
e.value = value;
return oldValue;
}
}
// No entry for key is present; create one
modCount++;
if (size++ > threshold) {
rehash(); // Does nothing!!
tab = doubleCapacity();
index = hash & (tab.length - 1);
first = tab[index];
}
tab[index] = new HashtableEntry(key, value, hash, first);
return null;
}
6.HashTable的查询
①根据key的hash值和数组长度计算出元素在数组的index,遍历entry,查询符合条件的元素public synchronized V get(Object key) {
int hash = Collections.secondaryHash(key);
HashtableEntry[] tab = table;
for (HashtableEntry e = tab[hash & (tab.length - 1)]; e != null; e = e.next) {
K eKey = e.key;
if (eKey == key || (e.hash == hash && key.equals(eKey))) {
return e.value;
}
}
return null;
}
7.HashTable的优劣
①首先相对于HashMap它是线程安全的,可以在多线程共享数据
②因为它的主要方法都加入了synchronized关键词,所以在单一线程上的性能不如HashMap
Android HashTable相关推荐
- android高级编程-android高级应用
android高级应用>>> 第一阶段 程序员基本素质养成 程序员所需要具备的12条职业素质 让学员初步了解和审视自己所应该具备的职业素质.并且我们会在授课中随时训练和贯彻这样的素质 ...
- Android之ListActivity(一):布局与数据绑定
Android中的列表,当然也可以用ListView来完成所需要的功能,用法是一样的. 废话不说,来关键的. LiveActivity本身继承了关于List操作的众多接口,我们可以方便的重写这些操作中 ...
- android studio字符串转整型,Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)...
在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降.那么怎么才能找出这些埋在程序里 ...
- Android的Adapter用法总结
Android之Adapter用法总结 1.Adapter概念 定义为将一个类的接口变换成客户端所期待的一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 在androi ...
- android笔试题整理
笔试题整理 今天接到消息,说下个星期三.会陆陆续续的有公司来学校找暑假实习生.还没准备好啊,这就来啦?麻蛋 我慌的要死啊~ 1.Math.round(11.5)等于多少(). Math.round(- ...
- Android调用WebService系列之对象构建传递
上一篇我们讲了如何封装Android调用WebService的能力,把上一章的类加入我们便有了与WebService通讯的能力.往往我们会遇到WebService调用是通过对象来进行实际交互调用的.于 ...
- 【大厂攻略】Android开发3年当了2年咸鱼每天CRUD,复习2个月幸运拿下美团offer!
前言 这是一个非常要好的朋友真实经历,觉得还挺励志的,希望能帮助到一些正在迷茫的同学. 是去美团送外卖了?有配电瓶车吗? 答:亲,有配的哦,开起来贼顺滑.啊呸,说啥了,咱进的是正儿八经的技术部门. 咸 ...
- 工作三年的Android程序员 跳槽到“阿里“的面试经验分享
前言 工作三年,你可能会迷茫,要么觉得自己怀才不遇,要么觉得自己迷失方向,也可能觉得自己意气风发,不管怎么样,自己已经开始思考自己的人生了,事实上,很多工作三年的人就第一次做出了自己的选择,也就是换一 ...
- 2016BAT+华为+滴滴+搜狗Android开发岗面试问题整理
实习面了阿里和腾讯,校招面了腾讯,百度,华为,搜狗和滴滴,总结一下遇到的面试知识点.知识点是散的而且也比较容易掌握,难点是这些知识点的应用中并且深刻理解.实习面试的时候阿里通过,腾讯一面跪(内推和实习 ...
最新文章
- JavaServer Faces技术
- Android Context应用上下文详解
- 快速幂,矩阵乘法,矩阵快速幂
- 在Ubuntu上安装RealPlayer的方法
- 万网绑定二级域名_Hexo+yilia主题网站绑定个性域名
- 教你怎么使用Jmail发送匿名的邮件(不要身份认证)
- imutils.path
- mysql l查看历史等锁信息_mysql查看锁等信息SQL
- java统计计数_java – 使用LongAdder计算统计计数器的最大值?
- JSON 解析之 FastJson
- 分享一个 集外文论文检索、文字识别、翻译、文章管理于一体的软件
- matlab图像取样和量化,数字图像基础之图像取样和量化
- 全球与中国SS-OCT激光市场深度研究分析报告
- minio更换端口启动
- 火山PC自绘高级表格及超级列表框
- C++ 实验二 NO.4 字符串合并:输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数,使合并后的字符串,仍然是从小到大排列。
- Redis缓存一致性问题解决方案
- 拼多多商品APi、商品详情、产品页面信息接口
- html页面自适应是什么意思,什么是自适应网页设计
- 计算机如何增加网络地址,如何添加网络打印机到电脑
热门文章
- Android 8.0 WiFi Ap 热点控制接口
- 大数据量的五种处理方式
- 翻译:SMPL-X模型与SMPLify-X方法
- 项目管理必看书籍,全部打包送给你
- Alpine介绍与apk的基本使用
- 陕西万德信息科技面试题
- html调用手机陀螺仪,前端基于THREE.js的3D全景,支持鼠标控制和手机陀螺仪的切换...
- 历年茅台计算机招聘考试真题,2020贵州茅台招聘考试试题及答案(7)
- 敏涵控股集团董事长刘敏: “匠心精神”的专业引路人
- 自定义控件 仿微信朋友圈文字展开全文功能