0
点赞
收藏
分享

微信扫一扫

Java小白踩坑录 - 数组 & List



别人家的孩子为什么总是很厉害?--Java数组和List


Java小白踩坑录 - 数组 & List_性能

Java 家族中的别人家的孩子–数组

小白一直以为数组和 ArrayList 是一样的,因为 ArrayList 的内部结构就是数组,那为什么数组就成为别人家的孩子呢,让我们看一下吧:

import java.util.ArrayList;
import java.util.List;
public class TestArray {
private static final int batch = 10_000;
public static void main(String[] args) {
long start = System.currentTimeMillis();
insert2Array();
long end = System.currentTimeMillis();
System.out.println(end-start);
insert2List();
System.out.println(System.currentTimeMillis()-end);
}

static void insert2Array() {
int[] nums = new int[batch];
for(int i = 0;i < batch;i++) {
nums[i]=i;
}
}

static void insert2List() {
List<Integer> nums=new ArrayList<Integer>();
for(int i=0;i<batch;i++) {
nums.add(i);
}
}
}

数量级 batch 不同,耗时不同:

batch

数组耗时

Arraylist 耗时(单位毫秒)

1w

0

1

10w

1

4

100w

3

18

1kw

18

196

10kw

153

21880

别人家的孩子为什么这么优秀?

因为我们在拿自己孩子的缺点,给别人家的孩子的优点进行比较,看看代码:

List<Integer> nums=new ArrayList<Integer>();
// ...
nums.add(i);

其中,nums.add (i); 暗含玄机。

因 List 只能存放 Integer 对象型的变量,i 需要先转为 Integer,然后才能插入,就是这个动作影响了主要性能,我们可以验证一下这个问题。

  • 这里还有一点是 list 这需要不断扩容也会耗时。

类型同为 String:

public class TestArray2 {
private static final int batch = 10_000;
public static void main(String[] args) {
long start=System.currentTimeMillis();
insert2Array();
long end=System.currentTimeMillis();
System.out.println(end-start);
insert2List();
System.out.println(System.currentTimeMillis()-end);
}

static void insert2Array() {
String[] nums = new String[batch];
for(int i=0;i<batch;i++) {
nums[i]=""+i;
}
}

static void insert2List() {
List<String> nums=new ArrayList<String>();
for(int i=0;i<batch;i++) {
nums.add(""+i);
}
}
}

发现自家孩子的优势了吧!

Java小白踩坑录 - 数组 & List_数组_02

总结

Java 语言设计的数据结构如 set、list、map 等只能存放引用对象,碰到数值型的问题时,就会发生拆箱、装箱的动作,特别是数据较大时,拆箱、装箱对性能的影响就比较大了,所以写程序时或者设计时需要根据场景选择合适的数据结构。


举报

相关推荐

0 条评论