Java集合--概述

摘要

​ 本文主要介绍集合的整体概念,并作为接下来Java集合实现类讲解的索引。

图示

​ 这是在网上看到了这样一张图,感觉很清晰,内容也很全面,我决定按这张图,把自己熟悉的集合都仔细研究一下。

查看大图

各位置描述

位置 描述
左上灰色部分 已经过期,以后的开发中不要使用。
右上浅粉色部分 接口关系图
中间绿色部分 java.util包里集合具体实现类
右下灰色部分 java.util.concurrent包里面的类,用来处理java并发问题

集合分类

分类 描述
Map 双链集合,允许通过键来找到值
List 按照插入顺序保存元素
Set 不允许有重复元素
Queue 从一端插入元素,从另一端获取

实现类

接口 实现类
List ArrayList、LinkedList
Set HashSet、LinkedHashSet、TreeSet
Queue PriorityQueue、LinkedList
Map HashMap、LinkedHashMap、TreeMap、WeakHashMap、IdentityHashMap

底层数据结构

底层数据结构 实现类
数组 EnumMap、ArrayList、ArrayQueue
链表 LinkedHashSet、LinkedList、LinkedHashMap
红黑树 TreeMap、TreeSet
二叉堆 PriorityQueue
哈希表 HashMap、HashSet、LinkedHashMap、LinkedHashSet、WeakHashMap、IdentityHashMap

正文

一、集合的由来

​ 如果一个程序只包含固定数量且生命周期都是已知的对象,那么这是一个非常简单的程序

​ 为了满足常规的编程需要,我们要求能在任何时候,任何地点创建任意数量,甚至是不同类型的对象,由于数组只能装统一类型数据,而且长度固定,于是产生了集合。

二、集合特点
  • 集合只能存放对象。基本数据类型会自动装箱为包装类。
  • 集合存放的是对象的引用,对象本身还是放在堆内存中。
  • 集合可以存放不同类型,不限数量的数据类型。
三、迭代器

​ 使用集合必须对具体实现类进行操作,但是考虑如下状况:如果原本是对List进行编程,现在要把相同的代码用在Set上,如果能不关心容器类型只关心对集合得操作该怎么办?于是,迭代器因此产生。

​ 迭代器是一个对象,它的工作就是遍历并选择序列中的对象,而且客户端不需要关注序列的底层结构,Java中Iterator只能单向移动,但是其子接口ListIterator可以双向移动。

​ Iterator中有hashNext(),next(),remove()几个方法,ListIterator在它的基础上又添加了三种方法,分别是 add(),previous(),hasPrevious()

​ Collection顶层结构接口是Iterable,而Map的顶层接口是Map,Collection下的集合都可以用迭代器遍历,Map可以使用Set<Map.Entry<K, V>> entrySet()方法转换为Set进行迭代遍历。

​ Iterable中包含Iterator<T> iterator()方法,Collection下集合使用该方法后会返回迭代器,可对迭代器进行迭代遍历。

​ 通常来讲有序的集合中有Iterator<T> iterator()ListIterator<E> listIterator()方法,可以进行双向遍历,无序的集合中有Iterator<T> iterator(),只能向后遍历。

四、实现自己的集合

​ 如果想实现自己的集合可以JDK提供的抽象类,如AbstractList,AbstractMap,通常这些抽象类已经为我们提供了现成的实现,可以根据需要对特定的抽象方法重写,直接实现List、Map这样的接口是需要实现所有方法工作量过大。

​ 不过通常来讲,java已经提供提供了丰富的集合实现,很少会需要我们自己去实现集合。


本文参考:

  1. Think in Java 第四版 第8章 集合部分
  2. Java 集合详解
  3. 一张图让你看清Java集合类(Java集合类的总结)

最新文章

  1. 人脸识别引擎SeetaFace编译 ubuntu
  2. Android 标题栏菜单设置与应用(popupWindow的应用)
  3. OC基础--block
  4. 利用ExtJS导出Excel
  5. 多校6 1001 HDU5793 A Boring Question (推公式 等比数列求和)
  6. (转)C++ 编程规范
  7. [转]在 SQL Server 2008 中新建用户登录并指定该用户的数据库
  8. JQuerry 权威指南的都市笔记
  9. 【dp 背包变形】 poj 1837
  10. Android 控件背景选择图片还是drawable XML资源
  11. VUE工程上线首页加载慢问题优化
  12. Android中验证输入是否为汉字、手机号及邮箱
  13. js动态获取select选中的option
  14. Spark2.3(四十):如何使用java通过yarn api调度spark app,并根据appId监控任务,关闭任务,获取任务日志
  15. TkMyBatis大杂烩
  16. MT【214】焦点弦长公式
  17. webstorm 2017激活
  18. table固定列的宽度,超出部分用…代替(针对普通table和antd)
  19. bzoj4278
  20. Android检查手机上是否安装了第三方软件的方法------本文以百度地图为例

热门文章

  1. Day4 作业
  2. ASP.NET Core获取客户端IP地址
  3. 简单版nginx lua 完成流量上报于中间件
  4. matplotlib实现三维柱状图
  5. 前端入门CSS(2)
  6. Python(文件上传)
  7. Vue 项目优化,持续更新...
  8. ubuntu 中 mongodb 数据读写权限配置
  9. express+nodemon 修改后浏览器自动刷新
  10. C#:注册机的实现