浅谈Java的集合框架
浅谈Java的集合框架
一、 初识集合
重所周知,Java有四大集合框架群,Set、List、Queue和Map。四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Queue 关注事物被处理时的顺序,Map 关注事物的映射和键值的唯一性。其中前三类直接继承于Collection接口,Map单独为接口,他们的继承实现关系如下图所示。
二、 Collection接口
Collection接口是 Set 、List 和 Queue 接口的父接口,提供了多数集合常用的方法声明,包括 add()、remove()、contains()、size()、terator() 等,用法如下表所示
|
方法 |
含义 |
|
add(E e) |
将指定对象添加到集合中 |
|
remove(Object o) |
将指定的对象从集合中移除,移除成功返回true,不成功返回false |
|
contains(Object o) |
查看该集合中是否包含指定的对象,包含返回true,不包含返回flase |
|
size() |
返回集合中存放的对象的个数。返回值为int |
|
clear() |
移除该集合中的所有对象,清空该集合。 |
|
iterator() |
返回一个包含所有对象的iterator对象,用来循环遍历 |
|
toArray() |
返回一个包含所有对象的数组,类型是Object |
|
toArray(T[] t) |
返回一个包含所有对象的指定类型的数组 |
三、Set
Set关心唯一性,它不允许重复。
在Set的集合群中,Set接口继承Collection接口,然后抽象类AbstractSet实现Set接口。
HashSet 类
当不希望集合中有重复值,并且不关心元素之间的顺序时可以使用此类。
HashSet 类是继承AbstractSet抽象并实现Set接口的,其低层的存储结构是基于HashMap类实现的,即当往HashSet中添加一个元素时,其实HashSet是通过建立的HashMap集合并往里添加一个该元素(把该元素设为Key),因此也保证了HashSet集合的元素唯一性。以为HashMap集合是线程不安全的,所以HashSet集合也是线程不安全的。
TreeSet 类
当不希望集合中有重复值,并且希望按照元素的自然顺序进行排序时可以采用此类。(自然顺序意思是某种和插入顺序无关,而是和元素本身的内容和特质有关的排序方式,譬如“abc”排在“abd”前面。)
TreeSet类是继承抽象类AbstractSet类实现的,其低层是通过TreeMap类来实现的,因为TreeMap类是通过红黑树的结构实现的,所以TreeSet类也可以说是通过红黑树的结构实现的。
EnumSet 类
EnumSet是专门为枚举类设计的集合类,Enum中所有元素都必须是指定的枚举值,所有集合元素必须来自于同一个枚举类。EnumSet的集合元素也是有序的,以枚举值在Enum类内的定义顺序来决定集合元素的顺序。
EnumSet在内部以位向量的形式存储,这种形式非常紧凑、高效,因此EnumSet对象占用内存很小,而且运行效率很高,EnumSet是所有Set实现类中性能最好的。
EnumSet集合对于初学者可能是不很常用,这里我附一段其代码
enum Season{
spring,summer,fall,winter
}
public class EnumSetTest {
public static void main(String[] args) {
//创建一个EnumSet集合,集合元素就是Season的全部枚举值
EnumSet es = EnumSet.allOf(Season.class);
System.out.println(es);//输出为[spring, summer, fall, winter]
es.add(Season.spring);
System.out.println(es);//输出为[spring, summer, fall, winter]
//创建一个EnumSet的空集合,指定其集合元素是Season的枚举值
EnumSet es2 = EnumSet.noneOf(Season.class);
System.out.println(es2);//输出为[]
es2.add(Season.spring);
es2.addAll(es);//添加一个EnumSet
System.out.println(es);//输出为[spring, summer, fall, winter]
//以指定枚举值创建EnumSet
EnumSet es3 = EnumSet.of(Season.spring,Season.summer);
}
}
LinkedHashset 类
当不希望集合中有重复值,并且希望按照元素的插入顺序进行迭代遍历时可采用此类。这是HashSet的子类,对于插入、删除操作,LinkedList比HashSet要慢一些,因为要维护链表,但是由于有了链表结构,遍历LinkedList会更快。
其父类是HashSet,LinkedHashSet类的实现也依赖于其父类HashSet的结构与方法。
Set集合的性能分析
1、HashSet和TreeSet比较时,HashSet在数据的添加、查询等操作时性能高于TreeSet,因为TreeSet需要用红黑树算来维护集合元素的次序,只有需要集合元素保持排序时,才应该使用TreeSet集合。
2、Set 的三个实现类 HashSet、TreeSet和EnumSet都是线程不安全的。如果多线程并发操作Set集合,可以通过Collections工具类的synchronizedSortedSet 方法来包装该Set集合。
四、List
List 关心的是索引,与数组类似,但是List长度是可变的的,List集合也是可重复的,与其他集合相比,List特有的就是和索引相关的一些方法:get(int index) 、 add(int index,Object o) 、 indexOf(Object o) 。
在List 的集合群中,List接口直接继承Collection接口,然后抽象类AbstractList实现List接口。
ArrayList
可理解成一个可增长的数组,它提供快速迭代和快速随机访问的能力。ArrayList是基于数组实现的。ArrayList类继承AbstractList类实现。
LinkedList
当需要快速插入和删除时可选用LinkedList。LinkedList是基于双端链表结构实现的,提供双端队列和栈的功能。
Vector
是ArrayList的线程安全版本,性能比ArrayList要低,现在已经很少使用
更好的使用List集合:
1、如果需要遍历集合元素,对于ArrayList和Vector集合,由于这两类集合使用数组来实现(封装了一个动态的、允许再分配的Object[] 数组),所以使用随机访问方法 get性能更好(get(key)通过索引数组下标来获得元素);对于LinkedList集合,因为其结构是基于链的线性表,所以用迭代器Iterator来遍历集合元素,如下
for(Iterator it = collection.iterator(); it.hasNext();) {
Object o = it.next();
}
2、如果需要经常执行插入、删除来操作已包含大量数据的List集合,建议使用LinkedList集合,其只需增加删除一个节点即可,高效快捷;而对于ArrayList和Vector的插入、删除操作,则需要重新分配数组大小及移动数据,效果较差。
3、如果有多个线程同时访问List集合时,ArrayList、LinkedList等集合时线程不安全的,虽然Vector集合线程安全,但是性能极低,这是我们需要使用Collections讲集合包装成线程安全的集合。
五、Queue
Queue关注事物被处理时的顺序,用于保存将要执行的任务列表,其用于模拟队列这种数据结构,队列通常是值“先进先出(FIFO)”的容器。Queue接口直接继承Collection接口,抽象类AbstractQueue 实现Queue接口。
LinkedList
不仅实现了List,同样实现了Queue接口,模拟先进先出的队列结构。
PriorityQueue
用来创建自然排序的优先级队列。
五、Map
Map关心的是唯一的标识符。他将唯一的键映射到某个元素。当然键和值都是对象。(这里只是概括一下Map,具体的Map介绍,请看我的另一篇,HashMap的低层实现)
Map集合是Java集合框架的使用的最频繁的集合,而且Set集合也都是通过Map集合来实现的。
Map 接口在现在的Java版本中没有继承Collection接口,自己为一个接口,通过抽象类AbstractMap 来实现Map接口。
HashMap
当需要键值对表示,又不关心顺序时可采用HashMap。HashMap集合是线程不安全的。
Hashtable
它在较早版本中出现,现在已经很少使用。Hashtable集合是线程安全的,不过其加锁机制也使得其性能非常低。
LinkedHashMap
当需要键值对,并且关心插入顺序时可采用它。其继承父类Hashmap实现。
TreeMap
当需要键值对,并关心元素的自然排序时可采用它。其是通过红黑树这种结构实现的。
浅谈Java的集合框架的更多相关文章
- 浅谈java类集框架和数据结构(2)
继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...
- 浅谈Java的集合体系
集合体系框架图 集合接口 Java集合类库将接口(interface)与实现(implementation)分离,如上图,Set是一个集合接口,而HashSet与TreeSet都是实现了Set接口的子 ...
- 浅谈java类集框架和数据结构(1)
在另外一篇博客我简单介绍了java类集框架相关代码和理论. 这一篇博客我主要分析一下各个类集框架的原理以及源码分析. 一:先谈谈LinkedList 这是LinkedList源码的开头,我们能看到几点 ...
- 浅谈Java反射与框架
Java反射 1.示例 1.用户类 package com.lf.entity; import com.lf.annotation.SetProperty; import com.lf.annotat ...
- 浅谈JAVA集合框架
浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...
- !! 浅谈Java学习方法和后期面试技巧
浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
- 浅谈一下SSI+Oracle框架的整合搭建
浅谈一下SSI+Oracle框架的整合搭建 最近换了一家公司,公司几乎所有的项目都采用的是Struts2+Spring+Ibatis+Oracle的架构,上一个东家一般用的就是JSF+Spring,所 ...
- 浅谈 Java 主流开源类库解析 XML
在大型项目编码推进中,涉及到 XML 解析问题时,大多数程序员都不太会选用底层的解析方式直接编码. 主要存在编码复杂性.难扩展.难复用....,但如果你是 super 程序员或是一个人的项目,也不妨一 ...
随机推荐
- AngularJS的五个超酷特性
AngularJS是一个超棒的javascript框架,不单单对于开发人员来说非常有吸引力,对于UI设计师来说也同样出色.在这篇教程中,我们将简单的介绍AngularJS几个重量级必备特性,并且介绍它 ...
- 如何解决“BPM导入组织架构出现问题导致系统无法登陆”
遇到问题如图所示↓ 进入H3系统登陆页面. 点击登陆后显示如图错误. 跟踪后显示参数为空.问题描述:通过web service方式进行组织机构导入,只导入ObjectID和Name等共通的6个字段.导 ...
- ajax数据交互(arcgis server)
通过ajax来调用服务器map数据,来实现搜索功能. 效果: 1.我要搜索下中国移动的地理信息: 2.会搜出17条消息,然后把他们分页显示,一页6条: 3.每一页的6天数据,会在map生成一个6条ma ...
- CodeForces 446B
DZY Loves Modification time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Kettle(Pentaho)实现web方式远程执行job或transformation
一.背景 公司在用kettle做数据etl,每做完一个job或transformation发布上线想要立即执行看数据效果的话每次都是找运维同学登陆服务器打开kettle找到对应的文件点击执行,整个过程 ...
- Python抓取百度百科数据
前言 本文整理自慕课网<Python开发简单爬虫>,将会记录爬取百度百科"python"词条相关页面的整个过程. 抓取策略 确定目标:确定抓取哪个网站的哪些页面的哪部分 ...
- db2_errroecode
sqlcode sqlstate 说明 000 00000 SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 +012 01545 未限定的列名被解释为一个有相互关系的引用 +09 ...
- linux下读取系统内存的demo
#include <stdio.h> #define KIBIBYTE_SIZE 1024LL #define MEBIBYTE_SIZE 1048576LL #define GIBIBY ...
- angular1.5 Components
如今前端界angular react vue三大框架并驾齐驱,其中有一个共同点就是组件化开发,这也符合w3c 推行Web Components的趋势.现如今不懂组件化开发的前端绝对不是好厨子.跳槽新公 ...
- C# 多态理论基础
一.概述 同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性. 可以用不同的方式实现组件中的多态性: ● 接口多态性. ● 继承多态性. ● 通过抽象类实现的多态性. 二.实 ...