
ArrayList在Java数组中的使用技巧
这篇博客灵感来源于某一天Aileen(🤫)遇到了一道数组合并的题,于是她按照自己的思路把这道题的解题过程写了下来,如下图所示:  | 
|---|

她的想法是想把奇数和偶数分别用两个数组装起来再把它们合并在一个新的数组里面But她尝试通过编写代码实现自己的想法,如下:  | 
|---|
import java.util.Arrays;
public class Work11_1 {
    public static  String reverse(int[] arr){
        //创建一个空数组装所有元素
        int[] all = new int[]{};
        //创建一个空数组装偶数
        int[] evenarr = new int[]{};
        //创建一个空数组装奇数
        int[] oddarr = new int[]{};
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % 2 == 0) {
                 evenarr[i] = arr[i];
            }else{
                oddarr[i] = arr[i];
            }
        }
        System.arraycopy(oddarr,0,all,0,oddarr.length);
        return Arrays.toString(all);
    }
    public static void main(String[] args) {
        int[] array = new int[]{1,2,3,4,5,6};
        System.out.println(reverse(array));
    }运行结果:
通过报错信息我们可以知道,她的代码存在着一些问题: 数组在初始化时(即:`all` ,`evenarr`,`oddarr`的创建)未给它们分配大小,导致后面我们其实是无法向这些数组里面添加元素的,中国有句古话“强扭的瓜不甜”,即使我们强制给他们添加新元素,这也是徒劳,最终就会看到控制台那句报错信息写的:数组越界异常~  | 
|---|

她为了解决这个问题,在Java中找到了一个内置类,即 `ArrayList` , 下面我们将进入ArrayList的学习:  | 
|---|
ArrayList:这个类是Java内置的一个类它继承了Java中的AbstractList并实现了List接口。他是一个可以动态修改的数组,与普通数组相比,他没有固定大小的限制,我们可以通过它进行添加或删除元素。
import java.util.ArrayList;
public class ArrList {
    public static void main(String[] args) {
        // 创建一个 mylist 存储字符串
        ArrayList<String> mylist = new ArrayList<>();
        System.out.println("---添加----------------------------------------------------------------------");
        // 添加元素
        mylist.add("Apple");
        mylist.add("Banana");
        mylist.add("Cherry");
        System.out.println(mylist);
        System.out.println("---访问------------------------------------------------------------------------");
        //使用 get() 方法访问ArrayList中的元素
        System.out.println(mylist.get(2));//访问第三个元素
        System.out.println("---修改------------------------------------------------------------------------");
        //set() 方法修改ArrayList中的元素
        mylist.set(0,"youzi");//第一个参数为索引位置,第二个是要修改的值
        System.out.println(mylist);
        System.out.println("---删除------------------------------------------------------------------------");
        //remove() 方法删除ArrayList中的元素
        mylist.remove(2);//删除第三个元素
        System.out.println(mylist);
        System.out.println("---计算大小------------------------------------------------------------------------");
        System.out.println( mylist.size());
        System.out.println("---迭代打印数组列表------------------------------------------------------------------------");
        for (int i = 0; i < mylist.size(); i++) {
            System.out.println(mylist.get(i));
        }
        System.out.println("---使用for-each打印数组列表------------------------------------------------------------------------");
        for (String fruit:mylist) {
            System.out.println(fruit);
        }
    }
}打印结果:
 

让我们把上面学到的ArrayList类的方法用到我们解决这道题的思路上吧~  | 
|---|
学以致用使用ArrayList(单线程常用)解决问题import java.util.ArrayList;
import java.util.Arrays;
public class Work11_1 {
    public static String reverse(int[] arr) {
        //创建两个 Integer 类型的 ArrayList 数组用于储存 奇数和偶数 的数组
        //偶数数组
        ArrayList<Integer> evenList = new ArrayList<>();
        //奇数数组
        ArrayList<Integer> oddList = new ArrayList<>();
        //遍历数组,将对应的元素放到对应的数组里面
        for (int i=0; i < arr.length ; i++){
            if (arr[i] % 2 == 0) {
                evenList.add(arr[i]);//将偶数元素装入其对应数组
            }else{
                oddList.add(arr[i]);//将奇数元素装入其对应数组
            }
        }
        //创建合并后的数组
        int [] all = new int[evenList.size()+ oddList.size()];
        //将奇数数组复制到合并后的数组
        for (int i = 0; i < oddList.size() ; i++) {
            all[i] = oddList.get(i);
        }
        //将偶数数组复制到合并后的数组
        for (int i = 0; i < evenList.size(); i++) {
            all[oddList.size()+i] = evenList.get(i);
        }
        return  Arrays.toString(all);
    }
    public static void main(String[] args) {
        int[] array = new int[]{1,2,3,4,5,6};
        System.out.println(reverse(array));
    }
   }我们通过使用ArrayList这个动态数组能够提高读`get()`写`add()`、`set()`操作的高效性,并且其内存开销比较小,因为它不会每次修改创建数组的副本。However`ArrayList`不是线程安全的,在多线程环境中,如果多个线程同时对同一个`ArrayList`修改,可能会导致数据不一致,或者抛出异常,如果想在多线程环境中使用`ArrayList`.需要手动同步,但它会增加代码的复杂性和错误的风险。  | 
|---|
使用CopyOnWriteArrayList(多线程适用)解决问题import java.util.Arrays;
import java.util.concurrent.CopyOnWriteArrayList;
public class Work11_1 {
    public static String reverse(int[] arr) {
        // 使用 CopyOnWriteArrayList 来存储奇数和偶数
        CopyOnWriteArrayList<Integer> evenList = new CopyOnWriteArrayList<>();
        CopyOnWriteArrayList<Integer> oddList = new CopyOnWriteArrayList<>();
        // 遍历输入数组,将奇数和偶数分别放入不同的列表
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % 2 == 0) {
                evenList.add(arr[i]); // 偶数
            } else {
                oddList.add(arr[i]); // 奇数
            }
        }
        // 创建合并后的数组
        int[] all = new int[evenList.size() + oddList.size()];
        // 将奇数列表复制到合并后的数组
        for (int i = 0; i < oddList.size(); i++) {
            all[i] = oddList.get(i);
        }
        // 将偶数列表复制到合并后的数组
        for (int i = 0; i < evenList.size(); i++) {
            all[oddList.size() + i] = evenList.get(i);
        }
        // 返回合并后的数组的字符串表示
        return Arrays.toString(all);
    }
    public static void main(String[] args) {
        int[] array = new int[]{1, 2, 3, 4, 5, 6};
        System.out.println(reverse(array));
    }
}Java中for-each的使用基本语法for (元素类型 变量名 : 数组或集合){
	//这里编写对变量的操作
}具体实例public class ForEach {
    public static void main(String[] args) {
        int[] numbers = {1,2,3,4,5};
        //使用for-each循环遍历数组
        //通过变量num遍历数组numbers里面的每一个元素
        for(int num : numbers){
            System.out.print(num+" ");
        }
    }
}