(最近在老师叫我们用java去实现LRU算法,了解到要用双链表去做,要用到LinkHashMap去做,但自己对java的几大集合框架并不熟悉,在学习过程了解到了HashMap和HashSet,做个简单笔记吧)

HashMap

HashMap是一个有序的集合,是有一对属性值的集合,属性包含key,和value。关键字key是唯一不重复的,查询起来速度很快。

 

HashMap 的实例有两个参数影响其性能:初始容量加载因子。容量是 哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,通过调用 rehash 方法将容量翻倍。 
通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地降低 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。

HashSet

 

而HashSet(散列表)就像是把HashMap中value去掉,说白了就是只有一个key的HashMap集合。它实现了Set接口,意味着它的元素不能有重复值出现。HashSet中有add、remove、contains 和 size方法,没有get()方法,但可以通过iterator()来实现,迭代所需的时间与 HashSet 实例的大小(元素的数量)成比例。且对于 HashSet 而言,它是基于 HashMap 实现的。

下面是HashSet的源代码:

  1. public class HashSet<E> extends AbstractSet<E>
  2. implements Set<E>, Cloneable, java.io.Serializable
  3. {
  4. // 使用 HashMap 的 key 保存 HashSet 中所有元素
  5. private transient HashMap<E,Object> map;
  6. // 定义一个虚拟的 Object 对象作为 HashMap 的 value
  7. private static final Object PRESENT = new Object();
  8. ...
  9. // 初始化 HashSet,底层会初始化一个 HashMap
  10. public HashSet()
  11. {
  12. map = new HashMap<E,Object>();
  13. }
  14. // 以指定的 initialCapacity、loadFactor 创建 HashSet
  15. // 其实就是以相应的参数创建 HashMap
  16. public HashSet(int initialCapacity, float loadFactor)
  17. {
  18. map = new HashMap<E,Object>(initialCapacity, loadFactor);
  19. }
  20. public HashSet(int initialCapacity)
  21. {
  22. map = new HashMap<E,Object>(initialCapacity);
  23. }
  24. HashSet(int initialCapacity, float loadFactor, boolean dummy)
  25. {
  26. map = new LinkedHashMap<E,Object>(initialCapacity
  27. , loadFactor);
  28. }
  29. // 调用 map 的 keySet 来返回所有的 key
  30. public Iterator<E> iterator()
  31. {
  32. return map.keySet().iterator();
  33. }
  34. // 调用 HashMap 的 size() 方法返回 Entry 的数量,就得到该 Set 里元素的个数
  35. public int size()
  36. {
  37. return map.size();
  38. }
  39. // 调用 HashMap 的 isEmpty() 判断该 HashSet 是否为空,
  40. // 当 HashMap 为空时,对应的 HashSet 也为空
  41. public boolean isEmpty()
  42. {
  43. return map.isEmpty();
  44. }
  45. // 调用 HashMap 的 containsKey 判断是否包含指定 key
  46. //HashSet 的所有元素就是通过 HashMap 的 key 来保存的
  47. public boolean contains(Object o)
  48. {
  49. return map.containsKey(o);
  50. }
  51. // 将指定元素放入 HashSet 中,也就是将该元素作为 key 放入 HashMap
  52. public boolean add(E e)
  53. {
  54. return map.put(e, PRESENT) == null;
  55. }
  56. // 调用 HashMap 的 remove 方法删除指定 Entry,也就删除了 HashSet 中对应的元素
  57. public boolean remove(Object o)
  58. {
  59. return map.remove(o)==PRESENT;
  60. }
  61. // 调用 Map 的 clear 方法清空所有 Entry,也就清空了 HashSet 中所有元素
  62. public void clear()
  63. {
  64. map.clear();
  65. }
  66. ...
  67. }

Hashtable

另外还有Hashtable ,网上说这三个的区别在面试时经常会遇到,呵呵,但到现在好像很少遇到Hashtable,是因为HashMap是新框架中用来代替HashTable的类么?Hashtable是Dictionary的子类,方法是同步的,不允许null值(key和value都不可以),而HashMa是Map接口的一个实现类,方法是异步的,允许null值出现。

一些简单的测试程序,摘下了,便于理解:

  1. public static void main(String[] args) {
  2. Hashtable<Integer, String> table = new Hashtable<Integer, String>();
  3. table.put(1, "1");
  4. //table.put(2, null); //Hashtable 不允许null值 有null就会报异常
  5.  
  6. for(int i=0;i<table.size();i++){
  7. System.out.println(table.get(1));
  8. }
  9. System.out.println("#############");
  10. HashMap<Integer, String> map = new HashMap<Integer, String>();
  11. map.put(1, "2");
  12. map.put(2, "3");
  13. map.put(null,null); //HashMap 允许null值,但key只能有一个null,否则后面不会被保存,
  14. for(int i=0;i<map.size();i++){
  15. System.out.println(map.get(1));
  16. }
  17.  
  18. System.out.println("#############");
  19. //HashSet 值不能重复 无序的不能用get()来取对象
  20. HashSet<Integer> s = new HashSet<Integer>();
  21. s.add(Integer.valueOf(1));
  22. s.add(Integer.valueOf(1));
  23. for(Integer i:s){
  24. System.out.println(i);
  25. }
  26. }

(代码源于http://blog.sina.com.cn/s/blog_4586764e0100ivup.html

google搜索这三者的区别,看到两篇置顶文章,估计以后还得回去看看

http://blog.csdn.net/zwjlpeng/article/details/9746425

http://www.cnblogs.com/dyllove98/p/3236988.html

HashSet与HashMap、Hashtable的更多相关文章

  1. 基于散列的集合 HashSet\HashMap\HashTable

    HashSet\HashMap\HashTable 1 基于散列的集合 2 元素会根据hashcode散列,因此,集合中元素的顺序不一定与插入的顺序一致. 3 根据equals方法与hashCode方 ...

  2. HashSet、HashMap、Hashtable、TreeMap循环、区别

    HashSet 循环 //可以为null HashSet<Object> hashSet =new HashSet<Object>(); hashSet.add(1); has ...

  3. == 和 equals,equals 与 hashcode,HashSet 和 HashMap,HashMap 和 Hashtable

    一:== 和 equals == 比较引用的地址equals 比较引用的内容 (Object 类本身除外) String obj1 = new String("xyz"); Str ...

  4. Set集合[HashSet,TreeSet,LinkedHashSet],Map集合[HashMap,HashTable,TreeMap]

    ------------ Set ------------------- 有序: 根据添加元素顺序判定, 如果输出的结果和添加元素顺序是一样 无序: 根据添加元素顺序判定,如果输出的结果和添加元素的顺 ...

  5. Java的HashMap和Hashtable有什么区别HashSet和HashMap有什么区别?使用这些结构保存的数需要重载的方法是哪些?

    HashMap与Hashtable实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用 两者的主要区别如下 1.Hashtable是早期JDK提供的接口,HashMap是新版J ...

  6. Collections+Iterator 接口 | Map+HashMap+HashTable+TreeMap |

    Collections+Iterator 接口 1. Collections 是一个操作 Set.List 和 Map 等集合的工具类 Collections 中提供了大量方法对集合元素进行排序.查询 ...

  7. HashSet和HashMap的区别

    HashSet和HashMap的区别.Java的HashSet类是由哈希表支持.它不保证 set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用 null 元素.HashSet类为基本操作提供 ...

  8. HashSet与HashMap的区别

    本文由 ImportNew - 唐小娟 翻译自 Javarevisited.欢迎加入翻译小组.转载请见文末要求. HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到C ...

  9. HashMap,HashTable,TreeMap区别和用法

    开始学HashTable,HashMap和TreeMap的时候比较晕,觉得作用差不多,但是到实际运用的时候又发现有许多差别的.需要大家注意,在实际开发中以需求而定. java为数据结构中的映射定义了一 ...

  10. Java HashSet和HashMap源码剖析

    转自: Java HashSet和HashMap源码剖析 总体介绍 之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说Ha ...

随机推荐

  1. poj 1050(DP)

    最大子矩阵和.类似于子序列最大和. // File Name: 1050.cpp // Author: Missa_Chen // Created Time: 2013年06月22日 星期六 17时0 ...

  2. HDU 1231 最大连续子序列

    和前面两道题一样 不过这题要求输出子序列首尾的元素的值,而且如果所有元素都小于0的话,规定子序列的和为0,并输出整个序列的首尾元素. //#define LOCAL #include <iost ...

  3. Asp.Net正则获取页面a标签里的内容

    Asp.Net正则获取页面a标签里的内容 string url = "http://www.114369.com"; string html = MyCLib.NetClass.S ...

  4. 监听器Listener

    监听器 6个事件类,均以event结尾 *某些操作,如启动/关闭容器,创建/销毁会话,都将触发一种事件发生,当发生了某种事件,容器将创建对应的事件类对象 8个监听接口,均以Listener结尾 监听器 ...

  5. LeetCode Linked List Cycle II 单链表环2 (找循环起点)

    题意:给一个单链表,若其有环,返回环的开始处指针,若无环返回NULL. 思路: (1)依然用两个指针的追赶来判断是否有环.在确定有环了之后,指针1跑的路程是指针2的一半,而且他们曾经跑过一段重叠的路( ...

  6. wx菜单栏

    #include "MainFrame.h" BEGIN_EVENT_TABLE(MyFrame,wxFrame) EVT_MENU(wxID_FILE,MyFrame::OnMe ...

  7. string tips

    1. .net文档中说,split 比 indexOf 消耗更多的性能.在as3中经过本人测试,这个结论一样成立.而且,字符串越长,split和indexOf的差距就越明显!!所以,能用indexOf ...

  8. mysql利用存储过程批量插入数据

    最近需要测试一下mysql单表数据达到1000W条以上时增删改查的性能.由于没有现成的数据,因此自己构造,本文只是实例,以及简单的介绍. 首先当然是建表: [sql]view plaincopy CR ...

  9. 一天一点MySQL复习——获取数据库系统时间、变量赋值、变量比较

    一.SQL获取系统时间 mysql> select now() from dual; +---------------------+ | now() | +------------------- ...

  10. 【转】eclipse怎么设置字体大小

    原文网址:http://jingyan.baidu.com/article/f96699bb9442f3894e3c1b15.html 1. 打开eclipse,找到window 2.  点击后在下拉 ...