Java数组的拷贝和扩容

拷贝

1.用for循环进行拷贝
创建一个和原来数组大小相同的数组,利用for循环将其元素一个一个放过去
代码实现:

int[] arr={1, 2, 3, 4};
int[] brr=new int[arr.length];
//for循环拷贝数组
for (int i = 0; i < arr.length; i++) {
    brr[i]=arr[i];
}
//分别打印arr和brr
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(brr));


运行结果:




2.用Arrays.copyOf()方法拷贝
用法讲解:Arrays.copyOf()是一个返回值为数组的方法,里边有两个参数,分别为被复制的数组以及新数组的长度。
int[ ] Arrays.copyOf(int[ ] arr,int newLength)
它的源码实现很简单,创建一个newLength长度的数组,然后调用System.arraycopy()方法,然后返回数组,System.arraycopy()方法下边讲。

代码实现:

int[] arr={1, 2, 3, 45};
//用Arrays.copyOf()方法进行拷贝
int[] brr=Arrays.copyOf(arr,arr.length);

System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(brr));


运行结果:




3.用System.arraycopy()方法拷贝
用法讲解:System.arraycopy()没有返回值,里边有5个参数:
native void System.arraycopy(int[ ]arr,int pos,int[ ]brr,int start,int length){}

这个方法的五个参数意义分别为:

arr:被复制的数组
pos:代表你要从arr的pos位置开始复制
brr:复制后的数组
start:从brr哪个下标开始放入数据
length:复制多少个数据

这个方法的意义就是,从arr的pos位置开始复制length个数据,然后拷贝到brr中,从start开始放数据

代码实现:

int arr[]={1,2,3,4,5,6};
int brr[]=new int[arr.length];

System.arraycopy(arr,0,brr,0,arr.length);

System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(brr));


运行结果:

这个方法是个native关键字修饰的方法,是底层实现的方法,看不到源代码。

这个方法比Arrays.copyOf()好的地方就是更加灵活,我不一定要把arr全复制,我可以复制一半,我也不一定要从brr的0下标开始放,我也可以从中间开始放数据。要会用,要将参数以及它代表的意思记牢,后边会常用到。



4.用clone()方法拷贝
这个方法相对比较简单,返回值为数组,直接用同类型数组接收就行了,没有参数。
代码实现:

int arr[]={1,2,3,4,5,6};
int brr[];
brr=arr.clone();
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(brr));


运行结果:



拷贝常见问题
四种方法的不同?

上边第一种方法和第三种方法必须要自己开辟内存,如果brr没有实例化,传进去会报错。但是第二种和第四种方法在源码中帮你开辟了内存,不需要你进行实例化,直接定义一个数组接收就可以了


Arrays.copyOf()和System.arraycopy()方法谁的效率高?

Arrays.copyOf()底层是调用System.arraycopy()方法的,所以相对来说,后者更快,效率更高,面试者主要是想看你对源码是否有研究




扩容

为啥扩容要和拷贝放一起呢,因为扩容用的就是拷贝的方法

Arrays.copyOf()中的参数,提到了新长度的问题,所以我们可以用这个方法进行扩容

arr=Arrays.copyOf(arr, arr.length+1);
这样就给arr长度增加了1.
具体我就不写代码了,自己可以动手试一试

Arrays.copyOf()的实现过程

开辟一处新内存,并且长度是你传进来的长度,然后将arr中的值复制过来,然后将新内存的地址返回回去,主函数用arr进行接收,然后arr指向了新内存的地址,原来arr指向的那一块儿内存没人引用,会自动被垃圾回收器回收掉。

本质:拷贝扩容的过程开辟了新内存,并不是在原来的数组上进行扩容,所以别误解以为java中的数组长度可变。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值