单列集合一次只能添加一个元素

Collection是顶层父类接口
List系列集合:
添加的元素是有序、可重复、有索引的,其中有序指的是存和取得顺序一致(e.g:我存进去的是1,2,3,取出来的是1,2,3),重复指的是集合中存储的元素是可以重复的,有索引指的是我们可以通过索引获取每一个元素。
Set系列集合:
添加的元素是无序、不重复、无索引的,其中无序指的是存和取得顺序可能不一致(e.g:我存进去的是1,2,3,取出来的可能是3,1,2),不重复指的是集合中存储的元素是不可以重复的,无索引指的是我们不可以通过索引获取每一个元素。
Collection是单列集合的祖宗接口(顶层父接口),它的功能是全部单列集合都可以使用的。
Collection是接口 不能直接创建集合对象,但是可以通过该接口的具体类来创建集合对象,在Java中,一个对象变量可以引用任何实现了特定接口的类的实例(比如下面例子中的coll),这是java中多态的作用,你可以通过接口来引用任何实现了该接口的类的实例,从而增加了代码的灵活性和可维护性。因为你可以轻松地改变 coll 背后使用的实现类,而不需要修改所有使用 coll 的代码。例如,你可以将 new ArrayList<>() 替换为 new LinkedList<>() 或其他任何实现了 Collection 接口的类的实例,而无需修改其他代码。
e.g: Collection
通过ArrayList实现类创建集合
注意:Collection是接口,在使用它的方法时,不能创建它的对象,要创建它的实现类,通过它的实现类来使用接口的方法

语法:集合名称.add(元素);
当往List系列添加元素时,返回值永远是true,因为List可以添加重复元素
当往Set系列添加元素时,当该元素已经在集合中存在时,那么返回值是false,当该元素集合中没有存在时,那么返回值是true,因为Set不可以添加重复元素
- import java.util.ArrayList;
- import java.util.Collection;
-
- public class test1 {
- public static void main(String[] args) {
- // 生成一个coll变量 它的类型是Collection 表示一组元素 其元素类型必须是String
- Collection
coll=new ArrayList<>(); - // 1.添加
- // 返回值为布尔类型
- boolean r1= coll.add("abc");
- System.out.println(r1);// true
- System.out.println(coll);// [abc]
- boolean r2= coll.add("efg");
- System.out.println(r2);// true
- System.out.println(coll);// [abc, efg]
- }
- }
语法:集合名称.clear();
当往List系列添加元素时,返回值永远是true,因为List可以添加重复元素
当往Set系列添加元素时,当该元素已经在集合中存在时,那么返回值是false,当该元素集合中没有存在时,那么返回值是true,因为Set不可以添加重复元素
- import java.util.ArrayList;
- import java.util.Collection;
-
- public class test1 {
- public static void main(String[] args) {
- // 生成一个coll变量 它的类型是Collection 表示一组元素 其元素类型必须是String
- Collection
coll=new ArrayList<>(); - // 1.添加
- // 返回值为布尔类型
- boolean r1= coll.add("abc");
- System.out.println(r1);// true
- System.out.println(coll);// [abc]
- boolean r2= coll.add("efg");
- System.out.println(r2);// true
- System.out.println(coll);// [abc, efg]
-
- //2.清空
- //清空集合所有的元素
- coll.clear();
- System.out.println(coll);// []
- }
- }
语法:集合名称.remove(元素);
当要删除的元素在集合中存在时,那么返回值是true,当该元素集合中没有存在时,那么返回值是false
Collection 接口没有提供按索引删除元素的方法。Collection 接口定义的方法都是基于元素的,而不是基于索引的。
- import java.util.ArrayList;
- import java.util.Collection;
-
- public class test1 {
- public static void main(String[] args) {
- // 生成一个coll变量 它的类型是Collection 表示一组元素 其元素类型必须是String
- Collection
coll=new ArrayList<>(); - // 1.添加
- // 返回值为布尔类型
- boolean r1= coll.add("abc");
- System.out.println(r1);// true
- System.out.println(coll);// [abc]
- boolean r2= coll.add("efg");
- System.out.println(r2);// true
- System.out.println(coll);// [abc, efg]
-
- // 2.删除
- // 删除成功返回true 删除失败返沪false
- boolean r3=coll.remove("abc");
- System.out.println(r3);// true
- System.out.println(coll);// [efg]
- boolean r4=coll.remove("aaa");
- System.out.println(r4);// false
- System.out.println(coll);// [efg]
- }
- }
语法:集合名称.contains(元素);
当要元素在集合中存在时,那么返回值是true,当该元素集合中没有存在时,那么返回值是false
细节:它的底层逻辑是通过equals方法进判断的,因此当集合存储的元素是对象时,也想通过
contains判断该对象是否存在时,需要重写JavaBean的contains方法
- import java.util.ArrayList;
- import java.util.Collection;
-
- public class test1 {
- public static void main(String[] args) {
- // 生成一个coll变量 它的类型是Collection 表示一组元素 其元素类型必须是String
- Collection
coll=new ArrayList<>(); - // 1.添加
- // 返回值为布尔类型
- boolean r1= coll.add("abc");
- System.out.println(r1);// true
- System.out.println(coll);// [abc]
- boolean r2= coll.add("efg");
- System.out.println(r2);// true
- System.out.println(coll);// [abc, efg]
-
- // 2.判断元素是否包含
- boolean r3=coll.contains("aaa");
- System.out.println(r3);// false
- boolean r4=coll.contains("abc");
- System.out.println(r4);// true
- }
- }
语法:集合名称.isEmpty();
- import java.util.ArrayList;
- import java.util.Collection;
-
- public class test1 {
- public static void main(String[] args) {
- // 生成一个coll变量 它的类型是Collection 表示一组元素 其元素类型必须是String
- Collection
coll=new ArrayList<>(); - // 1.添加
- // 返回值为布尔类型
- boolean r1= coll.add("abc");
- System.out.println(r1);// true
- System.out.println(coll);// [abc]
- boolean r2= coll.add("efg");
- System.out.println(r2);// true
- System.out.println(coll);// [abc, efg]
-
- // 2.判断元素是否为空
- boolean r3=coll.isEmpty();
- System.out.println(r3);// false
- }
- }
语法:集合名称.size();
- public class test1 {
- public static void main(String[] args) {
- // 生成一个coll变量 它的类型是Collection 表示一组元素 其元素类型必须是String
- Collection
coll=new ArrayList<>(); - // 1.添加
- // 返回值为布尔类型
- boolean r1= coll.add("abc");
- System.out.println(r1);// true
- System.out.println(coll);// [abc]
- boolean r2= coll.add("efg");
- System.out.println(r2);// true
- System.out.println(coll);// [abc, efg]
-
- // 2.判断元素是否为空
- int r3=coll.size();
- System.out.println(r3);// 2
- }
- }
Collection的遍历方式有三种,迭代器遍历、增强for遍历、lamda表达式遍历,没有普通的for循环遍历,因为普通的for循环遍历需要通过索引遍历,而set没有索引,因此没有普通的for循环遍历
迭代器在java中的类是Iterator,迭代器是集合专用的遍历方式
step1:Collection获取迭代器的方式是Iterator<集合元素类型>迭代器名称=集合名称.Iterator();
(
Iterator 是Java集合框架中的一个接口,它提供了一种遍历集合元素的方式。 是一个泛型参数,它指定了这个迭代器将用于遍历包含String类型元素的集合。)
它返回迭代器对象(指针),默认指向当前集合的0索引
step2:迭代器对象名称.hasnext();用来判断当前位置是否存在元素,如果存在则返回true,如果不存在则返回false
step3:迭代器对象名称.next();用来获取当前位置的元素,并将迭代器指向下一个位置
通过这三种方法 我们就可以遍历集合
语法:
Iterator<集合元素类型>迭代器名称=集合名称.Iterator();
while(迭代器对象名称.hasnext()){
System.out.println(迭代器对象名称.next());
}
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Iterator;
-
- public class 迭代器遍历 {
- public static void main(String[] args) {
- // 1.创建集合并添加元素
- Collection
coll=new ArrayList<>(); - coll.add("文韬");
- coll.add("黄子弘凡");
- coll.add("何运晨");
-
- // 2.创建迭代器对象
- Iterator
it=coll.iterator(); -
- // 3.迭代器遍历集合
- while (it.hasNext()){
- System.out.println(it.next());
- }
- // 文韬
- // 黄子弘凡
- // 何运晨
- }
- }
注意点:
①迭代器遍历完毕,指针不会复位
如果想要遍历第二次 就要生成新的迭代器对象
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Iterator;
-
- public class 迭代器遍历 {
- public static void main(String[] args) {
- // 1.创建集合并添加元素
- Collection
coll=new ArrayList<>(); - coll.add("文韬");
- coll.add("黄子弘凡");
- coll.add("何运晨");
-
- // 2.创建迭代器对象
- Iterator
it=coll.iterator(); -
- // 3.迭代器遍历集合
- while (it.hasNext()){
- System.out.println(it.next());
- }
- // 文韬
- // 黄子弘凡
- // 何运晨
-
- // 迭代器遍历完毕,指针不会复位
- // 以下结果都是false 因为遍历完集合 指针指向没有元素的位置 而且不会复原
- System.out.println(it.hasNext());// false
- System.out.println(it.hasNext());// false
- System.out.println(it.hasNext());// false
- System.out.println(it.hasNext());// false
- System.out.println(it.hasNext());// false
-
- // 遍历第二次
- // 需要生成新的迭代器对象
- Iterator
it2=coll.iterator(); - while (it2.hasNext()){
- System.out.println(it2.next());
- }
- // 文韬
- // 黄子弘凡
- // 何运晨
- }
- }
- }
②循环中只能使用一次next方法
如果在循环中使用多次next方法就可能出现该位置没有元素的情况
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Iterator;
-
- public class 迭代器遍历 {
- public static void main(String[] args) {
- // 1.创建集合并添加元素
- Collection
coll=new ArrayList<>(); - coll.add("文韬");
- coll.add("黄子弘凡");
- coll.add("何运晨");
-
- // 2.创建迭代器对象
- Iterator
it=coll.iterator(); -
- // 3.迭代器遍历集合
- while (it.hasNext()){
- System.out.println(it.next());
- System.out.println(it.next());
- }
- // 文韬
- // 黄子弘凡
- // 何运晨
- // 报错:NoSuchElementException
- }
- }
③迭代器遍历时,不能用集合的方式进行增加或删除,必须用迭代器的方法进行删除
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Iterator;
-
- public class 迭代器遍历 {
- public static void main(String[] args) {
- // 1.创建集合并添加元素
- Collection
coll=new ArrayList<>(); - coll.add("文韬");
- coll.add("黄子弘凡");
- coll.add("何运晨");
-
- // 2.创建迭代器对象
- Iterator
it=coll.iterator(); -
- // 3.迭代器遍历集合
- while (it.hasNext()){
- System.out.println(it.next());
- // 通过迭代器的remove方法删除元素
- it.remove();
- // 如果不输出当前元素的值 而是直接删除当前元素的值并将指针下移 就会报错
- }
-
- // 4.输出集合中的元素
- System.out.println(coll);
- }
- }
④当迭代器遍历完之后再次使用 迭代器对象名称.next()就会报错
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Iterator;
-
- public class 迭代器遍历 {
- public static void main(String[] args) {
- // 1.创建集合并添加元素
- Collection
coll=new ArrayList<>(); - coll.add("文韬");
- coll.add("黄子弘凡");
- coll.add("何运晨");
-
- // 2.创建迭代器对象
- Iterator
it=coll.iterator(); -
- // 3.迭代器遍历集合
- while (it.hasNext()){
- System.out.println(it.next());
- }
- // 文韬
- // 黄子弘凡
- // 何运晨
-
- // 当迭代器遍历完之后再次使用 迭代器对象名称.next()就会报错
- System.out.println(it.next());// NoSuchElementException 表示不存在这个元素
- }
- }
迭代器总结:
1、迭代器遍历不需要依赖索引,它是通过创建指针并移动指针来遍历集合中的元素
2、迭代器需要掌握的三种方法
Iterator<集合元素类型>迭代器名称=集合名称.Iterator();
迭代器对象名称.hasnext();
迭代器对象名称.next();
增强for的底层就是迭代器,是为了简化迭代器的代码书写的
所有的单列集合和数组才能用增强for进行遍历
语法:
for(元素的数据类型 变量名:数组或者单列集合){
}
其中变量名存储的内容就是遍历过程中的每一个元素
- import java.util.ArrayList;
- import java.util.Collection;
-
- public class 增强for遍历 {
- public static void main(String[] args) {
- // 1.创建集合并添加元素
- Collection
coll=new ArrayList<>(); - coll.add("文韬");
- coll.add("黄子弘凡");
- coll.add("何运晨");
-
- // 2.增强for循环遍历
- // String表示遍历元素的类型 s用来存储遍历的每一个元素 coll表示遍历的集合名称
- for(String s:coll){
- System.out.println(s);// 遍历过程中的每一个元素
- }
- // 文韬
- // 黄子弘凡
- // 何运晨
- }
- }
注意:当修改变量名存放的内容时,并不会修改集合的内容
- import java.util.ArrayList;
- import java.util.Collection;
-
- public class 增强for遍历 {
- public static void main(String[] args) {
- // 1.创建集合并添加元素
- Collection
coll=new ArrayList<>(); - coll.add("文韬");
- coll.add("黄子弘凡");
- coll.add("何运晨");
-
- // 2.增强for循环遍历
- // String表示遍历元素的类型 s用来存储遍历的每一个元素 coll表示遍历的集合名称
- // 修改变量s的内容并不会改变集合的内容
- for (String s : coll) {
- s="aaa";
- }
- System.out.println(coll);
- // 文韬
- // 黄子弘凡
- // 何运晨
- // 输出结果不会变成:
- // aaa
- // aaa
- // aaa
- }
- }
生成增强for语句的快捷方式:
遍历的集合名称.for并回车即可生成
for(元素的数据类型 变量名:数组或者单列集合){
}
语法:
Collection<遍历元素的数据类型> 集合对象名称=new ArrayList<>();
集合对象名称.forEach(s->System.out.println(s));
step1:生成集合对象 e.g: Collection
step2:通过集合对象使用forEach方法 ,方法中写变量加上->输出元素的语句
e.g:coll.forEach(s-> System.out.println(s));
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.function.Consumer;
-
- public class lamdba遍历 {
- public static void main(String[] args) {
- Collection
coll=new ArrayList<>(); - coll.add("文韬");
- coll.add("黄子弘凡");
- coll.add("曹恩齐");
- // forEach是Iterable接口的默认方法 用于遍历集合中的每个元素 并对每个元素执行一个给定的操作
- // Collection接口拓展了Iterable接口,因此所有实现Collection接口的类也实现了Iterable接口
- // 因此实现Collection接口的对象coll也可以使用Iterable接口的方法forEach
- // forEach需要传入Consumer接口 当方法的参数是接口时 在调用方法时需要传递接口的实现类
- // 生成Consumer实现类的对象
- // 由于Consumer接口只有一个抽象方法 其实现类是函数式接口的匿名内部类 可以使用lamdba表达式简化
- // 简化lamdba表达式
- // 1.简化前
- coll.forEach(new Consumer
(){ - @Override
- public void accept(String s){
- System.out.println(s);
- }
- });
- /*文韬
- 黄子弘凡
- 曹恩齐*/
-
- // 2.简化后
- coll.forEach( s-> System.out.println(s));
- /* 文韬
- 黄子弘凡
- 曹恩齐*/
- }
- }
函数式编程:忽略面向对象的复杂语法,强调做什么而不是谁去做,做什么强调的是重写方法的形参类型、方法体、return返回值
语法:
()->{
}
其中()对应着重写方法的形参 ->是固定格式 {}对应着方法的方法体
简化规则:
1、参数类型可以省略不写
简化前:

简化后:

2、当只有一个参数时,参数类型可以省略不写,同时()也可以省略不写

3、如果lamdba表达式的方法体只有一行,那么大括号、分号、return可以省略不写,要省略需同时省略,不能只省略大括号、分号、return中的一部分
简化前:

简化后:

注意:
1、lambda表达式可以用来简化匿名内部类的书写
2、lambda表达式只能简化函数式接口的匿名内部类,其中函数式接口指的是有且仅有一个抽象方法的接口(只能是接口不能是抽象类),接口上方可以加@FuctionInterface注解来检验
e.g1:

e.g2:

简化前:

简化后:

