`
sungang_1120
  • 浏览: 310731 次
  • 性别: 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中Map集合的常用遍历方法及HashMap的应用实例

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

    实验05 Java集合.doc

    4)了解Map接口及主要实现类(HashMap、TreeMap、HashTable) 二、实验内容及步骤 1、编写程序练习将以下5个Person类的对象放在一个HashSet中。 姓名:张三 身份证号:178880001 姓名:王五 身份证号:178880002 ...

    Java集合教程吐血整理干货.md

    java集合 线程不安全的集合 HashMap的特点 HashMap的长度(容量)为什么要设计成2的幂? HashTable的特点 TreeMap ArrayList的特点 Vector的特点 LinkedList的特点 Set ConcurrentModificationException异常 线程...

    java中Map集合的排序方法

    Map中元素存放是无序的 HashMap注意事项: 1,HashMap底层维护一个数组,我们向HashMap中所放置的对象实际上是存储在该数组当中; 2,当向HashMap中put一对键值时,它会根据key的hashCode值计算出一个位置,该位置...

    Java基础篇:Java集合.pdf

    该文档主要详细总结了Java集合的相关知识,包括Collection和Map接口、Collection接口的子接口List和Set接口以及具体的实现类、存储原理等;Map接口的子接口HashMap、LinkedHashMap、TreeMap、Properties等

    Java集合Map常见问题_动力节点Java学院整理

    HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来...

    java 集合和泛型 1. Map接口 2. HashMap底层实现 3. Hash数据结构和算法 4. 红黑树数据结构和算法

    java 集合和泛型 1. Map接口 2. HashMap底层实现 3. Hash数据结构和算法 4. 红黑树数据结构和算法

    对java基础集合部分(List、HashMap、HashSet、ArrayList等)底层源码的分析与总结

    这篇集合总结一共包括十二节,介绍了一些接口和实现类的底层源码以及基本的增加、删除元素等的操作(包括List、Map、Set接口、ArrayList、Vector、LinkedList、HashSet、TreeSet、HashMap、TreeMap等实现类)。...

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    Java集合框架Map接口.pdf

    Java集合框架中的Map接口表示一种键值对(key-value)的数据结构,其中每个元素都包含一个唯一的键和对应的值。在Map中,每个键必须是唯一的,而值可以重复。Map接口提供了一些方法来实现基本的键值对操作,例如添加...

    Java集合之HashMap用法详解

    主要介绍了Java集合之HashMap用法,结合实例形式分析了java map集合中HashMap定义、遍历等相关操作技巧,需要的朋友可以参考下

    java集合-HashMap的使用

    HashMap是一种常用的哈希表实现,用于存储键值对。它实现了Map接口,并且使用键的哈希值来快速定位和访问值。

    JAVA SE 开发手册.CHM

    16、JAVA集合框架之Map接口、HashMap类、Trelap类、Hashtable类 17、JAVA异常Exception 18、JAVA线程之基础介绍 19、I0流之基本简介 20、I0流之字符流、字节流、转换流、缓冲流、对象流 21,I0流之HIO

    Java 集合类(HashSet、ArrayList、LinkedList、HashMap).pptx

    掌握List集合、Set集合、Map集合的使用以及Iterator迭代器和foreach循环的使用 了解常用的集合类 熟悉泛型的使用

    java集合类原理面试题

    java集合类 Java中有哪些容器(集合类)? 线程安全和线程不安全的分别有哪些? Map接口有哪些实现类? 描述一下Map put的过程 如何得到一个线程安全的Map? HashMap有什么特点? ConcurrentHashMap是怎么分段分组...

    深入Java集合学习系列(四):LinkedHashMap的实现原理

    深入Java集合学习系列(四): LinkedHashMap的实现原理

    Java中大集合

    Java集合 HashMap类 IdentityHashMap类的使用 SortedMap类的基本使用 在map中创建自己的类的定义 随机数的集合 等等等等

    java中set、list和map的使用方法实例

    // java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...

    Java集合框架HashMap说明.doc

    本文档主要讲述的是Java集合框架HashMap说明;HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在。

    Java集合框架完整说明便于了解集合

    java集合在日常开发中经常用到,对基础的掌握尤其重要,其中List,Set,Map的作用以及使用的场景和分类描述,其中Arraylist 与 LinkedList 区别,HashSet与TreeSet与LinkedHashSet对⽐,LinkedHashMap和HashMap,...

Global site tag (gtag.js) - Google Analytics