`
acen.chen
  • 浏览: 154766 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于集合hashtable,hashmap,hashset,treemap,treeset的几点简单心得

阅读更多
Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得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,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);

static int hash(Object x) {
  int h = x.hashCode();

  h += ~(h << 9);
  h ^= (h >>> 14);
  h += (h << 4);
  h ^= (h >>> 10);
  return h;
}
static int indexFor(int h, int length) {
  return h & (length-1);
}
以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如
HashMap对null的操作。 HashMap可以看作三个视图:key的Set,value的Collection,Entry的Set。 这里HashSet就是其实就是HashMap的一个视图。HashSet内部就是使用Hashmap实现的,和Hashmap不同的是它不需要Key和Value两个值。
          
往hashset中插入对象其实只不过是内部做了

public boolean add(Object o) {

    return map.put(o, PRESENT)==null;
}


HashMap为散列映射,它是基于hash table的一个实现,它可在常量时间内安插元素,或找出一组key-value pair.HashSet为散列集,它把查找时间看的很重要,其中所有元素必须要有hashCode()
HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)

HashSet, TreeSet都是集合类型,如果对存储的数据没有顺序要求,两者可混用;但TreeSet可以对存储的数据进行排序和滚动,适合处理对数据经常分析的情况。

其他如果要同步可以通过Collections来实现,如:

SortedSet chaterNameSet ;
SortedMap nameToBean ;
chaterNameSet = Collections.synchronizedSortedSet(new TreeSet()) ;
nameToBean = Collections.synchronizedSortedMap(new TreeMap()) ;
//返回一个被new TreeSet()支持的安全线程列表
chaterNameSet = Collections.synchronizedSortedSet(new TreeSet()) ;
//返回一个被new TreeMap()支持的安全线程映射
nameToBean = Collections.synchronizedSortedMap(new TreeMap()) ;
synchronizedSortedSet()和synchronizedSortedMap()被用来获得各种类集的同步(安全线程)拷贝。因为没有任何一个标准类集实现是同步的。必须使用同步算法来为其提供同步。
另一种观点:同步类集的迭代函数必须在synchronized块内使用

 

分享到:
评论

相关推荐

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    Java集合框架完整说明便于了解集合

    java集合在日常开发中经常用到,对基础的掌握尤其重要,其中List,Set,Map的作用以及使用的场景和分类描述,其中Arraylist 与 LinkedList 区别,HashSet与TreeSet与LinkedHashSet对⽐,LinkedHashMap和HashMap,...

    java源码整理包-集合

    java源码整理包:list,map,ArrayList,HashMap,HashSet,Hashtable,TreeMap,TreeSet,Vector等源码包分享

    Java集合多线程安全.docx

    Java集合多线程安全 线程安全与不安全集合 线程不安全集合: ArrayList LinkedList HashMap HashSet TreeMap TreeSet StringBulider 线程安全集合: Vector HashTable Properties 集合线程安全...

    实验05 Java集合.doc

    4)了解Map接口及主要实现类(HashMap、TreeMap、HashTable) 二、实验内容及步骤 1、编写程序练习将以下5个Person类的对象放在一个HashSet中。 姓名:张三 身份证号:178880001 姓名:王五 身份证号:178880002 ...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    Java集合详解4:HashMap和HashTable Java集合详解5:深入理解LinkedHashMap和LRU缓存 Java集合详解6:TreeMap和红黑树 Java集合详解7:HashSet,TreeSet与LinkedHashSet Java集合详解8:Java集合类细节精讲 JavaWeb

    实验七:Java集合与泛型

    本次实验掌握了集合的概念、体系结构、分类及使用场景,了解了Set接口及主要实现类(HashSet、TreeSet),了解了解List接口及主要实现类(ArrayList、LinkedList、Vector),掌握ArrayList的使用及其与Vector的区别,...

    Java 基础核心总结 +经典算法大全.rar

    HashMap LinkedHashMap TreeMap WeakHashMap Hashtable Collection 集合体系详解 Set 接口 AbstractSet 抽象类SortedSet 接口HashSet LinkedHashSet TreeSet List 接口 AbstractList 和 AbstractSequentialList ...

    软通动力面试题集

    3. Map:键值对的集合接口,常用的实现类有 HashMap、TreeMap 和 Hashtable。HashMap 是非同步的,Hashtable 是同步的。 遍历 Map 的方法 遍历 Map 的方法可以使用 Map 接口提供的 entrySet() 方法,或者使用 ...

    JAVA中常用的集合类型

    Map 接口的实现类有 HashMap、Hashtable、LinkedHashMap、Properties 和 TreeMap 等集合类。 Java 中的集合类型提供了多种方式来存储和操作数据,开发者可以根据需要选择合适的集合类型来实现自己的应用程序。

    Collection,List,Set和_Map用法和区别

    Map 的实现类有 Hashtable、HashMap、LinkedHashMap 和 TreeMap。Hashtable 是一种线程安全的哈希表,HashMap 是一种线程不安全的哈希表,LinkedHashMap 是一种链表哈希表,TreeMap 是一种树形哈希表。 在实际应用...

    Java超详细!Java实现数据结构PPT课件

    复杂度 时间复杂度 空间复杂度 ...集合(TreeSet)、映射(TreeMap) 哈夫曼树 Trie 线性+树形数据结构 集合(HashSet) 映射(HashMap、LinkedHashMap) 二叉堆(BinaryHeap) 优先级队列(PriorityQueue)

    java8源码-JavaRobot:Java学习笔记,JavaLearningNote

    java8 源码 学习笔记(持续更新中) ...Hashtable Set源码系列 HashSet LinkedHashSet TreeSet HashSet Concurrent源码系列 待完善 JVM(Java虚拟机) 类加载 垃圾回收算法 JavaConcurrent(Java并发系列) 【Java并发系列】

    超全Java集合框架讲解.md

    超全Java集合框架讲解 - 超全Java集合框架讲解 - 集合框架总览 - Iterator Iterable ListIterator - Map 和 Collection 接口 - Map 集合体系详解 - HashMap - LinkedHashMap - TreeMap - WeakHashMap - ...

    Java 容器.pdf_电子版pdf版

    1. Set:不允许重复的集合,常用的实现类有 HashSet、TreeSet、LinkedHashSet 等。 * HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。 * TreeSet:基于红黑树实现,支持有序性操作,但查找效率不如 ...

    Java容器有两种基本类型Collection 和 Map

    在使用散列的数据结构(HashSet、HashMap、LinkedHashSet 或者 LinkedHashMap)时,最好先覆盖 hashCode() 和 equals(),因为从 Object 继承下来的 hashCode() 方法默认是使用对象的地址计算散列值。 hashCode 对于...

    程序员需要经常刷题吗-simple-java-zh-CN:SimpleJava是Java常见问题的集合。中文翻译

    HashSet 与 TreeSet 与 LinkedHashSet HashMap vs. TreeMap vs. HashTable vs. LinkedHashMap 按值排序地图 高效计数器 HashMap 常用方法。例如,按值排序 深入理解Arrays.sort(T[], Comparator &lt; ? super T &gt; c)...

    javabitset源码-JerrySoundCode:杰瑞声码

    HashSet (done) TreeSet (done) LinkedHashSet (done) BitSet (done) Map HashMap (done) Hashtable (done) Properties (done) LinkedHashMap (done) IdentityHashMap (done) TreeMap (done) WeakHashMap (done) ...

    DataStructureJava:主要数据结构——java中的简单实现

    interface Map&lt;Key&gt; TreeMap&lt;K&gt; HashMap&lt;K&gt; LinkedHashMap&lt;K&gt; Hashtable&lt;K&gt; extends Dictionary&lt;K&gt; - JDK 1.0 接口 Set TreeSet HashSet 树特里================== 问题: 如何使用两个堆栈实现队列? 答案:...

    Java容器.xmind

    HashSet 标记: class CRUD : boolean add​(E e) boolean remove​(Object o) 底层哈希表,基于hashCode的equals的比较方式,线程不安全,存取速度快。 SortedSet 标记: interface TreeSet 标记: class 实现...

Global site tag (gtag.js) - Google Analytics