上周极度颓废,很咸鱼,就没有做开发学习的周记,这一周把Java核心技术卷I(除了swing等图形界面一块)看完了,然后开始看大话数据结构同时MOOC的数据结构也跟上,那就来总结总结Java里的集合这个和数据结构紧密联系的东西。

1. Java集合框架

下图来自Java核心技术卷I(第10版)

1.1 集合框架的接口

上面的类看起来非常之多但是你仔细看看后面的单词末尾都会有一些相似的地方,Java的集合类库将接口和实现分离。如果你有接口的概念,那么看看下面的图可能就明白了。

上图我们可以看到除了Iterator(迭代器)不属于集合类的范畴外,所有的集合类都由两个基本的接口:Collection和Map。

1.2 Collection接口

这些方法非常好理解而且ArrayList里用过了很多,不多赘述。

Tips:只研究蓝色区域内的方法,默认方法不讨论

1.2.1 迭代器

通过上图的 iterator 方法来返回一个该集合的迭代器。 迭代器有什么用呢,我们来看看迭代器接口的方法

方法很少但是在Collection却很重要。不多bb,上图 所以我们有如下的使用方法

for(Iterable<T> element : c){// do something with element
}
复制代码

将一个实现了Iterable接口的一个对象传入进行遍历,在这里这个对象就是我们说的实现了Collection接口的对象(因为Collection接口同时实现了Iterable接口) remove方法就是删除 next 方法返回的对象

Tips: 不能连续使用两次remove方法来实现连续删除两个元素,应该使用next方法后再remove

1.2.2 Collection子接口——List

List是一个有序的集合,访问其中的元素既可以使用迭代器,也可以使用随机访问(即通过制定的索引访问)

继承自Collection接口,同时增添一些关于随机访问的方法

addAll(index:int, c:Collection<? extends E>):boolean
get(index:int):E
set(index:int, element:E):E
add(index:int, element:E)void
//......
复制代码

经常使用ArrayList的同学肯定对这些方法不陌生。

1.2.3 Collection子接口——Set(集)

Set接口等同于Collection接口(没有增添新的方法),不过集(Set)的add方法不允许添加重复的元素。

1.2.3 Collection的子接口——Queue(队列)

首先我们来看看Queue接口中定义的方法

队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。以下列出Queue新增的方法

offer(e:E):boolean//在队列尾部添加一个元素
remove():E//删除队列的头元素并返回,没有则抛出NoSuchElementException异常
poll():E//删除队列的头元素并返回,没有则返回null
element():E//返回队列头部元素,没有则抛出NoSuchElementException异常
peek():E//返回队列头部元素,没有则返回null
复制代码

1.3 Map 接口

这些方法和Collection不少有些相似,但是由于和Collection实现的方式有根本上的差异(1.4),所以总体来说还是很不一样的所以分成了两个接口。

Tips:只研究蓝色区域内的方法,默认方法不讨论

1.3.1 Map子接口——SortedMap

SortedMap是一个可以保证按照键的升序排列的映射,可以按照键的自然顺序(参见 Comparable 接口)进行排序, 或者通过创建有序映射时提供的比较器进行排序。 上图:

1.4 Collection和Map实现的差异

Collection添加元素的时候一般只需要提供要传入的元素,而Map是需要以键值对的方式(Key/Value)来添加的,一个Key对应一个Value。所以才导致了一些方法的不同

2. 具体的集合(Collection)

需要指出的是,我们现在所用的集合类都是继承自Abstract+List/Set/Queue/Map抽象类而不是实现了某些接口,但是这些抽象类同样实现了对应的接口,其实还是间接实现了对应的接口,但是使用继承抽象类来实现集合类的话会比较方便。 下面介绍几种常用的集合类,偏向介绍特性一些简单的使用就忽略了。

2.1 ArrayList

  • 继承自AbstractList
  • 根据名字可以理解为一种常用的长度可变的数组(?)
  • 也是使用的比较多一种集合,使用起来比较简单,方便,不多赘述

2.2 LinkedList

  • 继承自AbstractSequentialList
  • 实际上是一种双向链表(参见 数据结构—链表)

在C++里我们通过不停地变换指针来到我们需要的节点然后进行增删改查,在Java里,我们使用迭代器来进行增删改查的操作。这里我们使用的迭代器不是原来我们介绍的迭代器,而是另一个,Iterator的子接口ListIterator。

其中有一个新的词Previous(前者),对比next你就可以理解这些新的方法的含义。所以说Java中的链表默认是双向的(你想自己实现一个单项的也行233333333) 简答举例就可以理解:

List<String> food = new LinkedList<>();food.add("翅桶");food.add("春日全家桶");food.add("书亦烧仙草");ListIterator<String> listIterator = food.listIterator();listIterator.next();//翅桶listIterator.add("重庆鸡公煲");//翅桶,重庆鸡公煲,春日全家桶,书亦烧仙草listIterator.next();//春日全家桶listIterator.remove();//翅桶,重庆鸡公煲,书亦烧仙草listIterator.previous();//重庆鸡公煲
复制代码

2.3 ArrayDeque

  • 继承自AbstractCollection并实现了Deque接口
  • 是一种用循环数组实现的双端队列 我们从方法名来看,并比对1.2.3的Deque(队列)接口中的方法,不难看出它的使用方法。实际上就是一个可以从头部添加或者删除的队列,但依然不允许从中间添加或者删除元素,即使有迭代器,并有remove的方法,但是实际上依然remove方法依然是删除头部的元素: 同理,所有继承自Collection的方法所对应的操作都是把它当做普通的队列来操作。

2.4 HashSet

  • 继承自AbstractSet
  • 用来存放没有重复元素的无序集合
  • 基于HashMap实现 巧妙的是,为了做到没有重复元素,该集(Set)底层是通过新建一个HashMap并将元素当做HashMap的key的原理实现的,因为HashMap的key是独一无二的。有关HashMap的描述,后面会讲到。 无序集合采用迭代器的方式遍历整个元素,无法决定顺序,但是总会遍历完所有的元素。

2.5 TreeSet

  • 继承自AbstractSet
  • 用来存放没有重复元素的有序集合
  • 基于HashTree实现 first和last返回的是第一和最后一个元素 lower返回的是严格比给定元素要小的最大元素 floor返回的是比给定元素小于或等于的最大元素 higher返回的是严格比给定元素要大的最小元素 ceiling返回的是比给顶元素大于或者等于的最小元素 pollFirst/Last将集(Set)的头部/尾部元素删除(弹出)并返回 同样是使用HashTree中的key值唯一性来保证没有重复的元素。

3. 具体的映射(Map)

Tips:注意映射和集合

3.1 HashMap

  • 继承自AbstractMap
  • 一种储存键值对的无序数据结构 使用其实也非常容易理解,首先,他是无序的,迭代器访问的时候也是随机、无序的。往HashMap放一个值的时候就要把键(key)值(value)对都传给put方法,想要访问元素的时候呢就需要拿到他的key。还可以通过keySet方法和values方法单独得到key和value的Collection对象。其中关于HashMap更多的细节,我还不是特别清楚,以后会继续讨论√
  • 对象和key必须是一一对应的,如果你想对自定义类放入HashMap,那你必须重写hashCode方法来生成对象的key,还要重写equals方法以保证两个hashCode相等的对象返回的是false。

3.2 TreeMap

  • 继承自AbstractMap
  • 一种储存键值对的有序数据结构
  • 排序的底层实现为红黑树(red-black tree) 使用起来和HashMap看起来差不多,区别就在于一个有序一个无序,迭代器总是能够以排好的顺序依次访问元素。

3.总结

突然不想写了,感觉写这些简单的没什么深度,看了清夏学姐推荐的GitBook发现自己是真的弟。。。。。。 从今以后我写的会更加注重深层次的东西,不在于多,而在于深。 不多bb,看书去了√

转载于:https://juejin.im/post/5cb0cecc5188251ad87b1685

Java-集合的简单介绍相关推荐

  1. 【软件开发】Java语言的简单介绍

    Java语言的简单介绍 一.Java语言的介绍 二.Java的版本 三.JDK的介绍 四.Java API文档 五.Java语言的特点 1. 面向对象 2. 解释性 3. 多线程 4. 可移植性 / ...

  2. Java - JWT的简单介绍和使用

    Java - JWT的简单介绍和使用 前言 一. JWT 基础知识 1.1 session 案例测试 1.2 JWT 结构 1.2.1 Header 1.2.2 Payload 1.2.3 Signa ...

  3. java同步机制简单介绍

    在java编程里经常听到类似的术语: 这个函数是不是同步的... 本文就简单介绍下什么是同步, java中同步的一些处理方法. 1.同步问题产生的原因 Java中同步问题是伴随这多线程而产生的, 也就 ...

  4. Java基础-web简单介绍

    web简单介绍 什么是Web? 什么是Java web? 使用Java语言进行开发. 软件架构: CS结构的软件:  CS:Client/Server客户端和服务器,这种软件往往需要安装.比如QQ,迅 ...

  5. Java之GUI简单介绍

    GUI介绍(一)常见的组件及简单监听器 第一个窗口程序 容器控件 JLabel控件 简单事件处理 文本框JTextFiled 复选框JCheckBox 下拉列表JComboBox 布局管理器Layou ...

  6. Java 多态的简单介绍.

    作为面向对象三大知识点之一,  多态可以讲是相对最难理解那个. 本人在这里也是简单分析一下. 一, 多态的定义. 面向对象编程中, 1个超类的引用可以指向属于超类的对象, 也可以根据需要指向超类的派生 ...

  7. java集合概念初步介绍

    java集合类用于存储数量不等的多个对象.大致分为Set,List和Map三种.其中Set代表无序,不可重复的集合,因为它无法记住元素添加进去的顺序: List代表有序,重复的集合,可以记住元素添加的 ...

  8. linux java jar war_简单介绍Java 的JAR包、EAR包、WAR包区别

    WAR包 WAR(Web Archive file)网络应用程序文件,是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件.War专用于Web方面.大部分的JAVA WEB工程,都是打成WAR包 ...

  9. Java多态(简单介绍)

    多态是Java面向对象的一个重要特征.多态就是不同的对象对同一个事物做出的不同反应.方法重写是实现多态的基础. 1.向上转型 父类引用指向子类 向上转型的语法: <父类型> <引用变 ...

  10. Java基础—反射—简单介绍

    一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见的 JavaScript 就是动态语言,除此之外 Ruby,Python 等也属于 ...

最新文章

  1. Windows设置共享文件夹并允许写入--windows shared folder write access
  2. android 修改ramdisk.img和init.rc android启动后设置/data权限为770
  3. Proguard源码分析(五) ConfigurationParser.keep参数
  4. 微信小程序发布后,真机调用接口失败:ERR_CERT_AUTHORITY_INVALID
  5. 数据库主从不同步_数据从不说什么
  6. 工作108:vue里面wangEdit编辑器使用
  7. 【OpenCV】OpenCV函数精讲之 -- imread()函数
  8. 这是我用Microsoft Word 2010 直接发布的测试用博客
  9. mysql大项目:新闻管理系统
  10. win2003域迁移实战记录
  11. C++类的赋值运算符“=”重载,以及深拷贝和浅拷贝
  12. [原]奇怪的参数错误
  13. 使用 Jenkins + GitHub + Nginx + HTTPS 搭建静态网站
  14. 期待人工智能在合作时的表现
  15. Jmeter 压测工具使用手册(完整版)
  16. 软件项目管理系统-进度编辑
  17. 360站长工具-免费360链接提交主动推送收录工具自带收录排名蜘蛛查询
  18. 公排系统php,全球公排自动滑落二二复制多级分销系统PHP二二复制多级分销源码...
  19. linux Ubuntu系统安装百度aip
  20. python 合并表格

热门文章

  1. boost::edge_list用法的测试程序
  2. boost::container模块实现范围分配器适配器
  3. ITK:用内核卷积图像
  4. VTK:可视化算法之TubesFromSplines
  5. VTK:Utilities之RenderScalarToFloatBuffer
  6. VTK:PolyData之EmbedPointsIntoVolume
  7. VTK:Math之EigenSymmetric
  8. QDoc主题命令Topic Commands
  9. Qt Creator使用自定义着色器
  10. c++快速排序(附完整源码)