文档章节

java集合框架

l
 linyaohua
发布于 2016/03/31 21:51
字数 1155
阅读 22
收藏 0

http://doc.okbase.net/picture/addon/2014/08/20/A192136220-94766.jpg

java的集合框架主要由Set、List、Map、(Queue)接口构成,其中List、Set继承了Collection接口,Map并没有继承Collection接口,而是自成了一套key-value的集合。需要注意的是Collection、Collections是有区别的,Collection是java集合框架里一个重要的抽象接口,该接口下实现了一系列集合类,而Colllections(java.util)则是一个服务于集合框架的一个实现类,或者说是工具类,提供了很多的方法供我们使用,而且不能被实例化,所有方法都已static的方式呈现。

Collection接口

Collection是最基本的集合接口,由它派生了Set、List接口,如果想要实现Collection接口,必须实现两个构造函数,一个是无参构造函数,一个是包含Collection的构造函数。

List接口

List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。

List的实现有两种数组类型、链表类型,对应的实现类分别是(ArrayList、Vector、Stack)、LinkedList。

LinkedList

LinkedList 底层实现是链表类型,所以插入、删除的效率会比数组类型的List要快,但是查询的效率就不及数组类型了。

通过LinkedList我们可以实现单双向队列以及堆栈的数据集合。

而LinkedList本身并没有实现线程同步,所以涉及多线程并发的时候,需要自己控制资源同步的问题,也可以通过

Listlist=Collections.synchronizedList(newLinkedList(...));建立List的同步机制。

ArrayList 底层实现是数组类型,在查询效率上会比链表型要高。

ArrayList没有实现线程同步,所以它也是线程不安全的。ArrayList初始化的时候可以指定或者分配默认长度,如果插入数据超出原有长度是,会按原长度的50%增长数组长度。也可以通过手动控制调整数组长度,增加数组的执行效率,制定数组长度可以通过ensureCapacity实现。

Vector

Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的 Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。

 Stack

Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

Set接口

HashSet : 它不允许出现重复元素;不保证和政集合中元素的顺序,可以自己做个例子可以看出加入的字段顺序跟遍历出的不一样,允许包含值为null的元素,但最多只能有一个null元素(不允许重复嘛!)。

TreeSet : 可以实现排序等功能的集合,它在讲对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中,并保证该集合元素组成按照“升序”排列。

a)(在对大量信息进行检索的时候,TreeSet比AraayList更有效率,能保证在log(n)的时间内完成)。

b)TreeSet是实用树形结构来存储信息的,每个节点都会保存一下指针对象,分别指向父节点,左分支,右分支,相比较而言,ArrayList就是一个含有元素的简单数组了,正因为如此,它占的内存也要比ArrayList多一些。

c)想TreeSet插入元素也比ArrayList要快一些,因为当元素插入到ArrayList的任意位置时,平均每次要移动一半的列表,需要O(n)的时间, 而TreeSet深度遍历查询花费的实施只需要O(log(n))(普遍的都是,set查询慢,插入快,list查询快,插入满, .

LinkedHashSet : 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。



© 著作权归作者所有

共有 人打赏支持
l
粉丝 0
博文 5
码字总数 3006
作品 0
广州
私信 提问

暂无文章

&和&&,==和equals的区别

&和&& 相同点:都可以表示逻辑与(and),当运算符两边的结果都为true时,结果才为true,只要有一边为false,结果就为false。 不同点:&&还有短路的作用,即如果第一个表达式的结果为false,就...

森林之下
20分钟前
2
0
我和 Spring 大神的一天

摘要: 先介绍一下故事的5位主人公。 Josh Long 龙之春:Spring 技术布道师,撰写过5部著作,录制过3部畅销的培训视频,是一位开源软件贡献者。 Spencer Gibb:Spring 技术布道师,Spring Cl...

阿里云官方博客
23分钟前
1
0
【Zookeeper】源码分析目录(保存)

https://www.cnblogs.com/leesf456/p/6518040.html

Java搬砖工程师
26分钟前
2
0
vue-cli图片路径使用

https://www.cnblogs.com/minigrasshopper/p/8011630.html

LM_Mike
27分钟前
2
0
前方高能,重要通知!明珠不蒙尘,有才你就来。

11月开源众包服务之星计划--开发商招募正式开启了! 您还是否在为能接更多的订单而操碎了心? 开源众包即将迎来三周年华诞,重磅上线服务之星品牌计划。你有强大的技术实力?你有丰富的案例经...

开源中国众包平台
29分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部