我能想到的唯一原因是常规数组使用更少的内存(尽管它可能可以忽略不计)并且可以存储原语。即使这样,您也可以只使用包装类。
问问题
2015 次
4 回答
12
对于初学者来说,常规数组确实使用较少的内存,因为它们是按照所需的确切大小创建的,而 ArrayList 可能会浪费多达一半的容量,如果 ArrayList 足够大,这一点是不可忽略的。
此外,对数组中元素的访问更快,因为它不需要调用get()
和类似的方法:它是直接内存访问。
最后但并非最不重要的一点是,数组是由精确、正确的类型创建的(即使是原始类型,也不能直接存储到 ArrayList 中),而 ArrayList 总是Object[]
在底层,并且会有性能损失提取每个元素所需的额外演员。
于 2013-10-28T21:03:24.450 回答
4
- 它使用更少的空间
- 它更快
- 它可以存储原语
- 它强制执行定义的大小,这有助于发现错误
于 2013-10-28T21:02:25.720 回答
2
除了涵盖功能方面的两个已经很好的答案之外,我认为不应该忘记可读性。
如果你有一个多维的字符串数组,比如三个,你不必写
List<List<List<String>>> stringCube = new ArrayList<List<List<String>>>;
// all the initialization
什么时候可以
String[][][] stringCube = new String[2][2][2];
甚至
String[][][] stringCube = {{{"000"},{"001"}},
{{"010"},{"011"}},
{{"100"},{"101"}},
{{"110"},{"111"}}};
使用(数组)列表时,您不能这样做。
于 2013-10-28T21:14:40.757 回答
1
速度。对象创建和方法调用代价高昂。如果您确实需要优化(例如游戏),原始数据结构可以提供帮助。
这是一个小程序来说明速度差异。在我的系统上用 100 万个整数填充原始数组大约需要 5 毫秒。填充对象列表大约需要 150 毫秒。
static int SIZE = 1000000;
public static void main(String[] args)
{
long t0 = System.currentTimeMillis();
int[] myInts = new int[SIZE];
for (int i = 0; i < SIZE; i++ )
{
myInts[i] = i;
}
long t1 = System.currentTimeMillis();
List<Integer> myList = new ArrayList<Integer>();
for (int i = 0; i < SIZE; i++ )
{
myList.add( i );
}
long t2 = System.currentTimeMillis();
System.out.println( "primitive array time: " + (t1-t0) );
System.out.println( "object list time: " + (t2-t1) );
}
于 2013-10-28T21:26:35.227 回答