Hashtable与HashMap区别(2)
提到hashtable,先要澄清两个问题hashCode与equals().Hashtable有容量和加载因子,容量相当于桶,因子相当于桶里的对象.而hashCode我们可以把它理解为桶的序号,所以HashCode相同的,即它们在同一个桶里,这两上对象就在同一个桶里,这时候如果他们还equals()的话,那么这两个对象就是一样的.而如果他们的hashCode不一样,即他们不在同一个桶里,那么这两个对象肯定是不一样的.
所以我们在用hashtable进行存储对象时要重写他们的hashCode与equals(),否则会出现很多重复的对象.
hashtable与hashMap最大的区别是,hashtable是方法同步的,而后者是异步的.
先来看看下面的例子吧:
- public class Ball {
 - private int size;
 - private String name;
 - public Ball(int size, String name) {
 - this.size = size;
 - this.name = name;
 - }
 - public void setSize(int size) {
 - this.size = size;
 - }
 - public int getSize() {
 - return size;
 - }
 - public void setName(String name) {
 - this.name = name;
 - }
 - public String getName() {
 - return name;
 - }
 - public static void main(String[] args) {
 - Hashtable<Ball, String> hash = new Hashtable<Ball, String>();
 - , "one"), "1");
 - , "two"), "2");
 - , "one"), "1");
 - System.out.println(hash.size());
 - }
 - }
 
可能有的人会认为打印出出来的结果当然是2,有一个是重复的
但结果是3.
因为默认它们都是用Object对象来实现比较的,所以它们的hashCode当然是不一样的
我们可以加以下代码检查是否是这样
- @Override
 - public int hashCode() {
 - System.out.println(super.hashCode());
 - return super.hashCode();
 - }
 
那么,如何才能去掉重复的对象的
这里我们必须重写hashCode,如下,我们可以把size相同的对象放入同一个桶里,再比较他们的name
把hashCode方法改为
- @Override
 - public int hashCode() {
 - System.out.println(size);
 - return size;
 - }
 - 写equals();
 
- <pre class="java" name="code"> @Override
 - public boolean equals(Object obj) {
 - if (obj instanceof Ball) {
 - Ball ball = (Ball) obj;
 - return name.equals(ball.getName());
 - }
 - return false;
 - }</pre>
 
再试试,结果就是为2.
hashtable再每添加一个对象的都会先判断他们的hashCode是否一样,如果一样再判断他们是否equals(),如果返回为true的话,那么这个对象将不添加
我们也可以看一下源代码实现
- /**
 - * Maps the specified <code>key</code> to the specified
 - * <code>value</code> in this hashtable. Neither the key nor the
 - * value can be <code>null</code>. <p>
 - *
 - * The value can be retrieved by calling the <code>get</code> method
 - * with a key that is equal to the original key.
 - *
 - * @param key the hashtable key
 - * @param value the value
 - * @return the previous value of the specified key in this hashtable,
 - * or <code>null</code> if it did not have one
 - * @exception NullPointerException if the key or value is
 - * <code>null</code>
 - * @see Object#equals(Object)
 - * @see #get(Object)
 - */
 - public synchronized V put(K key, V value) {
 - // Make sure the value is not null
 - if (value == null) {
 - throw new NullPointerException();
 - }
 - // Makes sure the key is not already in the hashtable.
 - Entry tab[] = table;
 - int hash = key.hashCode();
 - int index = (hash & 0x7FFFFFFF) % tab.length;
 - for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
 - if ((e.hash == hash) && e.key.equals(key)) {
 - V old = e.value;
 - e.value = value;
 - return old;//这里如果比较结果相同时就返回原来的值
 - }
 - }
 - modCount++;
 - if (count >= threshold) {
 - // Rehash the table if the threshold is exceeded
 - rehash();
 - tab = table;
 - index = (hash & 0x7FFFFFFF) % tab.length;
 - }
 - // Creates the new entry.
 - Entry<K,V> e = tab[index];
 - tab[index] = new Entry<K,V>(hash, key, value, e);
 - count++;
 - return null;
 - }
 
hashMap允许键与值为空.其他的和hashtable是一样的.
具体可再参考API...
Hashtable与HashMap区别(2)的更多相关文章
- Java中List,ArrayList、Vector,map,HashTable,HashMap区别用法
		
Java中List,ArrayList.Vector,map,HashTable,HashMap区别用法 标签: vectorhashmaplistjavaiteratorinteger ArrayL ...
 - Hashtable和HashMap区别
		
Hashtable和HashMap区别 相同点: 实现原理,功能相同,可以互用 主要区别: a.hashtable继承Directionary类,HashMap实现Map接口 b.Hashtable线 ...
 - 【Java】HashTable和HashMap区别
		
①继承不同 public class Hashtable extends Dictionary implements Map public class HashMap extends Abstract ...
 - HashTable 和 HashMap 区别
		
hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法. hashTable同步的,而HashMap是非同步的,效率上 ...
 - HashTable和HashMap的区别详解(转)
		
一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的, ...
 - HashTable和HashMap的区别详解
		
一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的, ...
 - HashTable、HashMap、HashSet
		
1. HashMap 1) hashmap的数据结构 Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示: 当我们往hashmap中put元素的时候,先根据key的hash ...
 - Hashtable、HashMap
		
JDK1.6 API public class Hashtable<K,V>extends Dictionary<K,V>implements Map<K,V>, ...
 - Hashtable和HashMap类的区别
		
Hashtable和HashMap类有三个重要的不同之处.第一个不同主要是历史原因.Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现. ...
 
随机推荐
- 同时存在两个或多个homestead 虚拟box
			
开发中发现,不同版本的homestead 里面的环境各不相同,里面的node,npm等版本都不一致,如果需要添加 不同版本的homestead同时存在可以按照以下办法处理. tips: 提供可以离线下 ...
 - ARM-Linux S5PV210 UART驱动(1)----用户手册中的硬件知识
			
一.概述 The Universal Asynchronous Receiver and Transmitter (UART) in S5PV210 provide four independent ...
 - 2014年辛星完全解读Javascript第六节  对象
			
随着面向对象的普及,现在很多语言都在支持面向对象,Javascript也不例外,所谓对象,就是拥有属性和方法的数据.这里的属性其实就是变量,这里的方法,其实就是函数.但是Javascript的面向对象 ...
 - PHP微信开发代码
			
1,SAE上申请服务器 2,绑定测试账号 3,Token验证 <?php /* http://www.cnblogs.com/xrhou12326/ CopyRight 2014 All Rig ...
 - C#网络编程简单实现通信小例子-2
			
1.主界面 2.源代码 Client public partial class For ...
 - Spring AOP进行日志记录
			
在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个 ...
 - Create a SharePoint Application Page for Anonymous Access
			
http://dishasharepointworld.blogspot.com/2011/07/how-to-create-sharepoint-application_1072.html http ...
 - Angular与React的一些看法
			
Angular - React之争 Angular和React无疑是目前最受追捧的两个前端框架,谷歌也发现Angular1.x不足的地方,开始开发2.0版本,脸书发现React的组件化和虚拟DOM非常 ...
 - ActivePython2.7 +Firefly1.2.2+WIN7服务器搭建过程(已通过)
			
原地址:http://www.9miao.com/question-15-54027.html 1.ActivePython2.7 版本(内部已经包含easy_install,pywin32)2.所需 ...
 - docker 通过commit方法创建镜像(Tomcat+Java+Scala)
			
前一阵试了试写Dockerfile创建docker image,但有时全靠Dockerfile写实在有些难度,退而求其次试一试使用commit来创建镜像: 想了想干脆创建一个Java+Scala+To ...