基于哈希表的 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; } }
运行结果如下:
相关推荐
2、遍历Map.keySet():它是Map中key值的集合,我们可以通过遍历这个集合来 读取Map中的元素; 3、遍历Map.values():它是Map中value的集合,我们可以直接通过这个集合遍历 Map中的值,却不能读取key。
Java集合专题总结:HashMap和HashTable源码学习和面试总结 本文总结了Java集合专题中的HashMap和HashTable,涵盖了它们的源码学习和面试总结。HashMap是一种基于哈希表的集合类,它的存储结构是一个数组,每个元素...
4)了解Map接口及主要实现类(HashMap、TreeMap、HashTable) 二、实验内容及步骤 1、编写程序练习将以下5个Person类的对象放在一个HashSet中。 姓名:张三 身份证号:178880001 姓名:王五 身份证号:178880002 ...
JAVA集合框架学习笔记 JAVA集合框架是Java语言中提供的一种数据结构,用于存储和管理大量数据。它提供了多种接口和实现类,例如Collection、List、Map等,帮助开发者更方便地处理数据。 什么是异常? 在Java中,...
java集合 线程不安全的集合 HashMap的特点 HashMap的长度(容量)为什么要设计成2的幂? HashTable的特点 TreeMap ArrayList的特点 Vector的特点 LinkedList的特点 Set ConcurrentModificationException异常 线程...
Map中元素存放是无序的 HashMap注意事项: 1,HashMap底层维护一个数组,我们向HashMap中所放置的对象实际上是存储在该数组当中; 2,当向HashMap中put一对键值时,它会根据key的hashCode值计算出一个位置,该位置...
Java 集合类详解 Java 集合类是 Java 语言中的一种基本数据结构,用于存储和操作大量数据。集合类可以分为三大类:Collection、List 和 Set。 Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、...
Java 中的 Collection Framework 包括了多种集合类,例如 List、Set、Map 等。List 中包括 ArrayList、LinkedList、Vector 等,Set 中包括 HashSet、LinkedHashSet 等,Map 中包括 HashMap、Hashtable 等。 List、...
Java集合框架是Java语言中最重要、最常用的部分之一,它能够使开发者更方便地处理数据结构。Java集合框架主要包括Collection、List、Set、Map四个接口,它们分别实现了不同的数据结构。 Collection接口是Java集合...
Java 集合详解 Java 集合框架是 Java 语言中最重要的一部分,掌握集合框架可以让开发者更好地进行 Java 编程。下面将详细介绍 Java 集合框架的实现原理和使用方法。 1.1 集合框架概述 Java 集合框架是 Java 语言...
该文档主要详细总结了Java集合的相关知识,包括Collection和Map接口、Collection接口的子接口List和Set接口以及具体的实现类、存储原理等;Map接口的子接口HashMap、LinkedHashMap、TreeMap、Properties等
"Java集合Collection、List、Set、Map使用详解" Java集合是Java编程语言中最基本也是最重要的一部分。能够正确地使用集合类和理解集合的实现原理对于Java程序的开发具有无比的好处。本文将详细解释Java集合的实现...
在Java集合框架中,LinkedList、ArrayList、HashMap、TreeMap等都是非常常用的数据结构。本文将对Java集合框架的源码进行分析,深入探讨其实现原理和机制。 一、LinkedList源码分析 LinkedList是一种以双向链表...
HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来...
java 集合和泛型 1. Map接口 2. HashMap底层实现 3. Hash数据结构和算法 4. 红黑树数据结构和算法
这篇集合总结一共包括十二节,介绍了一些接口和实现类的底层源码以及基本的增加、删除元素等的操作(包括List、Map、Set接口、ArrayList、Vector、LinkedList、HashSet、TreeSet、HashMap、TreeMap等实现类)。...
java中HashMap,LinkedHashMap,TreeMap,HashTable的区别
Java集合框架中的Map接口表示一种键值对(key-value)的数据结构,其中每个元素都包含一个唯一的键和对应的值。在Map中,每个键必须是唯一的,而值可以重复。Map接口提供了一些方法来实现基本的键值对操作,例如添加...
Java 集合类 List-Set-Map 的区别和联系 Java 集合类 List、Set 和 Map 是 Java 语言中最基本的集合类,它们之间存在着紧密的联系和区别。在本文中,我们将对 Java 集合类 List、Set 和 Map 的区别和联系进行详细的...
主要介绍了Java集合之HashMap用法,结合实例形式分析了java map集合中HashMap定义、遍历等相关操作技巧,需要的朋友可以参考下