Java中copy一维数组以及其他数据结构转换为数组

1.一维数组的copy

数组类型的copy一般找API中Arrays类以及Object类的方法

1.1使用Arrays的copyOf方法

在这里插入图片描述
这是javaAPI上Arrays类的方法看到他们都是静态方法且支持基本数据类型以及泛型,
同时做个测试观察这个方法是深拷贝还是浅拷贝

@Test
    public void test01(){
        int[] arr1=new int[]{1,2,3,4,5,6};
        int[] arr2 = Arrays.copyOf(arr1, 5);
        for(int num:arr2){
            System.out.println(num);
        }
        System.out.println(arr1);
        System.out.println(arr2);
    }

测试结果为

1
2
3
4
5
[I@4ee285c6
[I@621be5d1

可以观察到执行此方法是浅拷贝
可以看到官方API说
Copies the specified array, truncating or padding with zeros (if necessary) so the copy has the specified length.
复制指定的数组,截断或用零填充(如果需要),使副本具有指定的长度。
所以我们第二个参数可以大于原数组长度但不能小于0

1.1.1第二个参数大于原数组长度

当第二个参数超过原数组的下标

public void test01(){
        int[] arr1=new int[]{1,2,3,4,5,6};
        int[] arr2 = Arrays.copyOf(arr1, 9);
        for(int num:arr2){
            System.out.println(num);
        }
    }

结果为

1
2
3
4
5
6
0
0
0

1.1.2第二个参数等于0

int[] arr1=new int[]{1,2,3,4,5,6};
        int[] arr2 = Arrays.copyOf(arr1, 0);
        for(int num:arr2){
            System.out.println(num);
        }

结果什么都没有,这是显而易见的新数组长度为0

1.1.3第二个参数小于0

int[] arr1=new int[]{1,2,3,4,5,6};
        int[] arr2 = Arrays.copyOf(arr1, -1);
        for(int num:arr2){
            System.out.println(num);
        }

结果抛出异常
在这里插入图片描述

2.1使用Arrays类的copyOfRange方法

官方API
在这里插入图片描述
copy的是原数组的 [from,to)的下标
测试:

int[] arr1=new int[]{1,2,3,4,5,6};
        int[] arr2=Arrays.copyOfRange(arr1,0,4);
        for(int num:arr2){
            System.out.println(num);
        }
        System.out.println(arr1);
        System.out.println(arr2);

结果为:

1
2
3
4
[I@4ee285c6
[I@621be5d1

也是浅拷贝

3.1Object类的clone方法

在这里插入图片描述
测试:

int[] arr1=new int[]{1,2,3,4,5,6};
        int[] clone = arr1.clone();
        for(int num:clone){
            System.out.println(num);
        }
        System.out.println(arr1);
        System.out.println(clone);

结果为

1
2
3
4
5
6
[I@4ee285c6
[I@621be5d1

结果也是浅拷贝

4.1System类的copyArray方法

在这里插入图片描述
这是个静态无返回值的方法,所以需要有两个数组然后将一个数组的一部分copy到另一个数组
test:

int[] arr1=new int[]{1,2,3,4,5,6};
        int[] arr2=new int[]{4,5,6,7,8,9};
        System.arraycopy(arr1,2,arr2,3,2);
        for(int num:arr2){
            System.out.println(num);
        }

result:

4
5
6
3
4
9

当长度过大使某一个数组下标超过长度时时抛出下标溢出异常

java.lang.ArrayIndexOutOfBoundsException
	at java.lang.System.arraycopy(Native Method)
	at ArrayTest.test03(ArrayTest.java:32)

这也是浅拷贝

1.5深拷贝

int[] arr1=new int[]{1,2,3};
        int[] arr2=arr1;
        arr2[0]=5;
        for(int num:arr1){
            System.out.println(num);
        }
5
2
3

2.其他数据结构转换为数组

查找API看哪些数据结构支持转换为数组,以及查看它们父类是否支持转换为数组

2.1实现Collection的类转换为数组

在这里插入图片描述

2.1.1无参

Set<Integer> set=new HashSet<>();
        set.add(1);set.add(2);set.add(3);
        Object[] arr =  set.toArray();
        for(Object num:arr){
            System.out.println(num);
        }

这里不能直接强转为Integer[]

在这里插入图片描述

尽管他每个存储的都是Integer但是强转的前提是被强转的类是强转后的父类,但是Integer[]是Object的子类而不是Object[]的子类,所以要使用有参的函数来转换

2.1.2有参函数

test

Set<Integer> set=new HashSet<>();
        set.add(1);set.add(2);set.add(3);
        Integer[] arr =  set.toArray(new Integer[set.size()]);
        for(Object num:arr){
            System.out.println(num);
        }

result:

1
2
3
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值