Hashtable和HashMap

Hashtable,这个类的命名有问题,table的T没有大写。这个类很老,在JDK1.0就出现了,可能当时并没有人发现它的命名问题,待到后来已经牵涉到太多的其它类,此时已经无法轻易的修改它的名字了,也就这么着了,属于历史遗留问题。

1、Hashtable和HashMap的相同之处

Java包含两个类,java.util.Hashtable 和 java.util.HashMap,它们提供了一个多用途的Hashtable机制。Hashtable 和 HashMap对象可以让你把一个key和一个value结合起来,并用put()方法把这对key/value输入到表中。然后你可以通过调用get()方法,把key作为参数来得到这个value(值)。只要满足两个基本的要求,key和value可以是任何对象。注意,因为key和value必须是对象,所以原始类型(primitive types)必须通过运用诸如Integer(int)的方法转换成对象。这面是一段简单的示例代码:

1、创建一个Hashtable,保存1、2、3三个对象。

插曲:写了一个小例子,写到一半的时候始终报错,从MyEclipse换到Eclipse也不行,开始弱弱的以为是环境什么的哪儿不合适。我写的例子如下

Hashtable和HashMap_第1张图片

在这儿,需要注意的是Hashtable的实现用的是泛型,所以会提示给Hashtable添加参数类型,或者添加禁止告警。具体解决如下Hashtable和HashMap_第2张图片

这个问题先是解决了,不过接着往下写,汗呐,出现的告警始终没明白是什么意思?

Hashtable和HashMap_第3张图片

后来,终于茅塞顿开,艹,该把这些语句写到一个方法里边!!!如下

Hashtable和HashMap_第4张图片

插曲结束,回到之前的话题!

创建Hashtable并保存1、2、3三个对象,并查找元素的完整代码如下

package jijian.test;

import java.util.Hashtable;

public class Config {
	public static void main(String[] args) {
		Hashtable numbers = new Hashtable();
		numbers.put("one", 1);
		numbers.put("two", 2);
		numbers.put("three", 3);
		
		Integer n = numbers.get("one");
		if (null != n) {
			System.out.println("one = " + n);
		}
	}	
    
}

结果如下

 

为了将一个特定类的对象用作一个key,这个类必须提供两个方法,equals() 和 hashcode() 。这两个方法在java.lang.Object中,所以所有的类都可以继承这两个方法;但是,这两个方法在Object类中的实现一般没什么用,所以你通常需要自己重载这两个方法。

2、Hashtable 和 HashMap 不同之处

Hashtable 和 HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现。

最终要的不同是Hashtable的方法是同步的,而HashMap的方法不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步。

第三点不同是,HashMap允许key或者value为null。注意:只允许一个key为null,但是允许任意个value为null。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。Hashtable不允许为空。

一些资料建议,当需要同步时,用Hashtable,反之用HashMap。但是,因为在需要时,HashMap可以被同步,HashMap的功能比Hashtable的功能更多,而且它不是基于一个陈旧的类的,所以有人认为,在各种情况下,HashMap都优先于Hashtable。

你可能感兴趣的:(java)