各种List、Map、Set的比較
前言:Java中用不同的数据结构(哈希表/动态数组/平衡树/链表)实现了不同的集合接口(List/Map/Set)。大多数情况下,集合类被用于不须要线程安全地环境,所以后来的集合实现都没有再採用同步以便执行更快,而之前老的实现如Vector、HashSet则保留了同步特性。
List:List接口继承自Collection,是有序的(有序与排序不同,有序是指集合中元素保持插入时的顺序,而排序是指按对象大小安排位置)。
1.【动态数组】ArrayList:擅长随机元素訪问。使用数组存储。ArrayList会比Vector快,他是非同步的,假设设计涉及到多线程。还是用Vector比較好一些。
优势在于动态的增长数组,很适合初始时总长度未知的情况下使用。实现了可变大小的数组。它同意全部元素,包含null。 每一个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断加入新元素而自己主动添加。可是增长算法并未定义。当须要插入大量元素时,在插入前能够调用ensureCapacity方法来添加ArrayList的容量以提高插入效率;
2.【动态数组】Vector:其方法都是同步的。除非须要同步的场合。否则基本被其同门师弟ArrayList替代;
3.【动态数组】Stack:实现了先入后出(FILO)。这样的特性比較特殊,所以在新的集合库中没有直接相应的类。
4.【链表】LinkedList:双向列表存储,优势在于在中间位置插入和删除操作,速度是最快的。LinkedList实现了List接口,同意null元素。
此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque);
Map:Map中的键是绝对不能反复的,实现了Map接口的集合类能够用来高速检索数据。建议使用不可变类作为Map的key(原因见下HashSet表述)。
1.【哈希表】HashMap:Map中訪问速度最快。是Hashtable的轻量级实现(非线程安全的实现)。他们都完毕了Map接口。主要差别在于HashMap同意空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。同意将null作为一个entry的key或者value,而Hashtable不同意。
把Hashtable的contains方法去掉了,改成containsvalue和containsKey。由于contains方法easy让人引起误解。
当我们将键值对传递给 put ()方法时,它调用键对象的
hashCode ()方法来计算 hashcode,让后找到 bucket 位置来储存值对象。
当获取对象时。通过键对象的 equals ()方法找到正确的键值对。然后返回值对象。
2.【哈希表】LinkedHashMap:是有序的(即依照插入顺序排列);
3.【哈希表】IdentityHashMap:
4.【哈希表】Hashtable:其方法都是同步的,除非须要同步的场合,否则基本被其同门师弟HashMap替代。继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。其方法是Synchronize的,而HashMap不是。在多个线程訪问Hashtable时。不须要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(假设是ArrayList:List lst = Collections.synchronizedList(new ArrayList());假设是HashMap:Map
map = Collections.synchronizedMap(new HashMap());)。
Hashtable和HashMap採用的hash/rehash算法都大概一样。所以性能不会有非常大的差异;
5.【平衡树】TreeMap:实现了SortedMap。能够提供排序功能。
6.SortedMap:由TreeMap实现。元素是排序的。其键值对按键的升序排列,依照Map.Entry中key来排序。
Set:Set和Collection最大的差别是Set不能有反复的元素,而Collection能够。
建议使用不可变类作为set的元素(原因见下HashSet表述)。
1.【哈希表】HashSet:Set中訪问速度最快。原则上Set不能有反复的元素,但如果HashSet插入不同元素后,又将2个元素改成相同值也能够(这样的属于没有定义行为。即Set的各个实现能够自行处理这样的情况,能够报异常也能够如HashSet般不闻不问,可是这样的没有定义行为应尽量避免,而避免的方法就是使得插入的元素不可改动,也即使得元素为不可变类,Map也有相同问题)。
2.【哈希表】LinkedHashSet:是有序的(即依照插入顺序排列);
3.【平衡树】TreeSet:实现了SortedSet。能够提供排序功能;
4.SortedSet:由TreeSet实现,元素是排序的,按升序排列的(排序与有序不同。见上述)。
小结:对于查找、插入和删除,哈希表的平均性能优于平衡树,由于对于查找而言后者要在平衡树的分支中不断查找,对于增删后者要不断调整数结构以维持平衡。
=========================================================
Iterator和ListIterator的差别:
- ListIterator有add()方法。能够向List中加入对象,而Iterator不能;
- ListIterator和Iterator都有hasNext()和next()方法,能够实现顺序向后遍历。可是ListIterator有hasPrevious()和previous()方法,能够实现逆向(顺序向前)遍历。
Iterator就不能够;
- ListIterator能够定位当前的索引位置,nextIndex()和previousIndex()能够实现。Iterator没有此功能。
- 都可实现删除对象,可是ListIterator能够实现对象的改动,set()方法能够实现。
Iierator仅能遍历,不能改动。
Hashmap怎样同步。有两种选择:
- 使用Collections.synchronizedMap(..)来同步HashMap。
- 使用ConcurrentHashMap,首选是使用ConcurrentHashMap,这是由于我们不须要锁定整个对象。以及通过ConcurrentHashMap分区地图来获得锁。
IdentityHashMap和HashMap的差别:
- 在HashMap中假设两个元素是相等的。则key1.equals(key2);
- 在IdentityHashMap中假设两个元素是相等的,则key1 == key2。
小结:Iterator是全部集合间的粘合剂,长处在于被全部集合类型所支持,能够编写通用的代码。
=========================================================
选择不同数据结构的关注点:查询、插入、删除、元素的唯一性、元素的次序、元素是否有必须定义的方法、线程安全性
各种List、Map、Set的比較的更多相关文章
- java Map 之 排序(key,value)
一:起因: (1)现实中须要Map容器进行排序的情况非常多非常多:由于Map<key,value>键值对的存储结构特别是HashMap的结构是非常优秀的,数据存储就难免对其进行排序: (2 ...
- 从头认识java-15.7 Map(7)-TreeMap与LinkedHashMap
这一章节我们来讨论一下Map两个比較经常使用的实现:TreeMap与LinkedHashMap. 1.TreeMap 特性:依照key来排序 package com.ray.ch14; import ...
- map和string的使用方法
这个是别人写的map使用方法比較好能够看一下 http://www.cnblogs.com/anywei/archive/2011/10/27/2226830.html 怎样向数组中插入内容 http ...
- 一张图让你看清Java集合类(Java集合类的总结)
如今关于Java集合类的文章非常多,可是我近期看到一个非常有意思图片,基本上把Java集合的整体框架都给展现出来了.非常直观. watermark/2/text/aHR0cDovL2Jsb2cuY3N ...
- Redis具体解释
redis 学习指南 一.介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.一个高性能的key-value数据库.并提供多种语言的API.说到Key-Val ...
- Scala之集合Collection
概述 Scala的集合类能够从三个维度进行切分: 可变与不可变集合(Immutable and mutable collections) 静态与延迟载入集合 (Eager and delayed ev ...
- ACM-百度之星资格赛之Labyrinth——hdu4826
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 一个JSP结果页面tomcat内存溢出
如今,试验组的同事寻找新能源我看到一个奇怪的现象.一个tomcat应用,内只有一个简单的jsp页面,和这个jsp无论是什么页java代码(我想用这个jsp在她的网页测试server一对tomcat的最 ...
- Java里多个Map的性能比較(TreeMap、HashMap、ConcurrentSkipListMap)
问题 比較Java原生的 1. TreeMap 2. HashMap 3. ConcurrentSkipListMap 3种Map的效率. 结果 模拟150W以内海量数据的插入和查找,通过添加和 ...
随机推荐
- openwrt针对RT5350代码下载,配置和编译
转载地址:http://blog.csdn.net/dean_gdp/article/details/37091685 近期买了块官方板的RT5350: 先介绍代码下载.下面命令都是用登录用户运行,无 ...
- RabbitMQ从入门到精通
RabbitMQ从入门到精通 学习了:http://blog.csdn.net/column/details/rabbitmq.html RabbitMQ是AMQP(advanced message ...
- Android Cursor浅析
1. 本文目的 Android ContentProvider提供了进程间数据交换的一种机制.而数据库的查询就是这样的机制的应用.那么app通过Uri查询数据库而得到的Cursor到底是个什么东西?为 ...
- 转换Arcgis Server REST接口实现OL2直接调用
概述: 本文解说怎样通过Arcgis Server REST 的导出地图(Export)接口.实如今OL2中直接以WMS的方式调用Arcgis Server REST服务. 实现思路: 1.rest的 ...
- MAME 0.201 发布,重温童年的街机模拟器
MAME 0.201 已发布,MAME 最初是街机模拟器,随着时间的推移,MAME 吸收了姊妹项目 MESS(多机种模拟器超级系统),所以 MAME 现在还记录了各种各样的(大多是老式的)电脑游戏.掌 ...
- Redis学习笔记(七) 基本命令:Set操作
原文链接:http://doc.redisfans.com/set/index.html 虽然set和list很相似但还是有一些差别的,如set中的顺序没有先后之分,所以不像list一样可以在首尾增删 ...
- Spark任务调度
不多说,直接上干货! Spark任务调度 DAGScheduler 构建Stage—碰到shuffle就split 记录哪个RDD 或者Stage 输出被物化 重新提交shuffle 输出丢失的sta ...
- vue 2.x axios 封装的get 和post方法
import axios from 'axios' import qs from 'qs' export class HttpService { Get(url, data) { return new ...
- 用过的jQuery记录
var list= $('input:radio[name="name"]:checked').val(); //选择input中单选name为“name”的并且是选中状态的 in ...
- web.xml中的url-pattern写法规则及匹配过程
servlet和filter在javaEE开发中很常用,因此有必要知道web.xml文件映射的规则 1. 写法 ①完全匹配:以“/”开头,以字母(非“*”)结束 如:<url-patte ...