增强for循环

(1)增强for循环概述

增强 for循环 JDK1.5 引入的语法,简化数组和Collection集合的遍历

(2)格式:

for(元素数据类型 变量 : 数组或者Collection集合) {

使用变量即可,该变量就是元素

}

(3)好处和注意事项

好处:简化遍历

注意事项:增强for的目标要判断是否为null

注意新式for循环,你在迭代集合的途中,不能增删元素,会报并发修改异常

public class MyTest {
    public static void main(String[] args) {
        int[] arr={20,30,50};
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println("================================");
        for(int a:arr){
            System.out.println(a);
        }
        System.out.println("==============================");
        ArrayList<Integer> integers = new ArrayList<>();
        integers.add(100);
        integers.add(200);
        integers.add(300);
        integers.add(400);
        for(Integer num:integers){
            System.out.println(num);
        }
    }
}
注意事项  并发修改异常
public class MyTest2 {
    public static void main(String[] args) {
        ArrayList<Integer> integers = new ArrayList<>();
        integers.add(100);
        integers.add(200);
        integers.add(300);
        integers.add(400);
        
        //ConcurrentModificationException 并发修改异常
        //新式for循环在遍历集合时,底层用的还是迭代器,你在遍历途中,如果改变集合的长度,就会报并发修改异常。
      /*  for (Integer integer : integers) {
            if(integer.intValue()==200){
                integers.add(300);
            }
        }
*/
		//解决办法
        for (int i = 0; i < integers.size(); i++) {
            if (integers.get(i).intValue()==200) {
                integers.add(300);
            }
        }

        System.out.println(integers);

    }
}

可变参数

(1)可变参数概述:

定义方法的时候不知道该定义多少个参数

(2)格式:

修饰符 返回值类型 方法名(数据类型… 变量名){}

(3)注意事项:

a: 这里的变量其实是一个数组

b: 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个

public class MyTest {
    public static void main(String[] args) {
        int sum = add(1, 2);
        int sum2 = add(1, 2, 3);
        int sum3 = add(1, 2, 3, 4);

        System.out.println(sum);
        System.out.println(sum2);
        System.out.println(sum3);

    }
    //可变参数,一次可以接收多个同类型的参数
    //可变参数 本质是是个数组
    //如果一个方法的形参有多个参数,那么可变参数,应该是最后一个。
    private static int add(int b,int... a) {
        //System.out.println(a.length);
        int sum=b;
        for (int i : a) {
            sum += i;
        }
        return sum;
    }
    //如果不采用可变参数,需要方法重载 代码量大 复用性不高,如下,

   /* private static int add(int i, int i1, int i2, int i3) {
        return i1 + i2 + i3 + i;
    }

    private static int add(int i, int i1, int i2) {
        return i1 + i2 + i;
    }

    private static int add(int i, int i1) {
        return i1  + i;

    }*/

}

Arrays工具类的asList()方法的使用

Arrays工具类的asList(T… t):将数组转换成集合

(1)如果传的是一个基本类型的数组,他是把这个数组对象,放到集合中。

(2)如果传入的是一个包装类型的数组,他是吧数组中的元素,取出来放到集合中。

(3)如果传入多个包装类型的数组,那么他是把多个数组对象,放到集合中。

注意事项:

得到的集合长度是不可变的 你不能往这个转换后的集合中 添加元素(add) 和 删除元素(remove)

只能获取元素(get)

public class MyTest2 {
    public static void main(String[] args) {
        int[] arr={20,30,40};
        //我传的是一个基本类型的数组,他是把这个数组对象,放到集合中
        List<int[]> ints = Arrays.asList(arr);
        System.out.println(ints.size());//1
        System.out.println(ints.get(0)[0]);//20
        
        Integer[] arr2 = {20, 30, 40};
        //我传入的是一个包装类型的数组,他是吧数组中的元素,取出来放到集合中
        List<Integer> integers = Arrays.asList(arr2);
        System.out.println(integers.size());//3
        System.out.println(integers);//[20, 30, 40]
        Integer[] arr3 = {20, 30, 40};
        Integer[] arr4 = {20, 30, 400};
        //如果你传入多个包装类型的数组,那么他是把多个数组对象,放到集合中。
        List<Integer[]> integers1 = Arrays.asList(arr3, arr4);
        System.out.println(integers1.size());//2
        Integer integer = integers1.get(1)[2];
        System.out.println(integer);//400
        //也可以这样得到一个集合。
        List<Integer> integers2 = Arrays.asList(20, 20, 30, 50, 30);
        System.out.println(integers2.size());//5
        System.out.println(integers2);//[20, 20, 30, 50, 30]
    }
}

集合嵌套之ArrayList嵌套ArrayList

代码举例
需求:

我们班有学生,每一个学生是不是一个对象,所以我们可以使用一个集合表示我们班级的学生

ArrayList但是呢,我们是不是还有班级,每个班级是不是也是一个ArrayList

而我现在有多个ArrayList。也要用集合存储,怎么办呢 ?

采用集合嵌套:

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +

                '}';
    }
}
public class MyTest {
    public static void main(String[] args) {
        Student s1 = new Student("张三", 23);
        Student s2 = new Student("李四", 23);
        Student s3 = new Student("王五", 23);
        Student s4 = new Student("赵六", 23);
        Student s5 = new Student("田七", 23);
        Student s6 = new Student("刘八", 23);
        ArrayList<Student> javaList = new ArrayList<>();
        javaList.add(s1);
        javaList.add(s2);
        ArrayList<Student> webList = new ArrayList<>();
        webList.add(s3);
        webList.add(s4);
        ArrayList<Student> linuxList = new ArrayList<>();
        linuxList.add(s5);
        linuxList.add(s6);
        ArrayList<ArrayList<Student>> maxList = new ArrayList<>();
        maxList.add(javaList);
        maxList.add(webList);
        maxList.add(linuxList);
        //遍历集合中的每一个学生。
        //普通for循环
        //外层循环  ArrayList<ArrayList<Student>> maxList = new ArrayList<>() 对这个集合进行操作
        for (int i = 0; i < maxList.size(); i++) {
            
            ArrayList<Student> minList = maxList.get(i);
            //里层循环对ArrayList<Student> javaList = new ArrayList<>() 类集合进行操作
            for (int j = 0; j < minList.size(); j++) {
                Student student = minList.get(j);
                System.out.println(student.getName()+"==="+student.getAge());
            }
            System.out.println();
        }
        System.out.println("==================================");
        //增强for循环 遍历学生
      /*  for (ArrayList<Student> minList : maxList) {
            for (Student student : minList) {
                System.out.println(student.getName() + "===" + student.getAge());
            }
            System.out.println();
        }
        System.out.println("================================");*/
    }
}