【Java】【数据结构】数组Array(全)

Java数组

1、数组初始化

// 数组初始化
public static void initArray() {
    int[] arr0 = {1, 2, 3};
    int[] arr1 = new int[]{};
    int[] arr2 = new int[]{1, 2, 3};
    int[] arr3 = new int[5];
    // 求和
    Arrays.stream(arr).sum();
    // 打印
	System.out.println(Arrays.toString(a));
}

2、数组 / List 转换

区分引用数据类型(String)数组、基本数据类型数组 转List。

2.1 String[] / List转换

1、推荐使用集合工具类Collections的addAll()方法将Array转为List。
2、List的toArray()方法将List转为Array。

// String[]数组与List转换
public static void stringArrConvertList() {
    // 一、String[]数组转List
    String[] strArr = new String[3];

    // 1、Arrays.asList()转换后不能支持增删改修改List,不建议
    List<String> strlist1 = Arrays.asList(strArr);
    // strlist1.add("err"); 编译会报错
    System.out.println(strlist1); // [null, null, null]

    // 2、new ArrayList支持增删改,建议写法
    List<String> strList2 = new ArrayList<>(Arrays.asList(strArr));
    strList2.add("f");
    System.out.println(strList2); // [null, null, null, f]

    // 3、集合工具类最高效,最推荐写法
    List<String> strList3 = new ArrayList<>(strArr.length);
    Collections.addAll(strList3, strArr);
    strList3.add(0, "f");
    System.out.println(strList3);  // [f, null, null, null]

    // 二、List转String[]数组
    strList3.add(0, "RR");
    strList3.add(1, "EE");
    strList3.add(2, "VV");
    System.out.println(strList3); // [RR, EE, VV, f, null, null, null]

    // 推荐用法
    String[] strRet = strList3.toArray(new String[]{});
    String[] strRet2 = strList3.toArray(new String[strlist1.size()]);
    System.out.println(Arrays.toString(strRet));  // [RR, EE, VV, f, null, null, null]
	// list.toArray()返回Object[]对象
    Object[] objRet = strList3.toArray(); 
    // 禁止使用,String[]对结果强转,Object[] 不能转 String[]
    // String[] strErr = (String[])strList3.toArray(); 
    // 一般采用此支持泛型的有参toArray方法:<T> T[] toArray(T[] a);
}
2.2 int[] / List 转换

1、int[]转List步骤:

  • 将原数组转为顺序流 Arrays.stream();
  • 将流的元素装箱到包装类 IntStream.boxed();
  • 将元素添加到新的List中 Collectors.toList();

2、List转int[]步骤:

  • 将List转为流 list.stream();
  • 过滤空对象
  • 映射到int
  • 将元素添加到新Array中
// 基本数据类型数组转List
public static void intArrConvertList() {
    // 一、int[]数组转List,由于装箱机制,基本数据类型数组与List转换需借助stream
    int[] intArr = new int[]{1, 2, 3};
    List<Integer> intList = Arrays.stream(intArr).boxed().collect(Collectors.toList());
    System.out.println(intList); // [1, 2, 3]

    // 二、List转int[]数组
    intList.add(5);
    intList.add(6);
    System.out.println(intList); // [1, 2, 3, 5, 6]

    Object[] objArr = intList.toArray();  // 返回Object[] 对象
    Integer[] integerArr = intList.toArray(new Integer[intList.size()]); // 返回Integer[] 对象
    int[] intRet = intList.stream().mapToInt(Integer::valueOf).toArray(); // 返回int[]

    // 存在null时
    intList.add(null);
    intList.add(8);
    System.out.println(intList); // [1, 2, 3, 5, 6, null, 8]

    // 过滤null对象,建议写法
    int[] intRet1 = intList.stream()
                            .filter(Objects::nonNull)
                            .mapToInt(Integer::valueOf)
                            .toArray();
    System.out.println(Arrays.toString(intRet1)); // [1, 2, 3, 5, 6, 8]
    // 转为默认值
    int[] intRet2 = intList.stream()
                            .mapToInt(i -> (i == null ? 0 : i))
                            .toArray();
    System.out.println(Arrays.toString(intRet2)); // [1, 2, 3, 5, 6, 0, 8]
}

3、数组拷贝

  • 使用clone()方法时注意区分深拷贝与浅拷贝概念。
  • System.arraycopy()
  • Arrays.copyOf()和Arrays.copyOfRange() ,推荐使用。
public static void methFor() {
    int[] nums = {2,5,1,3,4,7};
    int len = nums.length;
    int[] ret = new int[len];
    for (int i = 0; i < len; i++) {
        ret[i] = nums[i];
    }
    // Arrays.toString()转为String类型
    System.out.println(Arrays.toString(ret));   // [2, 5, 1, 3, 4, 7]
}

public static void methClone() {
    // 注意区分深拷贝与浅拷贝,此处只以基本数据类型一维数组为例
    int[] nums = {0,1,2,3,4,5};
    int[] ret = nums.clone();
    System.out.println(Arrays.toString(ret)); // [0, 1, 2, 3, 4, 5]
    // 基本数据类型数组的clone是深拷贝,重新开辟内存空间存放新数据
    nums[3] = 10;
    // 原数组修改不影响新数组
    System.out.println(Arrays.toString(ret)); // [0, 1, 2, 3, 4, 5]
}

public static void methSysArraycopy() {
    int[] nums = {1,2,3,4,5};
    // 目标数组必须已经存在,且不会被重构, 拷贝范围[from,to)
    int[] ret = new int[7];
    // 参数:原数组,原数组起始位,目标数组起始位,拷贝长度
    System.arraycopy(nums, 2, ret, 3, 2);
    // 默认补0
    System.out.println(Arrays.toString(ret)); // [0, 0, 0, 3, 4, 0, 0]
}

public static void methArraysCopyOf() {
    int[] nums = {1,2,3,4,5,6,7};
    // 1、参数:原数组,新数组长度
    int[] ret = Arrays.copyOf(nums, nums.length);
    System.out.println(Arrays.toString(ret)); // [1, 2, 3, 4, 5, 6, 7]
    // 长度<原数组长,截断
    ret = Arrays.copyOf(nums, 3);
    System.out.println(Arrays.toString(ret)); // [1, 2, 3]
    // 长度>原数组长,补零
    ret = Arrays.copyOf(nums, 8);
    System.out.println(Arrays.toString(ret)); // [1, 2, 3, 4, 5, 6, 7, 0]

    ///2、参数:原数组,[from, to)
    ret = Arrays.copyOfRange(nums, 2, 2);
    System.out.println(Arrays.toString(ret)); // []
    // 长度>原数组长,补零
    ret = Arrays.copyOfRange(nums, 3, 9);
    System.out.println(Arrays.toString(ret)); // [4, 5, 6, 7, 0, 0]
}

4、完整代码

import java.util.*;
import java.util.stream.Collectors;

public class ArrayNotes {
    public static void main() {
        initArray(); // 数组初始化
        arrConvertList(); // 数组/List转换
        copyArray(); // 数组拷贝
    }

    // 数组初始化
    public static void initArray() {
        int[] arr0 = {1, 2, 3};
        int[] arr1 = new int[]{};
        int[] arr2 = new int[]{1, 2, 3};
        int[] arr3 = new int[5];
    }

    // 数组转list
    public static void arrConvertList() {
        // String[]数组与List转换
        stringArrConvertList();
        // int[]数组与List转换
        intArrConvertList();
    }

    // String[]数组与List转换
    public static void stringArrConvertList() {
        // 一、String[]数组转List
        String[] strArr = new String[3];
        // 1、Arrays.asList()转换后不能支持增删改修改List
        List<String> strlist1 = Arrays.asList(strArr);
        System.out.println(Arrays.toString(strlist1.toArray())); // [null, null, null]

        // 2、new ArrayList支持增删改
        List<String> strList2 = new ArrayList<String>(Arrays.asList(strArr));
        strList2.add("f");
        System.out.println(Arrays.toString(strList2.toArray())); // [null, null, null, f]

        // 3、集合工具类最高效
        List<String> strList3 = new ArrayList<>(strArr.length);
        Collections.addAll(strList3, strArr);
        strList3.add(0, "f");
        System.out.println(Arrays.toString(strList3.toArray())); // [f, null, null, null]

        // 二、List转String[]数组
        strList3.add(0, "RR");
        strList3.add(1, "EE");
        strList3.add(2, "VV");
        System.out.println(Arrays.toString(strList3.toArray())); // [RR, EE, VV, f, null, null, null]

        String[] strRet = strList3.toArray(new String[]{});
        String[] strRet2 = strList3.toArray(new String[strlist1.size()]); // 推荐用法

        Object[] objRet = strList3.toArray(); // list.toArray()返回Object[]对象
        // String[] strErr = (String[])strList3.toArray(); // 禁止使用会报错
        System.out.println(Arrays.toString(strRet));
    }

    // 由于装箱机制,基本数据类型数组与List转换需借助stream
    public static void intArrConvertList() {
        // 一、int[]数组转List
        int[] intArr = new int[]{1, 2, 3};
        List<Integer> intList = Arrays.stream(intArr).boxed().collect(Collectors.toList());

        // 二、List转int[]数组
        intList.add(5);
        intList.add(6);
        System.out.println(Arrays.toString(intList.toArray()));  // [1, 2, 3, 5, 6]

        Object[] objArr = intList.toArray(); // list.toArray()返回Object[] 对象
        Integer[] integerArr = intList.toArray(new Integer[intList.size()]); // 返回Integer[] 对象
        int[] intRet = intList.stream().mapToInt(Integer::valueOf).toArray(); // 推荐写法

        // 存在null时
        intList.add(null);
        intList.add(8);
        System.out.println(Arrays.toString(intList.toArray()));  // [1, 2, 3, 5, 6, null, 8]
        // 过滤null对象
        int[] intRet1 = intList.stream()
                                .filter(Objects::nonNull)
                                .mapToInt(Integer::valueOf)
                                .toArray();
        // 转为默认值
        int[] intRet2 = intList.stream()
                                .mapToInt(i -> (i == null ? 0 : 1))
                                .toArray();
    }

    // 数组拷贝
    public static void copyArray() {
        methFor();  // for循环
        methClone();    // clone()
        methSysArraycopy();   // System.arraycopy()
        methArraysCopyOf();   // Arrays.copyOf()和Arrays.copyOfRange()
    }

    public static void methFor() {
        int[] nums = {2,5,1,3,4,7};
        int len = nums.length;
        int[] ret = new int[len];
        for (int i = 0; i < len; i++) {
            ret[i] = nums[i];
        }
        // Arrays.toString()转为String类型
        System.out.println(Arrays.toString(ret));   //[2, 5, 1, 3, 4, 7]
    }

    public static void methClone() {
        // 注意区分深拷贝与浅拷贝,此处只以基本数据类型一维数组为例
        int[] nums = {0,1,2,3,4,5};
        int[] ret = nums.clone();
        System.out.println(Arrays.toString(ret)); // [0, 1, 2, 3, 4, 5]
        // 基本数据类型数组的clone是深拷贝,重新开辟内存空间存放新数据
        nums[3] = 10;
        // 原数组修改不影响新数组
        System.out.println(Arrays.toString(ret)); // [0, 1, 2, 3, 4, 5]
    }

    public static void methArraysCopyOf() {
        int[] nums = {1,2,3,4,5,6,7};
        // 参数:原数组,新数组长度
        int[] ret = Arrays.copyOf(nums, nums.length);
        System.out.println(Arrays.toString(ret)); // [1, 2, 3, 4, 5, 6, 7]
        // 长度<原数组长,截断
        ret = Arrays.copyOf(nums, 3);
        System.out.println(Arrays.toString(ret)); // [1, 2, 3]
        // 长度>原数组长,补零
        ret = Arrays.copyOf(nums, 8);
        System.out.println(Arrays.toString(ret)); // [1, 2, 3, 4, 5, 6, 7, 0]

        // 参数:原数组,[from, to)
        ret = Arrays.copyOfRange(nums, 2, 2);
        System.out.println(Arrays.toString(ret)); // []
        // 长度>原数组长,补零
        ret = Arrays.copyOfRange(nums, 3, 9);
        System.out.println(Arrays.toString(ret)); // [4, 5, 6, 7, 0, 0]
    }

    public static void methSysArraycopy() {
        int[] nums = {1,2,3,4,5};
        // 目标数组必须已经存在,且不会被重构, 拷贝范围[from,to)
        int[] ret = new int[7];
        // 参数:原数组,原数组起始位,目标数组起始位,拷贝长度
        System.arraycopy(nums, 2, ret, 3, 2);
        // 默认补0
        System.out.println(Arrays.toString(ret)); // [0, 0, 0, 3, 4, 0, 0]
    }
}

参考
https://blog.csdn.net/x541211190/article/details/79597236
https://www.techiedelight.com/zh/convert-int-array-integer-array-java/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值