集合引入

软件,就是数据和指令的集合;

数据,是通过内存中的空间来保存的;

单个数据,可以使用变量保存;

多个数据,可以使用数组保存;

但是使用数组有个前提:

  1. 要保存的数据的数据类型是一致的;
  2. 要保存的数据的数量是已知的;

但是在开发中,经常会遇到数据的数量不确定的情况;

例如要写一个通讯录的软件,需要保存联系人的信息;但是实际上会有多少联系人,是不确定的;

数量不确定就不能创建数组;

那怎么保存数据呢?

使用集合;

集合和数组的区别

集合,是一种可以保存不同类型的数据,并且容量可以自动增长的容器,只能保存引用类型的数据。

作为容器,数组和集合都能保存多个数据,他们之间有什么区别呢?

数组:

  1. 只能保存同一种类型的数据;
  2. 数组一旦创建,容量不可改变;
  3. 数组可以保存引用类型的数据和基本类型的数据;

集合:

  1. 可以保存不同类型的数据;(一般开发中一个集合对象都应该只保存一种类型的数据)
  2. 集合可根据需要自动扩容;
  3. 集合只能保存引用类型的数据;

什么时候应该使用集合?

要保存的数据的类型不止同一种;(一般开发中,一个集合对象,只应该保存一种类型的数据)

如果不清楚要保存的数据的数量,也应该使用集合;

集合框架

生活中,要保存不同的事物,需要使用不同的容器,例如,水果可以使用篮子装,但水不能用篮子装;

java程序中,存储数据的需求不同,使用的容器也不相同;

java为了描述不同的容器,创建了不同的集合容器类;

容器都有一些共同的操作,将这些共同的操作不断向上抽取、封装,最终形成一个继承体系,就是集合框架;




java集合合并的几种方式_java判断对象类型


java集合合并的几种方式_java 泛型传参_02


https://www.zhihu.com/video/1068285678982459392


Collection接口

Collection接口简介


java集合合并的几种方式_java 判断类型_03


结论:

  1. Collection接口是集合框架中最顶层的接口,定义了所有集合类的最共性的行为;
  2. 有的集合对象可以保存重复的元素,有的不能保存重复元素;
  3. 有的集合保存的数据时有序的,有的是无序的;
  4. Collection接口非常抽象,所以没有直接实现类,而是有两个直接子接口,实际实现类都是实现它的子接口的;
  5. 一般使用Collection接口类型的变量进行传参


java集合合并的几种方式_java集合合并的几种方式_04

https://www.zhihu.com/video/1068286156784922624



Collection的方法

一般容器对象,都具有增删改查的功能;

但是collection接口太抽象了,所以只有增、删、获取、判断的方法,没有修改的功能;

增加方法

因为是接口,不能直接使用,所以要找一个实现类来使用;

我们使用Collection接口中用的最最多的实现类:ArrayList类;

1、向容器中添加一个数据:


java集合合并的几种方式_java集合合并的几种方式_05


  1. 向容器中添加多个数据,数据保存在另一个容器中:


java集合合并的几种方式_java 判断类型_06


java集合合并的几种方式_java集合合并的几种方式_07


java集合合并的几种方式_java判断三个数字范围是否有交集_08

https://www.zhihu.com/video/1068286253874614272



删除方法

  1. 删除容器中一个指定对象:


java集合合并的几种方式_java集合合并的几种方式_09


可选操作,指的是如果容器中有这个参数表示的对象,就执行删除操作,同时返回true;否则,就不进行任何操作,同时返回false;


java集合合并的几种方式_java判断对象类型_10


java集合合并的几种方式_java判断对象类型_11

https://www.zhihu.com/video/1068286310279778304



2、删除多个对象:


java集合合并的几种方式_java集合合并的几种方式_12


java集合合并的几种方式_java 判断类型_13


java集合合并的几种方式_java判断对象类型_14


java集合合并的几种方式_java判断对象类型_15


java集合合并的几种方式_java 泛型传参_16


注意:如果在使用这个函数时,接收的参数是一个空集合,结果就会把原来的集合清空;

3、删除容器中的所有对象:


java集合合并的几种方式_java 判断类型_17


java集合合并的几种方式_java集合合并的几种方式_18


java集合合并的几种方式_java判断对象类型_11

https://www.zhihu.com/video/1068286561568813056



判断方法

  1. 判断容器是否是空的:


java集合合并的几种方式_java判断三个数字范围是否有交集_20


java集合合并的几种方式_java判断三个数字范围是否有交集_21


2、判断容器中是否包含指定对象:


java集合合并的几种方式_java 判断类型_22


java集合合并的几种方式_java判断对象类型_23


java集合合并的几种方式_java判断对象类型_24

https://www.zhihu.com/video/1068286712706473984


获取方法

1、获取容器中保存的数据的数量:


java集合合并的几种方式_java 泛型传参_25


java集合合并的几种方式_java判断三个数字范围是否有交集_26


2、获取容器中的所有数据,以数组的形式返回:


java集合合并的几种方式_java 判断类型_27


java集合合并的几种方式_java判断对象类型_28


3、获取这个容器的迭代器:


java集合合并的几种方式_java判断三个数字范围是否有交集_29


java集合合并的几种方式_java 判断类型_30

https://www.zhihu.com/video/1068286937038692352



集合的遍历:迭代器

迭代器介绍

迭代器,就是用来遍历集合中的数据的;

集合是容器,所有集合类都提供了遍历容器中数据的功能;

我们知道,要遍历数组中的数据,可以使用循环;

但是要遍历集合中的所有元素,因为集合的实现不同,保存数据的方式也不一样,所以我们取出数据的方法也不一样;


java集合合并的几种方式_java判断三个数字范围是否有交集_31


而Java就将所有集合容器遍历数据的方法进行抽取,形成一个接口,就是Iterator接口:


java集合合并的几种方式_java 泛型传参_32


java集合合并的几种方式_java 泛型传参_33


迭代器使用演示


java集合合并的几种方式_java判断三个数字范围是否有交集_34


java集合合并的几种方式_java判断三个数字范围是否有交集_35


java集合合并的几种方式_java集合合并的几种方式_36

https://www.zhihu.com/video/1068287428871258112



迭代器的注意细节

新人在使用迭代器的时候很容易犯一些错误,所以在使用迭代器时有些细节,大家一定要注意一下:

1、从容器中获取的迭代器只能遍历容器一次;要再次遍历,需要重新获取迭代器;


java集合合并的几种方式_java 判断类型_37


java集合合并的几种方式_java判断对象类型_38


  1. 在迭代器遍历容器时,一个hasNext方法只应该对应一个next方法;


java集合合并的几种方式_java集合合并的几种方式_39


  1. 在使用迭代器遍历容器时,不能使用迭代器以外的方法操作容器;


java集合合并的几种方式_java 判断类型_40


使用增强for循环遍历集合


java集合合并的几种方式_java判断三个数字范围是否有交集_41


注意:在使用增强for循环遍历集合的时候,底层仍然使用的是迭代器遍历;所以不能在循环中直接修改集合对象;

否则也会抛出并发修改异常;


java集合合并的几种方式_java判断对象类型_42

https://www.zhihu.com/video/1068287509322133504


集合的小结

集合概念:集合是一种容器,可以保存不同类型的引用数据;

集合特点:

  1. 只能保存引用类型数据;
  2. 容量随着使用可以自动增长;
  3. 同一个容器可以保存不同类型的数据;

(为了避免使用中可能出现问题,所以一个集合容器应该只保存一种类型的数据,使用泛型技术可以保证这点);

集合框架:

Java中为了满足开发中对数据保存的不同需求,设计了不同的集合容器类(因为都在java.util包中,所以又称为集合工具);这些类具有一些共同的操作,如增、删、判断、查询等;为了方便使用,Java对他们进行总结和抽取,形成一个继承体系,就是集合框架;

Collection接口:

Collection接口是Java集合框架中最顶层的接口,定义了各种集合类的最共性的操作,包括4类:

添加方法:

添加一个数据:add();

添加多个数据:addAll();

删除方法:

删除一个数据:remove();

删除交集:removeAll();

保留交集:retainAll();

清空集合:clear();

判断方法:

判断是否为空:isEmpty();

判断是否包含指定数据:contains();

判断是否包含指定多个数据:containsAll();

获取方法:

获取集合中保存的数据个数:size();

获取容器中所有数据,以数组方式返回:toArray();

获取迭代器:iterator();

迭代器:

因为不同的集合类底层保存数据的方式不同,所以遍历集合的具体实现不一样;但是不管遍历哪种集合类,需要的功能是一样的,所以Java定义了遍历集合类的方法,放到接口Iterator中,就是迭代器;

迭代器的方法:

判断容器中有没有可获取的数据:hasNext();

获取下一个数据:next();

删除刚刚获取的数据:remove();

迭代器使用注意事项:

  1. 一个迭代器只能迭代容器一次,再次迭代,需要重新获取迭代器;
  2. 在使用迭代器遍历集合容器时,一个判断方法对应一个获取方法;每一个获取方法,都会使迭代器中隐藏的光标向后移动一次;
  3. 在使用迭代器时,不能对容器进行更改操作;要删除数据,可以通过迭代器提供的方法进行;