java中List、Map、Set、Collection、Stack、Queue等的使用
java中这几个东西是比较常用的,虽然我用的不多,也正是因为用的不多,所以我一直搞不清楚他们之间的具体用法以及相互之间的关系,现在特单独作为一个东西来总结一下。
本文参考一下资料:
1.《java编程思想》一书第11章
2.http://blog.sina.com.cn/s/blog_a345a8960101k9vx.html
3.http://f51889920.iteye.com/blog/1884810
4.http://blog.csdn.net/speedme/article/details/22398395
5.http://www.tuicool.com/articles/qeEzym
6.http://blog.csdn.net/hguisu/article/details/7644395
在《java编程思想》一书中,这几个东西放到一章里面讲的,是在第11章。分了好多的小节去讲的,看了一会,看的头疼,但是基本上好多东西都可以明白,比较容易梳理。
首先放个图在前面,展示下他们各个集合类之间的关系,如下:

java集合框架的基本接口/类层次结构
java.util.Collection [I]
+--java.util.List [I]
+--java.util.ArrayList [C]
+--java.util.LinkedList [C]
+--java.util.Vector [C]
+--java.util.Stack [C]
+--java.util.Set [I]
+--java.util.HashSet [C]
+--java.util.SortedSet [I]
+--java.util.TreeSet [C] java.util.Map [I]
+--java.util.SortedMap [I]
+--java.util.TreeMap [C]
+--java.util.Hashtable [C]
+--java.util.HashMap [C]
+--java.util.LinkedHashMap [C]
+--java.util.WeakHashMap [C] [I]:接口
[C]:类
那么,为什么要有集合类?
面向对象的语言对事物的体现都是以对象的形式,为了方便对多个对象操作,就要对对象进行存储,集合类就是对多个对象进行存储的一种方式。
数组和集合类有何不同?
最主要的区别是长度可变不可变问题。数组可以存储对象,但是长度是固定的,不可变的。集合长度是可变的。其次,数组中可以存储基本数据类型,集合只能存储对象。集合的一个比较大的优点是可以存储不同类型的对象。数组不可以。
下面就开始各种总结。
Collection接口
Collection接口是最基本的集合接口,代表一组Object集合,这些Object被称作Collection的元素,所有实现Collection接口的类型必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素后一个构造函数允许用户复制一个Collection。这些都比较容易理解。
Collection<Integer> ci = new ArrayList<Integer>();
Collection<Integer> ci2 = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
并且注意Collection中没有get()方法,要想查看或者操作Collection中的元素只能遍历,使用的是iterator()方法,使用该方法可以逐一访问Collection的每一个元素。
Iterator it = collection.iterator();//获得迭代
while(it.hasNext()){
Object obj = it.next();//得到下一个元素
}
由上图可知,Collection分为Lst接口和Set接口。
List接口
List接口是有序的Collection,使用该接口能精确控制每个元素的插入位置,可以使用索引来访问List中的元素,跟数组是很类似的。并且List中允许有重复元素,当然有些List的实现类不允许重复元素的存在。
List中有iterator()方法,还有listIterator方法,返回一个ListIterator接口,这个接口比标准的Iterator接口相比,多了一些add之类的方法,允许添加、删除、设置元素值以及向前或者向后遍历等。
如上图,List下有几个常用类:LinkedList、ArrayList和Vector以及Stack。
(1)ArrayList类:实现了可变大小的数组。它允许包含所有元素,包括null。每个ArrayList实例都有一个容量,即用于存储元素的数组的大小,这个容量可以随着不断添加新元素而自动增加,但增长算法没有定义,当插入大量元素时,插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
(2)LinkedList类:允许null元素,提供额外的get,remove和insert方法,这使得LinkedList可以用作stack、queue或双向队列。它可以再List的中间插入和移除,在这方面比ArrayList有效,但是在随机访问方面就没有ArrayList有效了。如果多个线程同时访问一个List,则必须自己实现访问同步,一种解决方法是在创建List时构造一个同步的List:
List list = Collection.synchronizedList(new LinkedList(……));
(3)Vector类:Vector跟ArrayList非常类似,但是Vector是同步的,由Vector创建的Iterator,虽然和ArrayList创建的 Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。
(4)Stack类:继承自Vector,实现一个后进先出的栈。提供了几个基本方法,push、pop、peak、empty、search等。
总结:
- List:元素是有序的,元素可以重复。因为该集合体系有索引。
- ArrayList:底层的数据结构使用的是数据结构。
- 查询速度很快。
- 增删稍慢。
- 线程不同步。
- 默认长度为10增长率为50%。
- LinkedList:底层使用的链表数据结构。
- 增删速度很快。
- 查询稍慢。
- Vector:底层是数组数据结构。1.0出现
- 线程同步
- 被ArrayList替代了。
- 长度增长率100%。
Set接口
Set接口是继承自Collection的,它不能包含有重复元素。Set中最多有一个null元素。
java中List、Map、Set、Collection、Stack、Queue等的使用的更多相关文章
- Map java中的map 如何修改Map中的对应元素
Map java中的map 如何修改Map中的对应元素 Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象. Map的接口 Map ...
- Java中Set Map List 的区别
java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...
- Java开发知识之Java中的Map结构
Java开发知识之Java中的Map结构 一丶Map接口 Map没有实现Collection接口,提供的是Key 到Value的映射. Map中.不能包含相同的Key,每个Key只能映射一个Value ...
- Java中遍历Map集合的四种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- JAVA中关于Map的九大问题
通常来说,Map是一个由键值对组成的数据结构,且在集合中每个键是唯一的.下面就以K和V来代表键和值,来说明一下java中关于Map的九大问题. 0.将Map转换为List类型 在java中Map接口提 ...
- java中遍历map对象的多种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有ma ...
- java中遍历MAP,嵌套map的几种方法
java中遍历MAP的几种方法 Map<String,String> map=new HashMap<String,String>(); map.put("us ...
- 谈谈java中遍历Map的几种方法
java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个map public ...
- Java中的集合框架-Collection(二)
上一篇<Java中的集合框架-Collection(一)>把Java集合框架中的Collection与List及其常用实现类的功能大致记录了一下,本篇接着记录Collection的另一个子 ...
- javascript 实现java中的Map
javascript实现java中的Map,代码是在国外的一个网站上看到的(http://stackoverflow.com/questions/368280/javascript-hashmap-e ...
随机推荐
- JS 中 Date() 的其他操作集锦
好吧,这周完全是个业务型的程序猿了,明显地能感觉到洗头发时头皮都会有点疼,是秃顶的前兆. 算得上收获的就是有较多的接触到计算时间方面的事件...嗯,几个笔记分享一下 // 处理 /Date(" ...
- 前端之CSS进阶
一.CSS属性操作 1.背景属性 常用: background-color 规定要使用的背景颜色 background-image 规定要使用的背景图像 background-repeat 规定如何重 ...
- INSPIRED启示录 读书笔记 - 第9章 产品副经理
发现帮手 从本质上讲,产品就是创意,产品经理的职责是想出好点并加以实现.我们需要好点子,有些想法是我们自己的创意,但如果仅依靠自己,就会严重限制创意的发挥 做产品要找公司最聪明的人合作,发现公司里潜在 ...
- eclipse oxygen 版本(即为4.7版本)打开 could not create the java virtual machine问题
1.问题: could not create the java virtual machine 2.解决办法: 找到eclipse目录下的eclipse.ini文件.打开找到以下内容: -vmargs ...
- SG函数略解
由于笔者太懒,懒得把原来的markdown改成MCE,所以有很多奇怪的地方请谅解. 先说nim游戏. 大意:有n堆石子,两个人轮流取,每个人每次从任意一堆取任意个,直到一个人无法取了为止.问对于石子的 ...
- CentOS 7 安装 docker-compose
compose是用来在docker中定义和运行复杂应用的小工具,比如在一个文件中定义多个容器,只用一行命令就可以让一切就绪并运行. 安装pip: 这里显示,找不到相应的包?? 说没有python-pi ...
- QT 使用QPainter 绘制图形 和 世界变换 world transform
1. 绘制椭圆 饼状型 贝塞尔曲线 绘制图像重写方法 void paintEvent(QPaintEvent *event)即可. void Widget::paintEvent(QPaintEve ...
- cplusplus.com
1/ http://www.cplusplus.com/reference/map/multimap/find/ 2. C
- node express框架基本配置
node express框架基本配置 初始化项目 express -e 安装依赖包 npm install 安装第三方包 npm install xxx --save-dev dos 运行node a ...
- NSRegularExpression iOS自带的正则表达式
以前做验证邮箱,电话号码的时候通常用第三方的正则表达式或者NSPredicate(点这里查看以前的文章),在后期,苹果推出了自己的正则表达式来提供给开发者调用,很方便,功能也强大. 具体可以查看官方文 ...