`
cakin24
  • 浏览: 1390161 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Java 8中的HashMap类和Hashtable类

    博客分类:
  • java
阅读更多

一 HashMap类和Hashtable类的介绍

1 HashMap类和Hashtable类概述

HashMap和Hashtable都是Map接口的典型实现类,他们之间的关系完全类似于ArrayList和Vector的关系。

HashMap类和Hashtable类的区别

  • Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比Hashtable的性能高一点;但如果有多线程访问同一个Map对象时,使用Hashtable实现类会更好。
  • Hashtable不允许使用null作为key和value,如果试图把null值放进Hashtable中,将会引发NullPointerException异常;但HashMap可以使用null作为key或value。

3 代码示例

import java.util.*;

public class NullInHashMap
{
	public static void main(String[] args)
	{
		HashMap hm = new HashMap();
		// 试图将两个key为null的key-value对放入HashMap中
		hm.put(null , null);
		hm.put(null , null);    // ①
		// 将一个value为null的key-value对放入HashMap中
		hm.put("a" , null);    // ②
		// 输出Map对象
		System.out.println(hm);
	}
}

4 运行结果

{null=null, a=null}

5 结果分析

由于HashMap里的key不能重复,所以HashMap里最多只有一个key-value对的key为null,但可以由无数多个key-value对的value为null,该程序演示了用null值作为HashMap的key和value的情形。

 

二 Hashtable类的典型应用

1 代码示例

import java.util.*;


class A
{
	int count;
	public A(int count)
	{
		this.count = count;
	}
	// 根据count的值来判断两个对象是否相等。
	public boolean equals(Object obj)
	{
		if (obj == this)
			return true;
		if (obj != null && obj.getClass() == A.class)
		{
			A a = (A)obj;
			return this.count == a.count;
		}
		return false;
	}
	// 根据count来计算hashCode值。
	public int hashCode()
	{
		return this.count;
	}
}
class B
{
	// 重写equals()方法,B对象与任何对象通过equals()方法比较都返回true
	public boolean equals(Object obj)
	{
		return true;
	}
}
public class HashtableTest
{
	public static void main(String[] args)
	{
		Hashtable ht = new Hashtable();
		ht.put(new A(60000) , "爸爸");
		ht.put(new A(87563) , "妈妈");
		ht.put(new A(1232) , new B());
		System.out.println(ht);
		// 只要两个对象通过equals比较返回true,
		// Hashtable就认为它们是相等的value。
		// 由于Hashtable中有一个B对象,
		// 它与任何对象通过equals比较都相等,所以下面输出true。
		System.out.println(ht.containsValue("测试字符串")); // ① 输出true
		// 只要两个A对象的count相等,它们通过equals比较返回true,且hashCode相等
		// Hashtable即认为它们是相同的key,所以下面输出true。
		System.out.println(ht.containsKey(new A(87563)));   // ② 输出true
		// 下面语句可以删除最后一个key-value对
		ht.remove(new A(1232));    //③
		System.out.println(ht);
	}
}

2 运行结果

{A@ea60=爸爸, A@1560b=妈妈, A@4d0=B@1db9742}

true

true

{A@ea60=爸爸, A@1560b=妈妈}

3 结果分析

当使用自定义类作为Hashtable的key时,如果重写该类的equals和hashCode方法,则应该保证这两个方法的判断标准一致,当两个Key通过equals方法比较返回true时,两个key的hashCode返回值也应该相同。

 

三 HashMap类的典型应用

1 代码示例

import java.util.*;

public class HashMapErrorTest
{
	public static void main(String[] args)
	{
		HashMap ht = new HashMap();
		// 此处的A类与前一个程序的A类是同一个类
		ht.put(new A(60000) , "孙悟空");
		ht.put(new A(87563) , "八戒");
		// 获得Hashtable的key Set集合对应的Iterator迭代器
		Iterator it = ht.keySet().iterator();
		// 取出Map中第一个key,并修改它的count值
		A first = (A)it.next();
		first.count = 87563;   // ①
		// 输出{A@1560b=孙悟空, A@1560b=八戒}
		System.out.println(ht);
		// 只能删除没有被修改过的key所对应的key-value对
		ht.remove(new A(87563));
		System.out.println(ht);
		// 无法获取剩下的value,下面两行代码都将输出null。
		System.out.println(ht.get(new A(87563)));   // ② 输出null
		System.out.println(ht.get(new A(60000)));   // ③ 输出null
	}
}

2 运行结果

{A@1560b=孙悟空, A@1560b=八戒}

{A@1560b=孙悟空}

null

null

3 结果分析

与HashSet类似,尽量不要使用可变变量作为HashMap的key。如果确实需要使用可变变量作为HashMap的key,则尽量不要在程序中修改作为key的可变变量。

0
0
分享到:
评论

相关推荐

    HashMap和HashTable的区别和不同

    在Java编程中,`HashMap`与`HashTable`作为两种常用的数据结构,经常被用来存储键值对数据。尽管它们在功能上相似,但在实现细节、性能表现以及使用场景方面存在显著差异。本文将深入探讨两者之间的区别,帮助读者更...

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

    本文总结了Java集合专题中的HashMap和HashTable,涵盖了它们的源码学习和面试总结。HashMap是一种基于哈希表的集合类,它的存储结构是一个数组,每个元素是一个单链表的头节点,链表用来解决hash地址冲突问题。...

    hashMap和hashTable的区别

    `HashMap` 和 `HashTable` 都是 Java 集合框架中非常重要的数据结构,它们都实现了 `Map` 接口,用于存储键值对。尽管它们在功能上有很多相似之处,但在实现细节和性能特性上存在显著差异。 #### 二、主要区别 1. ...

    经典讲解List和ArrayList和Vector和HashTable和HashMap区别

    在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...

    HashMap与HashTable和HashSet的区别

    在Java集合框架中,`HashMap`, `HashTable` 和 `HashSet` 是三个重要的数据结构,它们分别实现了`Map`接口和`Set`接口,提供了不同的功能来满足不同的编程需求。本文将重点分析这三种数据结构之间的区别,特别是针对...

    HashMap和HashTable底层原理以及常见面试题

    HashMap和HashTable是Java中两个常用的数据结构,都是基于哈希表实现的,但它们之间存在着一些关键的区别。本文将深入探讨HashMap和HashTable的底层原理,并总结常见的面试题。 HashMap的底层原理 HashMap是Java中...

    HashMap与HashTable区别

    在Java编程语言中,`HashMap`和`HashTable`是两种非常重要的数据结构,它们都实现了`Map`接口,并提供了键值对的存储方式。这两种数据结构虽然相似,但在实现细节和使用场景上存在显著差异。下面将详细介绍`HashMap`...

    hashmap与hashtable区别

    在Java编程语言中,`HashMap`和`Hashtable`是两种非常重要的数据结构,它们都用于存储键值对。然而,在实际应用过程中,这两种数据结构有着本质的不同,下面将详细介绍这些差异。 #### 1. 历史背景及实现原理 - **...

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

    ### Java中HashMap, LinkedHashMap, TreeMap,HashTable的区别 在Java编程语言中,`Map`接口是集合框架中的一个重要组成部分,用于存储键值对。本文将详细分析四种常用的`Map`实现类:`HashMap`, `LinkedHashMap`, ...

    Hashtable和HashMap的区别:

    在Java编程语言中,`Hashtable` 和 `HashMap` 都是用来存储键值对的数据结构。这两种数据结构虽然相似,但是在实现细节上存在显著差异。 1. **Hashtable**:作为 `Dictionary` 类的子类,`Hashtable` 是 Java 最早...

    HashMap与HashTable的区别(含源码分析)

    在Java编程语言中,`HashMap`和`HashTable`都是实现键值对存储的数据结构,但它们之间存在一些显著的区别,这些区别主要体现在线程安全性、性能、null值处理以及一些方法特性上。以下是对这两个类的详细分析: 1. ...

    Java面试题11.HashMap和HashTable的区别.mp4

    Java面试题11.HashMap和HashTable的区别.mp4

    HashMap和Hashtable的区别Java开发Jav

    HashMap和Hashtable的区别Java开发Java经验技巧共2页.pdf.zip

    java面试题精讲视频MP4Java面试题11.HashMap和HashTable的区别

    java面试题精讲视频MP4Java面试题11.HashMap和HashTable的区别提取方式是百度网盘分享地址

    hashtable和hashmap的区别

    在Java编程语言中,`Hashtable`和`HashMap`是两种非常重要的数据结构,它们都实现了`Map`接口,用于存储键值对。尽管它们有着相似的功能,但在实现细节和应用场景上存在显著差异。接下来,我们将详细探讨`Hashtable`...

    hashmap和hashtable的区别.docx

    HashMap 和 Hashtable 是 Java 集合框架中两个重要的映射数据结构,它们都实现了 Map 接口,但具有显著的差异。以下将详细介绍这两个类的主要区别: 1. 线程安全性: - HashMap 不是线程安全的,这意味着在多线程...

    Hashtable和HashMap区别

    在Java编程语言中,`Hashtable`和`HashMap`是两种非常重要的数据结构,它们都属于`Map`接口的实现类,用于存储键值对数据。尽管两者在功能上相似,但在实际应用中却存在显著差异。 #### 1. 历史与实现基础 `...

    Java中Hashtable类与HashMap类的区别详解

    Java中的`Hashtable`和`HashMap`都是用于存储键值对的数据结构,它们都实现了`Map`接口,但在一些关键特性上有所不同。以下是这两者的主要区别: 1. **线程安全性**: - `Hashtable`是线程安全的,这意味着在多...

    java面试题——详解HashMap和Hashtable 的区别

    HashMap 和 Hashtable 是 Java 中两种常用的哈希表数据结构,它们都是用来存储键值对的数据结构,但它们在设计和实现上有显著的区别。以下是对这两者差异的详细解释: 1. **线程安全性**: - `Hashtable` 是线程...

    java软件技术文档-深入java8的集合5:Hashtable的实现原理.pdf

    【Java软件技术文档-深入Java8的集合5:Hashtable的实现原理】 在Java编程语言中,集合框架是不可或缺的一部分,而Hashtable是其中一种古老的、线程安全的哈希表实现。尽管现在更多地使用HashMap或...

Global site tag (gtag.js) - Google Analytics