注意:这里讨论的速率是一般情况下的,也就是大多数是这样的,我们一般情况也可这么认为,但凡事不能说绝对,总有不知道哪一天它真的出现了一次例外,也不是没有可能。
1、4种方式都包括什么?
(1)方法进行复制
(2)copyOf(int[] original,int newLength)方法进行复制
(3)copy(Object src,int srcPos,Object dest,int destPos,int length)方法进行复制
(4)
2、用时比较:(3)<(2)<(1),(4)通常是在(1)后面的,但是有的测试用例(4)在(2)和(1)之间,但(3)肯定是最快无疑。
3、用时的原理分析:
(1)clone()方法:是java中创建对象的方法之一(另一方法为使用new操作符)。clone()方法执行过程:第一步,分配内存,大小和源对象相同。第二步,使用源对象中的各个域,填充新对象的各个域,填充完成,clone() 方法返回。
copyOf(int[] original,int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original,copy,Math.min(original.length,newLength));
return copy;
}
第一步,声明一个返回类型的数组对象。
第二步,调用System.arraycopy()方法,为声明数组赋值,这是一个有native关键字的方法,故调用的是C++编写的底层函数,可见其为JDK里面的底层函数,这对其提升运行速率会有明显影响。
第三步,返回声明数组。 注意:此处返回类型为int[],因为我的测试用例是int[]类型数组,copyOf()方法源码的返回类型还有很多基本类型。
copy(Object src,int srcPos,int length);
关于这个方法的介绍(2)中已经写过。所以(3)的效率肯定比(2)快。
(4)for()循环,因为编译时会产生太多无用字节码,速度慢一些。
4、测试代码:
/**
- Created by cxh on 17/07/21.
*/
public class Main {
public static void main(String[] args) {
int[] a=new int[1000000];
for(int i=0;i<1000000;i++) {
a[i] = i;
}
//数组赋值的4种方式,每次调用其中一个方法
//调用方法1,用时:754ms
getB1(a);
//调用方法2,用时:724ms
getB2(a);
//调用方法3,用时:655ms
getB3(a);
//调用方法4,用时:730ms
getB4(a);
}
//1,利用clone()<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>进行复制
private static void getB1(int[] original){
int[] b1=original.clone();
//<a href="https://www.jb51.cc/tag/shuchu/" target="_blank" class="keywords">输出</a>b1
for(int i=0;i<1000000;i++){
Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank" class="keywords">stem</a>.out.print(b1[i]+",");
}
}
//2,利用<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>yOf(int[] original,int newLength)<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>进行复制
private static void getB2(int[] orginal){
int[] b2=Arrays.<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>yOf(orginal,1000000);
//<a href="https://www.jb51.cc/tag/shuchu/" target="_blank" class="keywords">输出</a>b2
for(int i=0;i<1000000;i++){
Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank" class="keywords">stem</a>.out.print(b2[i]+",");
}
}
//3,利用array<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>y(Object src,int length)<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>进行复制
private static void getB3(int[] orginal){
int[] b3=new int[1000000];
Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank" class="keywords">stem</a>.array<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>y(orginal,b3,1000000);
//<a href="https://www.jb51.cc/tag/shuchu/" target="_blank" class="keywords">输出</a>b3
for(int i=0;i<1000000;i++){
Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank" class="keywords">stem</a>.out.print(b3[i]+",");
}
}
//4,利用for循环进行复制.
private static void getB4(int[] original){
int[] b4=new int[1000000];
for(int i=0;i<1000000;i++){
b4[i]=i;
}
//<a href="https://www.jb51.cc/tag/shuchu/" target="_blank" class="keywords">输出</a>b4
for(int i=0;i<1000000;i++){
Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank" class="keywords">stem</a>.out.print(b4[i]+",");
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。