`
sungang_1120
  • 浏览: 325334 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

JAVA集合学习(二)认识Map之HashMap

 
阅读更多

基于哈希表的 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;
	}
	
	
}

 运行结果如下:



 

  • 大小: 35.2 KB
分享到:
评论

相关推荐

    深入Java集合学习系列:HashMap的实现原理

    在Java编程语言中,集合框架是开发者日常工作中不可或缺的一部分,HashMap作为其中的重要成员,它的实现原理对于理解Java性能优化和数据结构有深远的意义。HashMap是一个基于哈希表的数据结构,它实现了Map接口,...

    深入Java集合学习系列

    在"深入Java集合学习系列(二):ArrayList实现原理_尚硅谷_张晓飞.pdf"中,你可以了解到ArrayList的内部结构、扩容机制以及其在不同操作下的性能特点。 其次,HashMap是Java中处理键值对的数据结构,它实现了Map接口...

    易语言仿java集合 list map源码

    本主题聚焦于易语言中的面向对象编程,特别是模仿Java集合框架的List和Map接口的实现。这些数据结构在编程中扮演着核心角色,用于组织和管理数据。 首先,让我们深入了解易语言的面向对象编程概念。面向对象编程...

    Java实现Map集合二级联动示例

    Map集合是Java集合框架的一部分,它允许我们以键(Key)-值(Value)对的形式存储数据。在Map中,键是唯一的,而值可以重复。Java提供了多种Map接口的实现,如HashMap、TreeMap、LinkedHashMap等,它们各有不同的...

    java中Map集合的常用遍历方法及HashMap的应用实例

    2、遍历Map.keySet():它是Map中key值的集合,我们可以通过遍历这个集合来 读取Map中的元素; 3、遍历Map.values():它是Map中value的集合,我们可以直接通过这个集合遍历 Map中的值,却不能读取key。

    Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结

    Java集合专题总结:HashMap和HashTable源码学习和面试总结 本文总结了Java集合专题中的HashMap和HashTable,涵盖了它们的源码学习和面试总结。HashMap是一种基于哈希表的集合类,它的存储结构是一个数组,每个元素...

    java Pojo转Map

    Map接口则是Java集合框架的一部分,它提供了键值对的数据存储方式,方便数据的存取。将Pojo对象转换为Map,可以简化数据处理过程,尤其是在JSP页面上展示数据时,Map的灵活性更加突出。本文将详细介绍如何实现Java中...

    java集合MAP三种遍历

    `Map`接口是Java集合框架的一部分,它提供了基于键值对的数据存储方式。常见的实现类包括`HashMap`(无序)、`LinkedHashMap`(有序)、`TreeMap`(排序)等。Map的主要方法包括`put`、`get`、`remove`、`...

    Java Map 集合类简介

    【Java Map 集合类简介】 在Java的`java.util`包中,集合类扮演着重要的角色,其中List和Map是最为常见的两种。List的实现例如ArrayList和Vector,它们都是可变大小的列表,适合存储和操作各种类型对象的序列。特别...

    java集合深度学习

    在深入学习Java集合时,我们需要特别关注HashMap和HashTable这两个重要的类。虽然它们都是用于存储键值对的数据结构,但它们在设计和使用上有显著的区别。 HashMap是Java 1.2引入的,它是Map接口的一个实现,提供了...

    Java HashMap类详解

    本资源详细介绍了 Java 中的 HashMap 类,包括其实现机制、Hash 存储机制、集合存储机制等方面的知识点。 1. HashMap 和 HashSet 的关系 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,虽然...

    Java二维数组实现简单Map

    尽管Java提供了内置的Map接口(如HashMap、TreeMap等),但有时为了学习或特定需求,我们可能会用基本类型的数据结构来实现Map。这篇博客文章(链接已省略)可能介绍了如何通过二维数组实现这个概念。 首先,我们...

    实验05 Java集合.doc

    Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了一组高级的数据结构,使得开发者能够更方便地管理和操作对象。在本次实验中,我们主要关注了三个主要的集合接口:Set、List和Map,以及它们的一些常见...

    java集合思维导图

    通过这样的学习方式,不仅可以加深对Java集合的理解,还能提高问题解决的能力。 总结来说,Java集合框架提供了丰富的数据结构和算法,适应各种场景下的数据存储需求。理解并熟练掌握这些集合类的特性和使用方法,...

    Map,HashMap,TreeMap的使用

    Map 是 Java 集合框架中的一个接口,用于存储键值对,根据键可以获取值。Map 中的键不允许重复,但值可以重复。在 Java 中,HashMap、LinkedHashMap、TreeMap 都实现了 Map 接口,都是 Map 的子类,每个子类都有其...

    java中map集合的用法

    Java中的Map接口是Java集合框架的重要组成部分,它用于存储键值对的数据结构,其中每个键都是唯一的,并且与一个值相关联。Map集合不同于List,因为它不维护元素的顺序,而是通过键来访问其对应的值。本文将详细介绍...

    JAVA学习Java集合框架.pptx

    JAVA集合框架学习笔记 JAVA集合框架是Java语言中提供的一种数据结构,用于存储和管理大量数据。它提供了多种接口和实现类,例如Collection、List、Map等,帮助开发者更方便地处理数据。 什么是异常? 在Java中,...

    Java基础教程之Map集合深入讲解及其应用

    适用人群:适合具有一定Java基础知识的学习者,尤其是想深入了解Java集合框架的开发者和技术人员。 使用场景及目标:① 学习者希望通过此文全面掌握Map接口及其主要实现类的功能与应用场景;② 开发人员希望在实际...

    深入Java集合学习系列(二):ArrayList实现原理

    根据提供的文件内容,我们将详细探讨Java集合框架中的ArrayList的实现原理以及与之相关的HashSet的实现。由于内容中并未直接涉及ArrayList的实现原理,但给出了HashSet的相关信息,我们先从这部分开始。 首先,...

Global site tag (gtag.js) - Google Analytics