Arrays类中,copyOf方法和copyOfRange方法的区别
copyOf()的作用是复制数组指定长度的元素形成新数组,需要参数:原数组,新数组的长度;
而copyOfRange()则是复制数组指定起始和结束下标之间的元素形成新数组,需要参数:原数组,要复制的起始下标,要复制的结束下标;
二者的区别可能在于使用参数的不同,而适合不同的使用场景。
测试代码如下:
参考链接:
import java.util.Arrays;
public class CopyArrTest {
public static void main(String[] args) {
// https://blog.csdn.net/weixin_38820375/article/details/87260072
// https://blog.csdn.net/cnds123321/article/details/113738103
int arr[] = {1,2,3,4,5};
// 复制数组arr从下标从0开始的2个元素形成新数组返回,即 :1,2
int copy1 [] = Arrays.copyOf(arr,2);
// https://blog.csdn.net/chenkaibsw/article/details/78989459
System.out.println(Arrays.toString(copy1));
// 复制数组arr从下标从0开始的7个元素形成新数组返回,超出是数组长度的元素为默认值0,即 :1,2,3,4,5,0,0
// 如果复制的长度小于0,抛异常
int copy2[] = Arrays.copyOf(arr, 7);
System.out.println(Arrays.toString(copy2));
// 复制数组从下标为2到下标为6的元素,下标6不包括
// 如果结束索引超出数组最大下标,则以默认值来填充,这里是0,所以新数组是:3,4,5,0。
// 而起始索引如果小于0,则抛异常
// https://www.cnblogs.com/Dearmyh/p/10576353.html
int copy3[] = Arrays.copyOfRange(arr,2,6);
System.out.println(Arrays.toString(copy3));
}
}
和Arrays.copfOf方法类似,这个是指定范围的拷贝。范围是左闭右开区间。
public static int[] copyOfRange(int[] original, int from, int to)
参数
original
- 要从中复制范围的数组
from
- 要复制的范围的初始索引(包括)
to
- 要复制的范围的最终索引,除了它本身。 (该索引可能位于数组之外)
public static void main(String[] args) {
int[] array = new int[] { 1,2,3,4 };
int[] ret = Arrays.copyOfRange(array,2,4);
System.out.println(Arrays.toString(ret));//[3,4]
}
问题描述的是Java中Arrays类中的copyOf方法和copyOfRange方法的区别。copyOf方法用于拷贝数组,将原数组的值拷贝到一个新的数组中,并可以指定新数组的长度。如果新数组长度大于原数组长度,超过部分会用null填充;如果新数组长度小于原数组长度,只拷贝前几个数据。copyOf方法的使用示例如下:
Integer[] arr = {1,2,3,4,5,6};
Integer[] arr2 = Arrays.copyOf(arr, 3); // arr2是{1, 2, 3}
Integer[] arr3 = Arrays.copyOf(arr, 10); // arr3是{1, 2, 3, 4, 5, 6, null, null, null, null}
copyOfRange方法也用于拷贝数组,但可以指定拷贝的起始位置和结束位置。拷贝的范围是左闭右开的,即包括起始位置但不包括结束位置。copyOfRange方法的使用示例如下:
Integer[] arr = {1,2,3,4,5,6};
Integer[] arr4 = Arrays.copyOfRange(arr, 2, 5); // arr4是{3, 4, 5}
从上述示例可以看出,copyOfRange方法可指定拷贝的起始位置和结束位置,而copyOf方法只能指定新数组的长度。copyOfRange方法的功能更灵活,可以在拷贝时选择需要的范围。
参考资料中还提到了一个ArrayList底层代码的动态扩容实现,这里未提及copyOf方法和copyOfRange方法与动态扩容的具体关系。但可以根据参考资料的描述和观察示例代码来推测,可能是ArrayList在动态扩容时使用了copyOf方法来重新分配更大的数组,并使用copyOfRange方法来拷贝原数组的元素到新数组中。但为了确保准确性,还需要额外的资料或代码来确认这一点。
综上所述,copyOf方法和copyOfRange方法的区别在于拷贝的方式和范围。copyOf方法将原数组的值拷贝到一个新数组中,并可以指定新数组的长度;copyOfRange方法可指定拷贝的起始位置和结束位置,拷贝的范围是左闭右开的。