2023年6月20日发(作者:)

之Java中HashMap和Hashtable及HashSet的区别

Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空〔non-null〕的对象都可作为key或value。 添加数据利用put(key,value),掏出数据利用get(key),这两个根本操作的时间开销为常数。

Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。

利用Hashtable的简单例如如下,将1,2,3放到Hashtable中,他们的key别离是〞one〞,〞two〞,〞three〞:

Hashtable numbers = new Hashtable();

(“one〞, new Integer(1));

(“two〞, new Integer(2));

(“three〞, new Integer(3));

要掏出一个数,例如2,用相应的key:

Integer n = (Integer)(“two〞);

(“two = 〞 + n);

由于作为key的对象将通过计算其散列函数来肯定与之对应的value的位置,因此任何作为key的对象都必需实现hashCode和equals方式。hashCode和equals方式继承自根类Object,若是你用自概念的类看成key的话,要相当小心,依照散列函数的概念,若是两个对象一样,即(obj2)=true,那么它们的hashCode必需一样,但如果是两个对象不同,那么它们的hashCode不必然不同,若是两个不同对象的hashCode一样,这种现象称为冲突,冲突会致使操作哈希表的时间开销增大,所以尽可能概念好的hashCode()方式,能加速哈希表的操作。

若是一样的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果〔期待的get方式返回null〕,要避免这种问题,只需要牢记一条:要同时复写equals方式和hashCode方式,而不要只写其中一个。 Hashtable是同步的。

HashMap类

HashMap和Hashtable类似,不同的地方在于HashMap是非同步的,而且允许null,即null value和null key。,可是将HashMap视为Collection时〔values()方式可返回Collection〕,其迭代子操作时间开销和HashMap的容量成比例。因此,若是迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得太高,或load factor太低。

WeakHashMap类

WeakHashMap是一种改良的HashMap,它对key实行“弱引用〞,若是一个key再也不被外部所引用,那么该key可以被GC回收。

HashSet请参考对Set的描述

Set是一种不包括重复的元素的Collection,即任意的两个元素e1和e2都有(e2)=false,Set最多有一个null元素。

Set的构造函数有一个约束条件,传入的Collection参数不能包括重复的元素。

重点:必需小心操作可变对象〔Mutable Object〕。若是一个Set中的可变元素改变了自身状态致使(Object)=true将致使一些问题。

两个通用Set实现是HashSet和TreeSet。要决定用哪个,那是超级简单明了的。HashSet要快得多(对大多数操作是常数时间之于对数时间〔constant time vs. log time〕), 但不提供排序保证。若是你需要利用 SortedSet 中的操作,或按顺序迭代对你来讲是重要的,那么请利用 TreeSet。 否那么,利用 HashSet。 在大多数时间都不利用 HashSet ,对你来讲是个公平的赌博。

关于HashSet,有一件事应该牢记,即就条款数和容量之和来讲,迭代是线性的。因此,若是迭代性能很重要,那就应该慎重选择一个适当的初始容量。容量选得太大,既浪费空间,也浪费时间。 默许的初试容量是101, 一般来讲,它比你所需要的要多。可利用 int 构造函数来指定初始容量。要分派 HashSet 的初始容量为17:

Set s= new HashSet(17);

HashSets还有一个称作 装载因数〔load factor〕的"调整参数〔tuning parameter〕" 。若是你超级在意你的HashSet的空间的利用,请阅读HashSet文本以获取详细信息。否那么,就利用默许值吧。若是你经受默许装载因数,但你确实又想指定初始容量,那么,选一个大约是你期望你的 Set 将增加到的容量的两倍的数。若是你的猜想不着边,它也可以增加,或只是浪费一点空间。但都没有大问题。若是你知道有关正确尺寸的一个最正确值,用它吧;若是不知道,那就利用一个旧的值,或利用一个偶数值。它真的不是超级重要。这些事情只能使 HashSet 稍稍变好一点点。

TreeSet没有调整参数。除clone之外,HashSet和TreeSet都仅有那些由它们各自的接口所要求的操作(Set和TreeSet),而没有任何别的操作。

本篇文章来源于黑马程序员官方论坛。

2023年6月20日发(作者:)

之Java中HashMap和Hashtable及HashSet的区别

Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空〔non-null〕的对象都可作为key或value。 添加数据利用put(key,value),掏出数据利用get(key),这两个根本操作的时间开销为常数。

Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。

利用Hashtable的简单例如如下,将1,2,3放到Hashtable中,他们的key别离是〞one〞,〞two〞,〞three〞:

Hashtable numbers = new Hashtable();

(“one〞, new Integer(1));

(“two〞, new Integer(2));

(“three〞, new Integer(3));

要掏出一个数,例如2,用相应的key:

Integer n = (Integer)(“two〞);

(“two = 〞 + n);

由于作为key的对象将通过计算其散列函数来肯定与之对应的value的位置,因此任何作为key的对象都必需实现hashCode和equals方式。hashCode和equals方式继承自根类Object,若是你用自概念的类看成key的话,要相当小心,依照散列函数的概念,若是两个对象一样,即(obj2)=true,那么它们的hashCode必需一样,但如果是两个对象不同,那么它们的hashCode不必然不同,若是两个不同对象的hashCode一样,这种现象称为冲突,冲突会致使操作哈希表的时间开销增大,所以尽可能概念好的hashCode()方式,能加速哈希表的操作。

若是一样的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果〔期待的get方式返回null〕,要避免这种问题,只需要牢记一条:要同时复写equals方式和hashCode方式,而不要只写其中一个。 Hashtable是同步的。

HashMap类

HashMap和Hashtable类似,不同的地方在于HashMap是非同步的,而且允许null,即null value和null key。,可是将HashMap视为Collection时〔values()方式可返回Collection〕,其迭代子操作时间开销和HashMap的容量成比例。因此,若是迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得太高,或load factor太低。

WeakHashMap类

WeakHashMap是一种改良的HashMap,它对key实行“弱引用〞,若是一个key再也不被外部所引用,那么该key可以被GC回收。

HashSet请参考对Set的描述

Set是一种不包括重复的元素的Collection,即任意的两个元素e1和e2都有(e2)=false,Set最多有一个null元素。

Set的构造函数有一个约束条件,传入的Collection参数不能包括重复的元素。

重点:必需小心操作可变对象〔Mutable Object〕。若是一个Set中的可变元素改变了自身状态致使(Object)=true将致使一些问题。

两个通用Set实现是HashSet和TreeSet。要决定用哪个,那是超级简单明了的。HashSet要快得多(对大多数操作是常数时间之于对数时间〔constant time vs. log time〕), 但不提供排序保证。若是你需要利用 SortedSet 中的操作,或按顺序迭代对你来讲是重要的,那么请利用 TreeSet。 否那么,利用 HashSet。 在大多数时间都不利用 HashSet ,对你来讲是个公平的赌博。

关于HashSet,有一件事应该牢记,即就条款数和容量之和来讲,迭代是线性的。因此,若是迭代性能很重要,那就应该慎重选择一个适当的初始容量。容量选得太大,既浪费空间,也浪费时间。 默许的初试容量是101, 一般来讲,它比你所需要的要多。可利用 int 构造函数来指定初始容量。要分派 HashSet 的初始容量为17:

Set s= new HashSet(17);

HashSets还有一个称作 装载因数〔load factor〕的"调整参数〔tuning parameter〕" 。若是你超级在意你的HashSet的空间的利用,请阅读HashSet文本以获取详细信息。否那么,就利用默许值吧。若是你经受默许装载因数,但你确实又想指定初始容量,那么,选一个大约是你期望你的 Set 将增加到的容量的两倍的数。若是你的猜想不着边,它也可以增加,或只是浪费一点空间。但都没有大问题。若是你知道有关正确尺寸的一个最正确值,用它吧;若是不知道,那就利用一个旧的值,或利用一个偶数值。它真的不是超级重要。这些事情只能使 HashSet 稍稍变好一点点。

TreeSet没有调整参数。除clone之外,HashSet和TreeSet都仅有那些由它们各自的接口所要求的操作(Set和TreeSet),而没有任何别的操作。

本篇文章来源于黑马程序员官方论坛。