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, 但是内部无序。
这篇文章写的相当好
另外,慎用ArrayList的contains方法(内部indexOf),使用HashSet的contains方法代替(内部Hashtable)
接下来超叼,我抄的,侵删:
[align=left]注意,这里展示的类都是非线程安全的。如果需要考虑线程安全,应该使用ConcurrentMap,CopyOnWriteArrayList,CopyOnWriteArraySet等。[/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
首先考虑的是,是否有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]① 如果涉及到堆栈,队列等操作,应该考虑用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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树