java集合之Hashtable
java集合之Hashtable
一、构造方法
1.public Hashtable()
public Hashtable() {
this(11, 0.75f);
}
无参构造,初始化一个容量为11,负载因子为0.75的Hashtable
2.public Hashtable(int initialCapacity)
public Hashtable(int initialCapacity) {
this(initialCapacity, 0.75f);
}
初始化一个容量为initialCapacity,负载因子为0.75的Hashtable
3.public Hashtable(int initialCapacity, float loadFactor)
public Hashtable(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal Load: "+loadFactor);
if (initialCapacity==0)
initialCapacity = 1;
this.loadFactor = loadFactor;
table = new Entry<?,?>[initialCapacity];
threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
}
初始化一个容量为initialCapacity,负载因子为loadFactor的Hashtable
4.public Hashtable(Map<? extends K, ? extends V> t)
public Hashtable(Map<? extends K, ? extends V> t) {
this(Math.max(2*t.size(), 11), 0.75f);
putAll(t);
}
初始化一个和参数Map有相同mappings的Hashtable,并将对象t中的所有键值对象拷贝到Hashtable。
二、Hashtable中的数据结构
Hashtable中的数据组的织结构为:hash表+链表,采用拉链法处理hash冲突。
大致呢是这个样子
三、Hashtable中的负载因子
如果没有指定集合的大小,那么Hashtable将默认容量为11,如果指定容量大小,那么集合的大小就是指定的大小(从第三个有参构造中也可以看出),这个和HashMap有很大区别,HashMap的容量必须是2的次幂。而Hashtable中的默认的负载因子和HashMap相同都是0.75。
四、Hashtable为什么是线程安全的
从源码中可以看出,无论是get方法,还是put方法,或是remove方法等,方法上都加了synchronized关键字,所以它能保证多线程下的安全性,但是它的性能和效率也是非常底下的,所以Hashtable基本上被弃用了,因为有同样线程安全,并且高效的ConcurrentHashMap将其代替。
Hashtable还有一个特点就是key和value都不能为null这一点再源码中可以得到体现
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable.
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
@SuppressWarnings("unchecked")
Entry<K,V> entry = (Entry<K,V>)tab[index];
for(; entry != null ; entry = entry.next) {
if ((entry.hash == hash) && entry.key.equals(key)) {
V old = entry.value;
entry.value = value;
return old;
}
}
addEntry(hash, key, value, index);
return null;
}
评论区
请写下您的评论...
猜你喜欢
blog
java集合之ArrayList
java基础
2895
ArrayList的实现是一个动态数组,从源码中也可以看出。这就决定了他的查找效率高,可以直接通过下标访问。但是对于删除和增加元素,需要大量的移动元素,所以插入和删除的效率就很低。ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(Listl)函数返回一个线程安全的ArrayList类。构造方法:ArrayList
blog
java集合之HashSet
java基础
1513
一、HashSet底层实现从HashSet的源码中可以发现,它的底层维护了一个HashMap,在newHashSet的时候,构造方法中其实是new了一个HashMap。privatetransientHashMapE,Objectmap;publicHashSet(){map=newHashMap();}publicHashSet(Collection?extendsEc){map=newHash
blog
java集合之linkedList
java基础
2397
1.linkedList的实现linkedlist的实现是基于数据结构:双向链表。模型图如对于linkedList没有像arrayList一样有扩容的概念。也不需要移动数据。所以对于新增和删除操作add和remove,LinkedList比较占优势。2.双向链表的实现参考:简单双向链表的增删改查3.linkedList的继承关系从继承图中可以看出LinkList实现了List接口,实现了list接
blog
java集合之TreeMap实现原理
java基础
2038
java集合之TreeMap实现原理TreeMap集合的实现其实说简单也简单说复杂也复杂,说简单是因为TreeMap底层实现完全依靠红黑树这个数据结构,相比与HashMap来说TreeMap不用考虑
blog
java集合之HashMap理解和分析
java基础
1378
1.HashMap的构造函数1.publicHashMap()publicHashMap(){this.loadFactor=DEFAULT_LOAD_FACTOR;//allotherfieldsdefaulted}构造一个空的HashMap,初始容量为16,负载因子为0.75,负载因子和它的作用将会在下方解释。2.publicHashMap(intinitialCapacity)publicH
blog
java集合框架总结
java基础
2896
Java集合框架数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。Java提供了几个能有效地组织和操作数据的数据结构,这些数据结构通常称为Java集合框架。在平
算法基础
1878
Java中遍历集合的方式以list集合为例,有三种遍历方式。ListStringlist=newArrayList();
list.add("2");
list.add("2");
list.add
java基础
3963
1.hashCode方法的作用:对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。