Java集合体系总结
来源:互联网 发布:flash mac版下载 编辑:程序博客网 时间:2024/05/22 16:39
一、集合框架
集合是容纳数据的容器,Java常用的集合体系图如下。以集合中是否运行重复元素来分,主要有List和Set接口,List集合中可以有重复元素,Set集合集合中的元素不可重复,Iterator和List Iterator是遍历集合的2个迭代器,Map是存储Key/Value键值对的容器。
二、迭代器
迭代器的用法写在后面,这里说明Iterator和ListIterator的区别:
- Iterator在遍历一个集合的过程中不能修改集合中的对象,ListIterator可以修改对象
- ListIterator从后往前遍历,有hasPrevious()方法,Iterator没有
- ListIterator可以在遍历过程中进行添加元素操作,Iterator不能,否则会报
java.util.ConcurrentModificationException
异常。
三、List集合
List集合存储不唯一、有序的对象,可以操作角标。
3.1 ArrayList
3.1.1内部实现
ArrayList也叫变长数组,数组的长度是固定的,ArrayList可以随着元素的增多长度增加,内部实现为数组。ArrayList在添加元素时首先会判断长度,长度不够时,长度扩展到原来到1.5倍,原数组复制到新数组。
3.1.2关键属性
3.1.3 测试示例
创建一个ArrayList对象,添加5个元素,其中一个为null:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
打印结果:
- 1
- 1
使用迭代器for循环方式遍历:
- 1
- 2
- 3
- 1
- 2
- 3
使用迭代器while循环方式遍历:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
存储自定义对象:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
添加Boy对象到ArrayList中并打印:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
结果:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
3.1.4 转成线程安全
非线程安全的ArrayList
- 1
- 2
- 1
- 2
线程安全的ArrayList
- 1
- 1
3.1.5 常用方法
- clear():移除列表中的所有元素
- contains(Object o): 包含指定元素
- get(int index):返回列表中指定位置上的元素
- indexOf(Object o): 返回列表中首次出现指定元素的索引,如果列表不包含,则返回-1
- isEmpty():列表为空返回true
- lastIndexOf(Object o):返回列表中最后一次出现指定元素的索引,如果列表不包含元素则返回-1
- remove(int index):移除列表中指定位置的元素
- remove(Object o):移除列表中首次出现的指定元素
- removeRange(int fromIndex,int toIndex):移除列表中索引在fromIndex(包括)和toIndex(不包括)之间的所有元素。
- size():返回集合的元素个数
- set(int index,E element):修改指定位置上的元素
- toArray():按顺序返回包含此列表中所有元素的数组
3.2 LinkedList
3.2.1内部实现
内部实现为双向链表,删除和增加速度快,查找速度慢。
3.2.2关键属性
3.2.3 测试示例
LinkedList当作FIFO的队列使用,也就是常用的add方法添加元素:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
打印结果:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
LinkedList当作FILO的栈使用:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
打印结果:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
除了ArrayList中包含的基本方法以为,LinkedList中多了getFirst()、getLast()、addFirst()、addLast()、peek()、peekFirst()、peekLast()、removeFirst()、removeLast()等方法。
3.2.4 转成线程安全
- 1
- 1
3.3 Vector
Vector内部是数组结构,线程安全,速度较慢,几乎不用。
四、Set集合
Set集合中的元素唯一、无序,没有角标。
4.1HashSet
4.1.1内部实现
内部结构是哈希表,对象存入HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,确保set中没有存储相同的对象。判断两个元素是否相同,首先通过hashCode()方法判断的是2个元素的哈希值是否相同,再根据equals()方法判断值是否相同,只有2者都相同才是统一元素。
4.1.2 基本属性
4.1.3 测试示例
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
打印结果:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
添加自定义对象,仍然添加Boy类中的对象
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
结果:
- 1
- 1
这时候b1和b2其实是一个对象,在Boy类中重写hashCode()和equals()方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
重写equals和hashCode方法以后,上述集合中就会只添加一个对象:
- 1
- 1
4.1.4 转成线程安全
- 1
- 1
4.1.5 唯一且有序
LinkedHashSet集合中都元素唯一且有序,这里都有序是指添加顺序。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
打印结果:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
4.2 TreeSet
4.2.1 内部实现
TreeSet内部实现为二叉树,可以对元素进行排序
4.2.2 基本属性
4.2.3 测试示例
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
打印结果:
- 1
- 1
4.2.4 转成线程安全
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
五、Map集合
Map只存储的是键值对,Key必须唯一且不为空,key允许为null。
5.1HashMap
5.1.1基本属性
5.1.2 测试示例
词频统计:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
打印结果:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
如果想按value排序,可以改成TreeMap();
六、性能对比
ArrayList遍历性能对比
ArrayList的遍历可以用一般for循环、foreach循环、Iterator迭代器三种方式实现,为了测试它们的性能,先创建一个ArrayList对象,添加5万个字符串:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
for 循环打印并记录耗时:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
结果:
- 1
- 1
foreach循环打印并记录耗时:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
耗时:
- 1
- 1
Iterator循环打印:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
耗时:
- 1
- 1
结论:一般for 循环最慢、foreach次之、Iterator最快。
另外,Iterator遍历还有另外一种变形方式,效率和while形式一样。
- 1
- 2
- 3
- 1
- 2
- 3
七、参考文章
有些文章总结的很好,列出来供参考学习:
Java集合框架
- Java集合体系总结
- Java集合体系总结
- java-集合体系总结
- Java总结系列之集合体系
- java集合~List体系总结、ArrayList分析
- 集合体系总结
- 【Java集合】Java集合体系
- java集合体系
- java集合的体系
- Java集合框架体系
- java集合体系图
- JAVA集合体系回顾
- Java集合体系结构图
- Java集合体系
- JAVA集合体系
- java中的集合体系
- JAVA集合体系
- Java集合体系
- 倒置整数
- epoll系统调用的API
- PythonStock(3):使用python tornado web进行开发
- 网络流详解(1)
- 中国科学院分子影像重点实验室田捷研究员团队自主研发的三维医学图像处理及分析平台3DMed更新到第五版
- Java集合体系总结
- Android源码目录结构详解
- ES6箭头函数
- 约瑟夫环问题
- CF512A:Fox And Names(拓扑排序 & 字典树)
- easyui filebox限制文件上传的类型accept (新旧版本)
- eclipse import Existing Projects into Workspace导入时没找到项目的解決办法
- 计算机体系架构rtl 第五章第六章
- mac上访问samba服务器