提到hashtable,先要澄清两个问题hashCode与equals().Hashtable有容量和加载因子,容量相当于桶,因子相当于桶里的对象.而hashCode我们可以把它理解为桶的序号,所以HashCode相同的,即它们在同一个桶里,这两上对象就在同一个桶里,这时候如果他们还equals()的话,那么这两个对象就是一样的.而如果他们的hashCode不一样,即他们不在同一个桶里,那么这两个对象肯定是不一样的.

所以我们在用hashtable进行存储对象时要重写他们的hashCode与equals(),否则会出现很多重复的对象.

hashtable与hashMap最大的区别是,hashtable是方法同步的,而后者是异步的.

先来看看下面的例子吧:

  1. public class Ball {
  2. private int size;
  3. private String name;
  4. public Ball(int size, String name) {
  5. this.size = size;
  6. this.name = name;
  7. }
  8. public void setSize(int size) {
  9. this.size = size;
  10. }
  11. public int getSize() {
  12. return size;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public String getName() {
  18. return name;
  19. }
  20. public static void main(String[] args) {
  21. Hashtable<Ball, String> hash = new Hashtable<Ball, String>();
  22. , "one"), "1");
  23. , "two"), "2");
  24. , "one"), "1");
  25. System.out.println(hash.size());
  26. }
  27. }

可能有的人会认为打印出出来的结果当然是2,有一个是重复的

但结果是3.

因为默认它们都是用Object对象来实现比较的,所以它们的hashCode当然是不一样的

我们可以加以下代码检查是否是这样

  1. @Override
  2. public int hashCode() {
  3. System.out.println(super.hashCode());
  4. return super.hashCode();
  5. }

那么,如何才能去掉重复的对象的

这里我们必须重写hashCode,如下,我们可以把size相同的对象放入同一个桶里,再比较他们的name

把hashCode方法改为

  1. @Override
  2. public int hashCode() {
  3. System.out.println(size);
  4. return size;
  5. }
  6. 写equals();
  1. <pre class="java" name="code">    @Override
  2. public boolean equals(Object obj) {
  3. if (obj instanceof Ball) {
  4. Ball ball = (Ball) obj;
  5. return name.equals(ball.getName());
  6. }
  7. return false;
  8. }</pre>

再试试,结果就是为2.

hashtable再每添加一个对象的都会先判断他们的hashCode是否一样,如果一样再判断他们是否equals(),如果返回为true的话,那么这个对象将不添加

我们也可以看一下源代码实现

  1. /**
  2. * Maps the specified <code>key</code> to the specified
  3. * <code>value</code> in this hashtable. Neither the key nor the
  4. * value can be <code>null</code>. <p>
  5. *
  6. * The value can be retrieved by calling the <code>get</code> method
  7. * with a key that is equal to the original key.
  8. *
  9. * @param      key     the hashtable key
  10. * @param      value   the value
  11. * @return     the previous value of the specified key in this hashtable,
  12. *             or <code>null</code> if it did not have one
  13. * @exception  NullPointerException  if the key or value is
  14. *               <code>null</code>
  15. * @see     Object#equals(Object)
  16. * @see     #get(Object)
  17. */
  18. public synchronized V put(K key, V value) {
  19. // Make sure the value is not null
  20. if (value == null) {
  21. throw new NullPointerException();
  22. }
  23. // Makes sure the key is not already in the hashtable.
  24. Entry tab[] = table;
  25. int hash = key.hashCode();
  26. int index = (hash & 0x7FFFFFFF) % tab.length;
  27. for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
  28. if ((e.hash == hash) && e.key.equals(key)) {
  29. V old = e.value;
  30. e.value = value;
  31. return old;//这里如果比较结果相同时就返回原来的值
  32. }
  33. }
  34. modCount++;
  35. if (count >= threshold) {
  36. // Rehash the table if the threshold is exceeded
  37. rehash();
  38. tab = table;
  39. index = (hash & 0x7FFFFFFF) % tab.length;
  40. }
  41. // Creates the new entry.
  42. Entry<K,V> e = tab[index];
  43. tab[index] = new Entry<K,V>(hash, key, value, e);
  44. count++;
  45. return null;
  46. }

hashMap允许键与值为空.其他的和hashtable是一样的.

具体可再参考API...

Hashtable与HashMap区别(2)的更多相关文章

  1. Java中List,ArrayList、Vector,map,HashTable,HashMap区别用法

    Java中List,ArrayList.Vector,map,HashTable,HashMap区别用法 标签: vectorhashmaplistjavaiteratorinteger ArrayL ...

  2. Hashtable和HashMap区别

    Hashtable和HashMap区别 相同点: 实现原理,功能相同,可以互用 主要区别: a.hashtable继承Directionary类,HashMap实现Map接口 b.Hashtable线 ...

  3. 【Java】HashTable和HashMap区别

    ①继承不同 public class Hashtable extends Dictionary implements Map public class HashMap extends Abstract ...

  4. HashTable 和 HashMap 区别

    hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法. hashTable同步的,而HashMap是非同步的,效率上 ...

  5. HashTable和HashMap的区别详解(转)

    一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的, ...

  6. HashTable和HashMap的区别详解

    一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的, ...

  7. HashTable、HashMap、HashSet

    1. HashMap 1)  hashmap的数据结构 Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示: 当我们往hashmap中put元素的时候,先根据key的hash ...

  8. Hashtable、HashMap

    JDK1.6 API public class Hashtable<K,V>extends Dictionary<K,V>implements Map<K,V>, ...

  9. Hashtable和HashMap类的区别

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

随机推荐

  1. js 根据当前星期做跳转(代码段)

    var week = [6,0,1,2,3,4,5]; $('.HotShop_head .HotShop_tab:eq('+week[new Date().getDay()]+')').click( ...

  2. jQuery基础与实例

    一.简介 1.什么是jQuery jQuery是一个轻量级.快速简洁的javaScript库,能让我们方便快捷的选择元素操作元素属性. 2.下载地址 3.jQuery使用方式 $("div& ...

  3. python--gevent协程及协程概念

    何为协程 协程,又称微线程.英文名Coroutine. 协程最大的优势就是协程极高的执行效率.因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的 ...

  4. java中ReentrantReadWriteLock读写锁的使用

    Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象. 读写锁:分为读 ...

  5. 2014年辛星完全解读Javascript第三节

    经过第一节的入门和第二节的运算符,那么接下来我们就可以学习Javascript的函数了,当然了,不管大家之前学习的是什么编程语言,都会有函数的概念,如果大家学的是Pascal,还会有”过程“的概念,但 ...

  6. 4、WPF应用程序的启动

    启动第一步: 启动第二步 启动第三步:

  7. Mac技巧之让U盘、移动硬盘在苹果电脑和Windows PC都能识别/读写,且支持4GB大文件:exFAT格式

    如果您的 U 盘.移动硬盘既要用于 PC 又要用于苹果电脑,Mac OS X 系统的 HFS+ 和 Windows 的 NTFS 格式显然都不行……HFS+ 在 Windows 下不识别,NTFS 格 ...

  8. 玩转Log4Net

    玩转Log4Net 下载Log4Net 下载地址:http://logging.apache.org/log4net/download_log4net.cgi 把下载的  log4net-1.2.11 ...

  9. [转]用Python做一个自动生成读表代码的小脚本

    写在开始(本片文章不是写给小白的,至少你应该知道一些常识!) 大家在Unity开发中,肯定会把一些数据放到配置文件中,尤其是大一点的项目,每次开发一个新功能的时候,都要重复的写那些读表代码.非常烦.来 ...

  10. PAT-乙级-1014. 福尔摩斯的约会 (20)

    1014. 福尔摩斯的约会 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大侦探福尔摩斯接到一张奇怪的 ...