博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashMap,HashTable,HashSet区别
阅读量:7019 次
发布时间:2019-06-28

本文共 2150 字,大约阅读时间需要 7 分钟。

hot3.png

Hashtable是Dictionary的子类

HashMap是Map接口的一个实现类

HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。

区别:

1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。HashMap允许key值只能由一个null值,因为hashmap如果key值相同,新的key, value将替代久的。

3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。

4.HashTable使用Enumeration,HashMap使用Iterator。

以上只是表面的不同,它们的实现也有很大的不同。

5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

6.哈希值的使用不同,HashTable直接使用对象的hashCode

以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如

HashMap对null的操作。

HashMap可以看作三个视图:key的Set,value的Collection,Entry的Set。这里HashSet就是其实就是HashMap的一个视图。HashSet内部就是使用Hashmap实现的,和Hashmap不同的是它不需要Key和Value两个值。

HashMap为散列映射,它是基于hash table的一个实现,它可在常量时间内安插元素,或找出一组key-value pair.HashSet为散列集,它把查找时间看的很重要,其中所有元素必须要有hashCode()

HashtableHashMap的区别:

  1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;

  2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:

  Map Collections.synchronizedMap(Map m)

  这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。

  3.在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。

public static void main(String[] args) {

  Hashtable<Integer, String> table = new Hashtable<Integer, String>();

  table.put(1, "1");

  //table.put(2, null);   //Hashtable 不允许null值 有null就会报异常

  

for(int i=0;i<table.size();i++){

   System.out.println(table.get(1));

  }

  System.out.println("#############");

  HashMap<Integer, String> map = new HashMap<Integer, String>();

  map.put(1, "2");

  map.put(2, "3");

  map.put(null,null);      //HashMap 允许null值,但key只能有一个null,否则后面不会被保存,

  for(int i=0;i<map.size();i++){

   System.out.println(map.get(1));

  }

  

  System.out.println("#############");

//HashSet  值不能重复  无序的不能用get()来取对象

  HashSet<Integer> s = new HashSet<Integer>();

  s.add(Integer.valueOf(1));

  s.add(Integer.valueOf(1));

  for(Integer i:s){

   System.out.println(i);

  }

 }

转载于:https://my.oschina.net/u/1254856/blog/260944

你可能感兴趣的文章
pythonbrew, pythonz, virtualenv
查看>>
没有mysql支持时的替代方案
查看>>
AIX 软件包结构
查看>>
Last_SQL_Errno: 1050
查看>>
C#使用Xamarin开发可移植移动应用目录
查看>>
android基于XMPP的消息推送机制
查看>>
jvm问题
查看>>
intellij idea远程debug调试resin4教程
查看>>
利用ResultFilter实现asp.net mvc3 页面静态化
查看>>
ethereumjs/ethereumjs-vm-4-tests
查看>>
图片压缩工具Thumbnailator的使用
查看>>
安装tensorflow
查看>>
LintCode_469 等价二叉树
查看>>
UVALive3261 UVA1640 POJ2282 HDU1663 ZOJ2392 The Counting Problem【进制】
查看>>
Mathematica开始学习,
查看>>
Gulp 简单的开发环境搭建
查看>>
linux基础-网络基础知识篇
查看>>
使用MulticastSocket实现多点广播
查看>>
网盘链接
查看>>
评论发布信息可插入QQ表情
查看>>