HashMap<K, V>泛型类

HashMap<K, V>也是一个很实用的类,HashMap<K, V>对象采用散列表这种数据结构存储数据,习惯上称HashMap<K, V>对象为散列映射对象。散列映射用于存储键值数据对,允许把任何数量的键值数据对存储在一起。键不可以发生逻辑冲突,两个数据项不要使用相同的键,如果出现两个数据项对应相同的键,那么先前散列映射中的键值对将被替换。散列映射在它需要更多的存储空间时会自动增大容量。例如,如果散列映射的装载因子是0.75,那么当散列映射的容量被使用了75%时,它就把容量增加到原来容量的2倍。对于数组和链表这两种数据结构,如果要查找它们存储的某个特定的元素却不知道它的位置,就需要从头开始访问元素直到找到匹配的为止;如果数据结构中包含很多的元素,就会浪费时间。这时最好使用散列映射来存储要查找的数据,使用散列映射可以减少检索的开销。

1、HashMap<K, V>对象

HashMap<K, V>泛型类创建的对象称为散列映射。例如:

HashMap<String, Student> hashtable = HashMap<String, Student>();

那么,hashtable 就可以存储键值对数据,其中的键必须是一个String对象,键对应的值必须是Student对象。hashtable可以调用public V put(K key, V value)方法将键值对数据存储放到散列映射中,同时返回键所对应的值。

2、常用方法

HashMap<K, V>  泛型类的常用方法如下。

①public void clear() —— 清空散列映射

②public Object clone() —— 返回当前散列映射的一个克隆

③public boolean containsKey(Object key) —— 如果散列映射有键值对使用了参数指定的键,方法返回true,否则返回false

④public boolean containsValue(Object value) —— 如果散列映射有键值对的值是参数指定的值,方法返回true,否则返回false

⑤public V get(Object key) —— 返回散列映射中使用key作为键的键值对的值

⑥public boolean isEmpty() —— 如果散列映射不含任何键值对,方法返回true,否则返回false

⑦public V remove(Object key) —— 删除散列映射中键为参数指定的键值对,并返回键对应的值

⑧public int size() —— 返回散列映射的大小,即散列映射中键值对的数目

3、遍历散列映射

如果想获得散列映射中所有键值对中的值,首先使用

public Collection<V> values()

方法返回一个实现Collection<V>接口类创建的对象的引用,并要求将该对象的引用返回到Collection<V>接口变量中。values()方法返回的对象中存储了散列映射中所有键值对中的值,这样接口变量就可以调用类实现的方法,如获取Iterator对象,然后输出所有的值。

例:使用散列映射的常用方法,并遍历散列映射

package com.chindroid.date;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;

public class TestHashMap {

	public static void main(String[] args) {
		Book book1 = new Book("7302033218", "C++基础教程");
		Book book2 = new Book("7808315162", "Java编程语言");
		Book book3 = new Book("7302054991", "J2ME无线设备编程");

		HashMap<String, Book> table = new HashMap<String, Book>();
		table.put(book1.ISBN, book1);
		table.put(book2.ISBN, book2);
		table.put(book3.ISBN, book3);

		String key = "7808315162";
		if(table.containsKey(key)){
			System.out.println(table.get(key).name + "有货");
		}

		Book b = table.get("7302054991");
		System.out.println("书名:"+b.name+", ISBN:"+b.ISBN);

		int number = table.size();
		System.out.println("散列映射中有"+number+"个元素:");

		Collection<Book> collection = table.values();
		Iterator<Book> iter = collection.iterator();
		while(iter.hasNext()){
			Book te = iter.next();
			System.out.printf("书名:%s, ISBN: %s\n", te.name, te.ISBN);
		}
	}
}

程序运行结果如下

Java编程语言有货

书名:J2ME无线设备编程, ISBN:7302054991

散列映射中有3个元素:

书名:C++基础教程, ISBN: 7302033218

书名:J2ME无线设备编程, ISBN: 7302054991

书名:Java编程语言, ISBN: 7808315162

4、HashMap<E>泛型类实现的接口

HashMap<E>泛型类实现了泛型接口Map<E>,其中的绝大部分方法都是Map<E>接口方法的实现。编程时,可以使用接口回调技术,即把HashMap<E>对象的引用赋值给Map<E>接口变量,那么接口就可以调用类实现的接口方法。

时间: 2024-10-21 16:13:57

HashMap<K, V>泛型类的相关文章

Java集合源码分析(七)HashMap&lt;K, V&gt;

一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同.)此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 值得注意的是HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap. Map map = Coll

常见方法源码分析:HashMap的put(K k,V v)

version:JDK1.8 一.调用内部的另一个方法: final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) 将结果直接返回 源码: 1 public V put(K key, V value) { 2 return putVal(hash(key), key, value, false, true); 3 } 二.那么进入putVal这个方法看看内部是怎么实现的 注:当前对象就是需要插入的H

consul 配置---K/V存储及ACL

consul 配置-K/V存储及ACL 标签(空格分隔): consul Consul简介 安装及运行 K/V存储 Java案例(基于Spring boot) ACL配置 小结 1.Consul简介 1.1 consul的作用 服务发现 Consul clients提供服务(例如API) 其他的client发现服务的提供者(通过DNS或http,应用可以轻松的发现他们所依赖的服务) 健康检查 Key-Value存储操作 动态配置 leader选举 feature flagging coordin

关于jsp利用EL和struts2标签来遍历ValueStack的东东 ------&gt; List&lt;Map&lt;K,V&gt;&gt; 以及 Map&lt;K,&lt;List&lt;xxx&gt;&gt;&gt; 的结构遍历

//第一种结构Map<K,<List<xxx>>> <body> <% //显示map<String,List<Object>> Map map = new HashMap<String,List<String>>(); List list = new ArrayList<String>(); list.add("list1-1"); list.add("list

简单组合java.util.Map&lt;K,V&gt;实现Map&lt;K,P,V&gt;

java.util.Map<K,V>为单键对单值,有时需要双键对单值,因此基于Map<K,V>可以简单实现一个Map<K,P,V>. 接口定义:下载 Java代码 package cc.lixiaohui.demo.javassist.proxy.util; import java.util.Collection; import java.util.Set; /** * 两个键的复合map * <pre> * key------+ *          |-

Map.Entry&lt;K,V&gt;分析

一.好处 你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦? 1 Set keys = map.keySet( ); 2 if(keys != null) { 3 Iterator iterator = keys.iterator( ); 4 while(iterator.hasNext( )) { 5 Object key = iterator.next( ); 6 Object value = map.get(key); 7 } 8 } 二.用法 使用Map.Entry类,你可

多个List&lt;Map&lt;K,V&gt;&gt;整合去重--初次尝试

工作中遇到了,多个List<Map<K,V>>整合去重排序的问题,自己用比较笨拙的方法处理,希望大家有新的想法分享一下: 步骤1.整合Map集合的key值,去重后放到一个List集合里 List<Map<String, Object>> touping = new ArrayList<Map<String, Object>>(); List<Map<String, Object>> zong = new Arr

基础才是重中之重~Dictionary&lt;K,V&gt;里V的设计决定的性能

回到目录 字典对象Dictionary<K,V>我们经常会用到,而在大数据环境下,字典使用不当可能引起性能问题,严重的可能引起内在的溢出! 字典的值建议为简单类型,反正使用Tuple<T> 字典的键在查找时,时间复杂度为O(1),性能不会有任何问题,所以不要愿望它 下面代码是对500万的字典进行测试,首先赋值,然后取出一个随机机,性能在毫秒级 static void Draw() { int count = 5000000; Console.WriteLine("test

C#泛型集合之Dictionary&lt;k, v&gt;使用技巧

1.要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscorlib) 2.描述 1).从一组键(Key)到一组值(Value)的映射,每一个添加项都是由一个值及其相关连的键组成 2).任何键都必须是唯一的 3).键不能为空引用null(VB中的Nothing),若值为引用类型,则可以为空值 4).Key和Value可以是任何类型(string,int,custom class 等) 3.创建及初始化 Dictionary<