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/