- Collection接口
- List接口
- Set接口
- Map接口
- 泛型
- Lambda表达式
集合概述
为了在程序中可以保存数目不确定的对象,Java提供了一系列特殊的类,这些类可以存储任意类型的对象,并且长度可变,这些类被统称为集合。集合类都位于java.util包中,使用时必须导包。
集合就是一个动态数组
集合按照其存储结构可以分为两大类,单列集合Collection和双列集合
Map,这两种集合的特点具体如下:
●Collection: 单列集合类的根接口,用于存储一系列符合某种规则的
元素,它有两个重要的子接口,分别是List和Set。其中,List的特点是元
素有序、元素可重复。Set的特点是元素无序,而且不可重复。List接口
的主要实现类有ArrayList和LinkedList, Set接口的主要实现类有
HashSet和TreeSet。Map:双列集合类的根接口,用于存储具有键(Key)、值(Value)映射
关系的元素,每个元素都包含- -对键值,其中键值不可重复并且每个键
最多只能映射到一个值,在使用Map集合时可以通过指定的Key找到对应
的Value。例如,根据一个学生的学号 就可以找到对应的学生。Map接口
的主要实现类有HashMap和TreeMap。
所谓单列集合就是线性结构。双列就是非线性结构
单列:
双列:就是一个存储的是编号,另外一个存储的是值(一般适用的的是图形结构和树形结构)
关于Collection
Collection是所有单列集合的父接口,它定义了单列集合(List和Set)通用的一-些方法,"这些方法可用于.操作所有的单列集合。Collection接口的常用如下表。
关于List
List接口继承自Collection接口,(Collecion里面的方法都是可以用的)是单列集合的一个重要分支。List集 合允许出现重复的元素,所有的元素是以一-种线性方式进行存储的,在程序中可以通过索引|访问List集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
子接口自己的方法
ArrayList
ArrayList是List接口的一个实现类,它是程序中最常见的一种集合。在ArrayList内部封装了一个长度可变的数组对象,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。序,即元素的存入顺序和取出顺序一致。
ArrayList集合中大部分方法都是从父类Collection和List继承过来的,其中add()方法和get()
方法分别用于实现元素的存入和取出。接下来通过一个案例学习ArrayList集合的元素存取。
例如:
我们创建一个学生类和一个程序类(里面要有一个To String方法)
然后在新建一个Test类,首先我们创建一个线性表
要将学生和程序员放到线性表中,先创建好程序员和学生
这里都是无参的,我们可以创建有参的
然后List.add就可以将它们都放在线性表中
这就是添加数据
添加好了之后,如果想查看就可以直接输出List
我们现在试试加上数据
比如说我前面两个添加的是程序员,当我们想将学生放在第一个的是时候就选择这个
但是这个要传进两个值,第一个就是你想放在第几个的下标。第二个就是将放在哪一个的对象放进去
最后输出的时候我们就可以使用增强for循环
运行结果如下图(就会发现学生在第一个)
如果我们将学生删除掉,我们就如下图所示的进行修改
如果要以表格的样子进行输出
结果如下图
关于修改数据
当们想将数据2变成数据三
选择这个
接下来传进去1和programmer2
运行结果如下图所示
查询数据
运行结果
删除数据
运行结果
清除所有的数据
非线性结构
LinkedList集合
ArrayList集合在查询元素时速度很快,但在增删元素时效率较低。为了克服这种局限性,可以使用List接口的另一个实现类LinkedList。LinkedList集合内部维护了一一个双向循环链表,链表中的每一个元素都使用弓|用的方式来记住它的前一个元素和后-个元素,从而可以将所有的元素彼此连接起来。当插入一个新元素时,只需要修改元素之间的这种弓|用关系即可,删除一个节 点也是如此。正因为这样的存储结构,所以LinkedList集合对于元素的增删操作具有很高的效率。
这个的使用也是非常的简单,就是在我们刚刚的基础上面 稍作修改
首先我们进行创建一个链表
我们想将最后一个数据添加到第一个
这个时候就选择add.Frist,就可放在头部
刚刚是通过增强for循环来进行遍历
也可以用普通for循环来进行遍历。当i=0就是第一个元素.......
增强for循环
运行结果
除了增强for循环和普通for循环之外我们还可以使用接口
lterator接口
在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,Java专门提供了一个接口
Iterator。Iterator接口也是集合中的一员,但它与Collection、Map接口有所不同。Collection
接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历) Collection中的元素,因此Iterator对象也被称为迭代器。
例如
Set接口
Set接口和List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。Set接口主要有两个实现类,分别是HashSet和TreeSet。 其中,HashSet是根据对象的哈希值来确定元素在集合中的存储位置,具有良好的存取和查找性能。TreeSet则是以二叉 树的方式来存储元素,它可以实现对集合中的元素进行排序。
例如:
我们创捷一个HashSet
咱们现在是按照顺序进行添加,但是输出结果就会发现是随机输出的
运行结果
如果想添加顺序和输出的顺序一样
我们就使用它的子类LinkHashSet,这样添加的数顺序就和输出的顺序是一样的
关于TreeSet例子
然后上面有很多的警告
我们点击警告的第一个,添加Object,这样警告就都没有了
运行结果:(顺序有序,自动排序)
当换成了字符,虽然没有报错
运行结果
但是如果是同种比较就没问题
Map接口
Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一-种对应关系, 称为映射。从Map集合中访问元素时,只要指定了Key,就能找到对应的Value。
常用方法
HashMap
HashMap集合是Map接口的一个实现类,用于存储键值映射关系,但HashMap集合没有重复的键并且键值无序。接下来通过一个案例学习HashMap的用法。
如何遍历
遍历的总套路
这种遍历是和我们添加的顺序不一样
可以使用子类LinkedHashMap
关于TreeMap
运行结果:(会根据key的大小进行排序,如果有一样的就会只出现一个)
所以key唯一