各种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以内海量数据的插入和查找,通过添加和 ...
随机推荐
- C++ 嵌入汇编程序提高计算效率
因为汇编语言比C++更接近硬件底层,所以在性能要求高的程序中往往能够採取在C++代码中嵌入汇编的方式来给程序提速. 在VC中能够简单的通过 __asm { //在这里加入汇编代码 } 来实现. 以下通 ...
- 自己定义控件三部曲之动画篇(十三)——实现ListView Item进入动画
前言:宝剑锋从磨砺出,梅花香自苦寒来 相关文章: <Android自己定义控件三部曲文章索引>: http://blog.csdn.net/harvic880925/article/det ...
- HDU 2181 DFS
Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每一个城市刚好一次后回到出发的城市. Input 前20行的第i行有3 ...
- 学艺不精而惭愧--论C++模板类的使用
自己断断续续地使用C++也有一段时间了.有些时候产生了自满的情绪.觉得自己对C++的语言特性已经知道的几乎相同了,在语法方面没有什么难倒我的地方了,如今所要做的是依据实际问题编敲代码,问题的难点在于算 ...
- DNS递归查询和迭代查询的差别
转载地址:http://blog.csdn.net/wuchuanpingstone/article/details/6720723 递归查询和迭代查询的差别 (1)递归查询 递归查询是一种DNS s ...
- 0x04 二分
二分.三分其实没什么.. 但是真心觉得市面上的朴素二分打法千奇百怪,假如是像我的标程应该是比较稳妥的,然而poj2018那题(前缀和又想起来了)是向下取整,精度有点问题(经常拍出一些什么xxx.999 ...
- Ubuntu16.04系统安装搜狗输入法
前言:正常双击.deb软件包安装搜狗输入法会有bug,需要按照下面操作进行消除错误. 一.下载搜狗输入法Linux版软件包 下载地址为:http://pinyin.sogou.com/linux/ , ...
- 。net内存优化
1.尽量减少和避免不必要的对象 2.优化算法和数据结构 3.采用非托管代码或者模块编写数据处理逻辑 4.NET应用程序的内存一定程度上受垃圾回收的影响.并指出,一些数据结构如List,系统会分配多余的 ...
- 3Ds Max实例教程-制作女战士全过程
3Ds Max制作“女战神” 作者:Diego Rodríguez 使用软件:3Ds Max,Photoshop 3Ds Max下载:http://wm.makeding.com/iclk/?zone ...
- ZBrush软件如何编辑物体
新手在刚接触ZBrush®的时候,想要选中模型进行编辑,有时怎么都选不中,当再次画的时候只能在边上新建一个,还是不能进行编辑,遇到类似问题,你是如何解决的,本文将为您讲解ZBrush中怎么选中物体并进 ...