文档章节

数据结构(集合和数组)

微尘鉴
 微尘鉴
发布于 2016/02/22 14:48
字数 1275
阅读 50
收藏 1

在使用JAVA的时候经常用到集合类(有时也称容器类),下面对常用的容器类进行一下总结。首先看一张图,了解一下集合类的结构以及他们之间的关系:

一、Collection接口

    Collection接口是 Set List 和 Queue 接口的父接口,提供了多数集合常用的方法声明,包括 add()remove()contains() size() iterator() 等。

    其中各个方法的具体用法就不再一一介绍了。

二、几个比较重要的接口和类的介绍

1List接口

    List 关心的是索引,与其他集合相比,List特有的就是和索引相关的一些方法:get(int index) 、 add(int index,Object o) 、 indexOf(Object o) List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组;另外List允许有相同的元素。

    ArrayList 可以将它理解成一个可增长的数组,它提供快速迭代和快速随机访问的能力,其底层使用数组实现的,查询效率较高,但是增删效率低且是线程不安全的。

    LinkedList 中的元素之间是双链接的,当需要快速插入和删除时LinkedList成为List中的不二选择,其底层使用双向循环链表实现,查询效率低,但增删元素效率比较高。

    Vector ArrayList的线程安全版本,性能比ArrayList要低,现在已经很少使用。

2Set接口

    Set关心唯一性,它不允许重复。

    HashSet 当不希望集合中有重复值,并且不关心元素之间的顺序时可以使用此类,使用哈希算法实现。

    LinkedHashset 当不希望集合中有重复值,并且希望按照元素的插入顺序进行迭代遍历时可采用此类。

    TreeSet 当不希望集合中有重复值,并且希望按照元素的自然顺序进行排序时可以采用此类。(自然顺序意思是某种和插入顺序无关,而是和元素本身的内容和特质有关的排序方式,譬如“abc”排在“abd”前面。)

3Queue接口

    Queue用于保存将要执行的任务列表。

    LinkedList 同样实现了Queue接口,可以实现先进先出的队列。

    PriorityQueue 用来创建自然排序的优先级队列。

4Map接口

    Map关心的是唯一的标识符。他将唯一的键映射到某个元素。当然键和值都是对象。

    HashMap 当需要键值对表示,又不关心顺序时可采用HashMap,线程不安全,允许keyvalueNULL

    Hashtable 注意Hashtable中的t是小写的,它是HashMap的线程安全版本,不允许keyvalueNULL

    LinkedHashMap 当需要键值对,并且关心插入顺序时可采用它。

    TreeMap 当需要键值对,并关心元素的自然排序时可采用它。

 注:相关链接

.Java常用集合比较及使用场景

1.List类和Set
 List类和Set类是Collection集合接口的子接口。
 Set子接口:无序,不允许重复。
 List子接口:有序,可以有重复元素。

 SetList对比: 
 Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。 
 List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。 

 SetList具体子类: 
 Set 
 |————HashSet:以哈希表的形式存放元素,插入删除速度很快。 

 List 
 |————ArrayList:动态数组 
 |————LinkedList:链表、队列、堆栈。

 Arrayjava.util.Vector 
 Vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。

 2.HashMapHashTable
 a.HashMap去掉了HashTablecontains方法,但是加上了containsValue()containsKey()方法。
 b.HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。
 c.HashMap允许空键值,而HashTable不允许。

3.线程安全集合类与非线程安全集合类 
 LinkedListArrayListHashSet是非线程安全的,Vector是线程安全的;
 HashMap是非线程安全的,HashTable是线程安全的;
 StringBuilder是非线程安全的,StringBuffer是线程安全的。

4.集合适用场景
 对于查找和删除较为频繁,且元素数量较多的应用,SetMap是更好的选择
 ArrayList适用于通过为位置来读取元素的场景
 LinkedList 适用于要头尾操作或插入指定位置的场景
 Vector 适用于要线程安全的ArrayList的场景
 Stack 适用于线程安全的LIFO场景
 HashSet 适用于对排序没有要求的非重复元素的存放
 TreeSet 适用于要排序的非重复元素的存放
 HashMap 适用于大部分key-value的存取场景
 TreeMap 适用于需排序存放的key-value场景

注:相关链接

 

本文转载自:

上一篇: XML和Json使用
微尘鉴
粉丝 8
博文 80
码字总数 30075
作品 0
海淀
高级程序员
私信 提问
java数组、集合和数据结构知识*

一、数据结构知识。数据结构分为逻辑结构和物理结构,下面是百度百科的数据结构知识。 数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关...

cjun1990
2015/06/27
71
0
利用线性表的顺序结构求集合的并、交、差、补(C语言实现)

昨天用数据结构中的线性表的顺序结构实现了关于集合的并、交、差、补的集合运算,做个记录,希望也能帮助到其他人。 一、算法分析   (1)用数组A,B,C,E表示集合。假定A={1,3,4,5,6...

Tim_JX
2014/03/24
12K
0
数组和链表结构(python)_1

本文的最新版本位于:https://github.com/iwhales/algorithmsnotes 转载请注明出处:https://www.jianshu.com/u/5e6f798c903a 参考:《数据结构(Python 语言描述)》- 第4章 数组和链表 在编...

曾翔翔
2018/07/27
0
0
阿里P7年终总结:Java之集合Collection总览

一、集合(Collection)介绍 1.1为什么需要Collection Java是一门面向对象的语言,就免不了处理对象 为了方便操作多个对象,那么我们就得把这多个对象存储起来 想要存储多个对象(变量),很容易就...

Java高级架构师
2018/12/12
0
0
ES6的Set和Map数据结构,由你制造

你造吗 每当去学习ES6的时候,我都会不由自主的打开阮一峰老师的《ES6入门》去学习和查找用法,相信大多数同学也都和我一样看过阮老师写的文章。 当然大家也都知道ES6里常用的API就那么些,不...

大灰狼的小绵羊哥哥
03/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Activity启动模式二

上篇文章Activity启动模式一主要介绍了Activity的四种启动模式,这些启动模式都是在AndroidManifest中进行配置的。除此之外,Android系统还通过Intent类提供了一些标志位,同样可以指定Activ...

ltlovezh
9分钟前
4
0
三原色还原

1、Color Filter Array — CFA 随着数码相机、手机的普及,CCD/CMOS 图像传感器近年来得到广泛的关注和应用。 图像传感器一般都采用一定的模式来采集图像数据,常用的有 BGR 模式和 CFA 模式...

天王盖地虎626
21分钟前
3
0
kubernetes pod exec接口调用

正文 一般生产环境上由于网络安全策略,大多数端口是不能为集群外部访问的。多个集群之间一般都是通过k8s的ApiServer组件提供的接口通信,如https://192.168.1.101:6443。所以在做云平台时,...

码农实战
58分钟前
8
0
3_数组

3_数组

行者终成事
今天
8
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部