我能想到的唯一原因是常规数组使用较少的内存(虽然它可能可以忽略不计)并且可以存储基元。即使这样,你也可以使用包装类。
答案 0 :(得分:11)
常规数组做使用更少的内存,对于初学者来说,因为它们是以所需的确切大小创建的,而ArrayList可能浪费多达其容量的一半,如果ArrayList非常大。
此外,对数组中元素的访问速度更快,因为它不需要调用get()
和类似方法:它是直接内存访问。
最后但并非最不重要的是,创建了一个精确,正确类型的数组(即使是原始类型,也不能直接存储到ArrayList中),而ArrayList总是一个Object[]
。 ,并且对于提取每个元素所需的额外演员阵容将会有性能损失。
答案 1 :(得分:4)
答案 2 :(得分:2)
除了涵盖功能方面的两个已经很好的答案外,我认为不应忘记可读性。
如果你有一个超过一维的String数组,比如三个,你就不用写了
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"}}};
使用(数组)列表时,您无法做到这一点。
答案 3 :(得分: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) );
}