基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
此实现假定哈希函数将元素正确分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代集合视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)的和成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。
HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,通过调用 rehash 方法将容量翻倍。
通常,默认加载因子 (.75) 在时间和空间成本上寻 求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地降低 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。
如果很多映射关系要存储在 HashMap 实例中,则相对于按需执行自动的 rehash 操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关系能更有效地存储。
HashMap实做Map介面,內部实际使用Hash Table,使用户在常数时间内找到key/value对。
key/value对,简单说,將Map容器物件当作一个有很多房间的房子,每个房间的门有一把钥匙,将物件储存至房间中时,要顺便拥有一把钥匙,下次要取回物件時,就是根据这把钥匙取得。
package com.sg.map; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class TestHashMap { public static void main(String[] args) { //我们用String做所有的测试 HashMap<String, String> map = new HashMap<String, String>(); //允许null作为key map.put(null, "测试null的键"); showMap(map); //先清空所有map的内容 //map.clear(); // 当然也允许null的Value了 map.put("测试null的值", null); showMap(map); // 对应的都是null // 注意这个null替换了前面的"Null Key"字符串的value了 // 也就是后面的相同的key会替换以前的key对应的value // 返回值为以前的值 System.out.println("以前的值="+map.put(null, null)); showMap(map); // 其它的和Map相同的操作就不介绍了 // 这里介绍一下Hash的特殊的地方 // 大家使用时一定要注意,其实和HashSet有相同的地方 // 那就是通过Key的Hashcode进行查找 Map<Person, String> hashMap = new HashMap<Person, String>(); Person p1 = new Person("第一个人"); Person p2 = new Person("第二个人"); Person p3 = new Person("第三个人"); hashMap.put(p1, "11111111"); hashMap.put(p2, "22222222"); // 我们来测试读取第一个 System.out.println("第一个人:"+hashMap.get(p1));// // 我们尝试修改p1对象的name p1.setName("第一个人-->修改后的"); //再次取第一個的值 //沒有取到值null System.out.println("修改后的第一个人:"+hashMap.get(p1)); // 总结 // HashSet一定要注意hashCode的问题 // 对于String等不可修改类无所谓 // 但对于普通类,一定要注意其hashCode的实现方式 // 千万不要让一个类的hashCode随便变动 // 如果非得更新,应该先删除,后修改 //清空map hashMap.clear(); //刪除键为p2对象 hashMap.remove(p2); p2.setName("第二个-->修改后的"); hashMap.put(p2, "22222222-------"); showMap(hashMap); } public static void showMap(Map map){ Iterator iterator = map.keySet().iterator(); Object key ; while(iterator.hasNext()){ key = iterator.next(); System.out.print("key:"+key+"-->"+"value:"+map.get(key)+" "); } System.out.println(); } } class Person{ private String name; public Person() { } public Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } //注意这里使用name的hashCode作为类的hashCode @Override public int hashCode() { return name.hashCode(); } @Override public String toString() { return name; } }
运行结果如下:
相关推荐
在Java编程语言中,集合框架是开发者日常工作中不可或缺的一部分,HashMap作为其中的重要成员,它的实现原理对于理解Java性能优化和数据结构有深远的意义。HashMap是一个基于哈希表的数据结构,它实现了Map接口,...
在"深入Java集合学习系列(二):ArrayList实现原理_尚硅谷_张晓飞.pdf"中,你可以了解到ArrayList的内部结构、扩容机制以及其在不同操作下的性能特点。 其次,HashMap是Java中处理键值对的数据结构,它实现了Map接口...
本主题聚焦于易语言中的面向对象编程,特别是模仿Java集合框架的List和Map接口的实现。这些数据结构在编程中扮演着核心角色,用于组织和管理数据。 首先,让我们深入了解易语言的面向对象编程概念。面向对象编程...
Map集合是Java集合框架的一部分,它允许我们以键(Key)-值(Value)对的形式存储数据。在Map中,键是唯一的,而值可以重复。Java提供了多种Map接口的实现,如HashMap、TreeMap、LinkedHashMap等,它们各有不同的...
2、遍历Map.keySet():它是Map中key值的集合,我们可以通过遍历这个集合来 读取Map中的元素; 3、遍历Map.values():它是Map中value的集合,我们可以直接通过这个集合遍历 Map中的值,却不能读取key。
Java集合专题总结:HashMap和HashTable源码学习和面试总结 本文总结了Java集合专题中的HashMap和HashTable,涵盖了它们的源码学习和面试总结。HashMap是一种基于哈希表的集合类,它的存储结构是一个数组,每个元素...
Map接口则是Java集合框架的一部分,它提供了键值对的数据存储方式,方便数据的存取。将Pojo对象转换为Map,可以简化数据处理过程,尤其是在JSP页面上展示数据时,Map的灵活性更加突出。本文将详细介绍如何实现Java中...
`Map`接口是Java集合框架的一部分,它提供了基于键值对的数据存储方式。常见的实现类包括`HashMap`(无序)、`LinkedHashMap`(有序)、`TreeMap`(排序)等。Map的主要方法包括`put`、`get`、`remove`、`...
【Java Map 集合类简介】 在Java的`java.util`包中,集合类扮演着重要的角色,其中List和Map是最为常见的两种。List的实现例如ArrayList和Vector,它们都是可变大小的列表,适合存储和操作各种类型对象的序列。特别...
在深入学习Java集合时,我们需要特别关注HashMap和HashTable这两个重要的类。虽然它们都是用于存储键值对的数据结构,但它们在设计和使用上有显著的区别。 HashMap是Java 1.2引入的,它是Map接口的一个实现,提供了...
本资源详细介绍了 Java 中的 HashMap 类,包括其实现机制、Hash 存储机制、集合存储机制等方面的知识点。 1. HashMap 和 HashSet 的关系 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,虽然...
尽管Java提供了内置的Map接口(如HashMap、TreeMap等),但有时为了学习或特定需求,我们可能会用基本类型的数据结构来实现Map。这篇博客文章(链接已省略)可能介绍了如何通过二维数组实现这个概念。 首先,我们...
Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了一组高级的数据结构,使得开发者能够更方便地管理和操作对象。在本次实验中,我们主要关注了三个主要的集合接口:Set、List和Map,以及它们的一些常见...
通过这样的学习方式,不仅可以加深对Java集合的理解,还能提高问题解决的能力。 总结来说,Java集合框架提供了丰富的数据结构和算法,适应各种场景下的数据存储需求。理解并熟练掌握这些集合类的特性和使用方法,...
Map 是 Java 集合框架中的一个接口,用于存储键值对,根据键可以获取值。Map 中的键不允许重复,但值可以重复。在 Java 中,HashMap、LinkedHashMap、TreeMap 都实现了 Map 接口,都是 Map 的子类,每个子类都有其...
Java中的Map接口是Java集合框架的重要组成部分,它用于存储键值对的数据结构,其中每个键都是唯一的,并且与一个值相关联。Map集合不同于List,因为它不维护元素的顺序,而是通过键来访问其对应的值。本文将详细介绍...
JAVA集合框架学习笔记 JAVA集合框架是Java语言中提供的一种数据结构,用于存储和管理大量数据。它提供了多种接口和实现类,例如Collection、List、Map等,帮助开发者更方便地处理数据。 什么是异常? 在Java中,...
适用人群:适合具有一定Java基础知识的学习者,尤其是想深入了解Java集合框架的开发者和技术人员。 使用场景及目标:① 学习者希望通过此文全面掌握Map接口及其主要实现类的功能与应用场景;② 开发人员希望在实际...
根据提供的文件内容,我们将详细探讨Java集合框架中的ArrayList的实现原理以及与之相关的HashSet的实现。由于内容中并未直接涉及ArrayList的实现原理,但给出了HashSet的相关信息,我们先从这部分开始。 首先,...