基于哈希表的 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。
4)了解Map接口及主要实现类(HashMap、TreeMap、HashTable) 二、实验内容及步骤 1、编写程序练习将以下5个Person类的对象放在一个HashSet中。 姓名:张三 身份证号:178880001 姓名:王五 身份证号:178880002 ...
java集合 线程不安全的集合 HashMap的特点 HashMap的长度(容量)为什么要设计成2的幂? HashTable的特点 TreeMap ArrayList的特点 Vector的特点 LinkedList的特点 Set ConcurrentModificationException异常 线程...
Map中元素存放是无序的 HashMap注意事项: 1,HashMap底层维护一个数组,我们向HashMap中所放置的对象实际上是存储在该数组当中; 2,当向HashMap中put一对键值时,它会根据key的hashCode值计算出一个位置,该位置...
该文档主要详细总结了Java集合的相关知识,包括Collection和Map接口、Collection接口的子接口List和Set接口以及具体的实现类、存储原理等;Map接口的子接口HashMap、LinkedHashMap、TreeMap、Properties等
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集合之HashMap用法,结合实例形式分析了java map集合中HashMap定义、遍历等相关操作技巧,需要的朋友可以参考下
HashMap是一种常用的哈希表实现,用于存储键值对。它实现了Map接口,并且使用键的哈希值来快速定位和访问值。
16、JAVA集合框架之Map接口、HashMap类、Trelap类、Hashtable类 17、JAVA异常Exception 18、JAVA线程之基础介绍 19、I0流之基本简介 20、I0流之字符流、字节流、转换流、缓冲流、对象流 21,I0流之HIO
掌握List集合、Set集合、Map集合的使用以及Iterator迭代器和foreach循环的使用 了解常用的集合类 熟悉泛型的使用
java集合类 Java中有哪些容器(集合类)? 线程安全和线程不安全的分别有哪些? Map接口有哪些实现类? 描述一下Map put的过程 如何得到一个线程安全的Map? HashMap有什么特点? ConcurrentHashMap是怎么分段分组...
深入Java集合学习系列(四): LinkedHashMap的实现原理
Java集合 HashMap类 IdentityHashMap类的使用 SortedMap类的基本使用 在map中创建自己的类的定义 随机数的集合 等等等等
// java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...
本文档主要讲述的是Java集合框架HashMap说明;HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在。
java集合在日常开发中经常用到,对基础的掌握尤其重要,其中List,Set,Map的作用以及使用的场景和分类描述,其中Arraylist 与 LinkedList 区别,HashSet与TreeSet与LinkedHashSet对⽐,LinkedHashMap和HashMap,...