您的位置:首页 > 编程语言 > Java开发

HashMap,HashSet,Hashtable,Vector,ArrayList 笔记

2016-03-22 11:16 537 查看
这几个都是常见的,但是问题是,什么情况下该用哪一个是个问题。

首先考虑的是,是否有key!

Vector和ArrayList区别在于Vector是个线程安全的,而ArrayList不是。

ArrayList没办法设置自增大小,vector可以。(Vector默认自增一倍的长度,ArrayList则是默认自增一半的长度)

感觉差别不算太大。都是list。

Hashtable是线程安全的,HashMap不是线程安全的(除非SynchronizedMap和ConcurrentHashMap)

HashMap允许在Key和Value中都出现null值。

HashSet对外是“类”的集合,类似list,内部维护了一个HashMap(hashCode和类本身).

Set 可以有一个null, 但是内部无序。

╔═══════════════════╦══════════════════════╦═════════════════════════════╗
║                   ║         List         ║            Set              ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║     Duplicates    ║          YES         ║            NO               ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║       Order       ║       ORDERED        ║  DEPENDS ON IMPLEMENTATION( TreeSet  ║LinkedHashSet )
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Positional Access ║         YES          ║            NO               ║
╚═══════════════════╩══════════════════════╩═════════════════════════
http://blog.csdn.net/speedme/article/details/22485681
这篇文章写的相当好

另外,慎用ArrayList的contains方法(内部indexOf),使用HashSet的contains方法代替(内部Hashtable)

接下来超叼,我抄的,侵删:

[align=left]注意,这里展示的类都是非线程安全的。如果需要考虑线程安全,应该使用ConcurrentMap,CopyOnWriteArrayList,CopyOnWriteArraySet等。[/align]
[align=left]接口[/align]
[align=left]实现类[/align]
[align=left]保持插入顺序[/align]
[align=left]可重复[/align]
[align=left]排序[/align]
[align=left]使用说明[/align]
[align=center] [/align]
[align=center]List[/align]
[align=left]ArrayList[/align]
[align=left]Y[/align]
[align=left]Y[/align]
[align=left]N[/align]
[align=left]长于随机访问元素;但插入、删除元素较慢(数组特性)。[/align]
[align=left]LinkedList[/align]
[align=left]Y[/align]
[align=left]Y[/align]
[align=left]N[/align]
[align=left]插入、删除元素较快,但随即访问较慢(链表特性)。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]Set[/align]
[align=left]HashSet[/align]
[align=left]N[/align]
[align=left]N[/align]
[align=left]N[/align]
[align=left]使用散列,最快的获取元素方法。[/align]
[align=left]TreeSet[/align]
[align=left]N[/align]
[align=left]N[/align]
[align=left]Y[/align]
[align=left]将元素存储在红-黑树数据结构中。默认为升序。[/align]
[align=left]LinkedHashSet[/align]
[align=left]Y[/align]
[align=left]N[/align]
[align=left]N[/align]
[align=left]使用散列,同时使用链表来维护元素的插入顺序。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]Map[/align]
[align=left]HashMap[/align]
[align=left]N[/align]
[align=left]N[/align]
[align=left]N[/align]
[align=left]使用散列,提供最快的查找技术。[/align]
[align=left]TreeMap[/align]
[align=left]N[/align]
[align=left]N[/align]
[align=left]Y[/align]
[align=left]默认按照比较结果的升序保存键。[/align]
[align=left]LinkedHashMap[/align]
[align=left]Y[/align]
[align=left]N[/align]
[align=left]N[/align]
[align=left]按照插入顺序保存键,同时使用散列提高查找速度。[/align]
[align=left]总结[/align]
[align=left]① 如果涉及到堆栈,队列等操作,应该考虑用List。如果要进行大量的随机访问,应使用ArrayList;如果经常进行插入与删除操作,用使用LinkedList。[/align]
[align=left]② HashMap设计用来快速访问;而TreeMap保持“键”始终处于排序状态,所以没有HashMap快。LinkedHashMap保持元素插入的顺序,但是也通过散列提供了快速访问能力。[/align]
[align=left]③ Set不接受重复元素。HashSet提供最快的查询速度,而TreeSet保持元素处于排序状态。LinkedHashSet以插入顺序保存元素。[/align]
[align=left]④ 对哈希表的操作,作为key的对象要正确重写equals和hashCode方法。[/align]
[align=left]⑤ 尽量返回接口而非实际的类型(针对抽象编程),如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。[/align]
[align=left]⑥ 程序中不应该使用过时的Vector\Hashtable\Stack。[/align]
[align=left]
[/align]
来自:http://zhangjunhd.blog.51cto.com/113473/69677
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java