HashTable是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。
HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。
如果很多映射关系要存储在 HashMap 实例中,则相对于按需执行自动的 rehash 操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关系能更有效地存储。
注意,此实现不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。(结构上的修改是指添加或删除一个或多个映射关系的任何操作;仅改变与实例已经包含的键关联的值不是结构上的修改。)这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedMap
方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的非同步访问,如下所示:
Map m = Collections.synchronizedMap(new HashMap(...));
由所有此类的“collection 视图方法”所返回的迭代器都是快速失败 的:在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器本身的 remove 方法,其他任何时间任何方式的修改,迭代器都将抛出ConcurrentModificationException
。因此,面对并发的修改,迭代器很快就会完全失败,而不冒在将来不确定的时间发生任意不确定行为的风险。
注意,迭代器的快速失败行为不能得到保证,一般来说,存在非同步的并发修改时,不可能作出任何坚决的保证。快速失败迭代器尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的程序的做法是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。
此类是 Java Collections Framework 的成员。
package org.mars.collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* <strong>About HashMap.</strong><br/>
* @author Mars & W.M <br/>
* @version Fri Feb 25 03:35:19 GMT 2011
*/
public class MapKen {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws InterruptedException{
int initialCapacity = 4;//初始容量
float loadFactor = 0.75F;//加载因子
HashMap<Object,Object> hm = new HashMap<Object,Object>(initialCapacity,loadFactor);
hm.put("rose", "A255KQ");
hm.put("jack", "C365LW");
hm.put("mars", "J226VX");
hm.put("andy", "P616ZS");
hm.put("tony", "M821PN");
hm.put("kate", "U903IE");
//允许null键
hm.put(null, "nothing");
//允许null值
hm.put("none", null);
//经过封装就可以实现同步了
Map<Object,Object> m = Collections.synchronizedMap(new HashMap<Object,Object>());
System.out.println(hm.size());
hm.remove("kate");
System.out.println(hm.size());
}
}
分享到:
相关推荐
本文将详细介绍 HashMap 类的使用,包括其常用方法、特点和应用场景。 一、HashMap 的基本概念 HashMap 是基于哈希表的 Map 接口实现,提供了快速查找和存储数据的能力。它允许使用 null 值和 null 键,不保证映射...
### 由HashSet谈重用 #### 一、引言 重用是软件工程中的一个重要概念,在面向对象编程中尤其重要。传统的代码重用方法包括复制粘贴、过程和函数的复用,但在面向对象编程中,重用的概念得到了进一步的发展和完善。...
谈到HashMap的扩容机制,当容器中的元素数量达到一定阈值时,就会触发扩容操作。JDK 1.7之前,扩容过程是创建一个新的数组,然后将旧数组中的所有元素重新计算哈希值后放入新数组。而在JDK 1.8中,当同一个哈希值的...
### 浅谈Java集合框架 Java集合框架是一个用于存储、操作和检索一组对象的强大工具集。集合框架的设计目的是为了提供一套高效且灵活的数据结构来满足不同的应用需求。本篇文章将详细探讨Java集合框架中的一些核心...
如果需要随机插入和删除,考虑使用 HashSet 或 HashMap。 - 是否需要排序:如果需要保持元素排序,使用 TreeSet 或 TreeMap。 - 空间效率:HashSet 和 HashMap 相比于 TreeSet 和 TreeMap,通常占用更少的空间。 ...
在使用Java集合框架时,重写hashCode()和equals()方法是非常重要的,尤其是在使用Set集合时。这两个方法决定了集合如何识别元素的唯一性。如果使用不当,可能会导致相同元素无法被正确识别,从而影响集合的操作结果...
1. 对于List,可以使用Collections.sort()方法进行排序,但仅限于元素是可比较类型(如实现了Comparable接口的类)或者传入自定义的Comparator。 2. 实现Comparable接口,重写compareTo()方法,用于定义对象间的比较...
- `Complexdata`方法中的代码不完整,但它表明我们可以操作HashMap来构建一个复杂的JSON数据结构。 在使用Fastjson时还需要注意以下几点: - Fastjson在处理日期格式时默认是按照时间戳进行序列化的,如果需要...
在Java编程语言中,`Map`接口是集合框架的一部分,它提供了一种存储键值对数据结构的方法。Map接口定义了映射关系,其中每个键(Key)都是唯一的,并且与一个值(Value)相关联。它替代了早期的`Dictionary`类,因为...
总的来说,“浅谈Java程序设计在线开放课程”是一个全面介绍Java编程的教程,它不仅教授语言本身,还涵盖了软件开发的实践技巧和工具使用。无论你是编程新手还是希望提升Java技能的开发者,这样的课程都能提供有价值...
Collection 接口是最基本的集合接口,声明了适用于 Java 集合(只包括 Set 和 List)的通用方法。Set 和 List 都继承了 Collection 接口。 Collection 接口的方法: 1. boolean add(Object o):向集合中加入一个...
6. **缓存雪崩**:多个缓存同时失效,导致系统压力骤增,可以通过加盐、设置不同过期时间、使用哨兵监控等方法避免。 7. **源码分析**:文章可能深入到具体缓存库的源码层面,如分析Guava Cache的工作原理,或者...
Java集合框架是Java编程语言中一个至关重要的组成部分,它为数据...熟练掌握其原理和使用方法,对于提高代码质量和效率具有重要意义。通过深入学习和实践,我们可以更好地理解和利用这个框架,解决各种复杂的编程问题。
同时,需要注意的是,如果自定义了类并且想要比较对象内容,记得要同时重写`equals()`和`hashCode()`方法,以保持两者的一致性,这在使用HashMap、HashSet等容器时尤为重要。 此外,当我们涉及到数组或者集合时,`...
4. **集合框架**:了解ArrayList、HashMap等常用集合类的使用方法。 5. **输入/输出(I/O)**:掌握文件读写的基本操作,熟悉InputStream、OutputStream等I/O流类。 6. **线程**:理解线程的概念,学会创建和管理线程...
Hashtable类是Java Collections Framework的一部分,与HashMap有着密切的关系,但与HashMap不同的是,Hashtable是同步的,因此在多线程环境中更安全,不过这也会带来一些性能开销。 Hashtable的关键特性如下: 1. ...
codeceo 首页问答热门文章RSS订阅 文章首页 Java JavaScript ... iOS ...看过上文的还记得在 HashMap 扩容的时候会调用 resize() 方法,就是这里的并发操作容易在一个桶上形成环形链表;这样当获取...
当使用put方法向HashMap中存入键值对时,HashMap会调用key对象的hashCode()方法来计算hashcode,这个hashcode用于定位bucket的位置来存储值对象。get方法的使用原理与put类似,它通过调用key对象的hashCode()方法和...