初始化java数组vs其他初始化?

我知道当我初始化一个char数组时:我必须这样做

char[] b= new char[5]; 

要么

 char[] b= new char[5]({1,2,3,4,5}); 

为什么不喜欢

 ArrayList list = new ArrayList(); 

初始化数组:

 char[] b = new char[5](); ? 

为什么他们不同? 它是java哲学性质还是背后的一些原因?

如果您曾经使用过C ,那么答案就相当简单。 在C中 ,创建数组的方法是在堆栈上分配一个足够大的内存,以包含元素的数量,并指向第一个带有指针的元素 – 或者堆上的动态内存长度,以及指向带指针的第一个元素。

 int a[5]; //stack, static allocation int* a = (int*)malloc(sizeof(int)*5)); //heap, dynamic allocation 

C ++中 ,第二个版本更改为此,显然是因为更明显的是发生了什么:

 int* a = new int[5]; 

他们将这种类型的数组创建转移到Java上

 int[] a = new int[5]; 

Arrays并不像典型的对象那样真正起作用,因此即使创建它们并使用reflection操作它们也会使用不同的Array类来操作对象。 (参见http://docs.oracle.com/javase/tutorial/reflect/special/arrayInstance.html )

ArrayLists是不同的,因为它们只是日常类,就像java中的大多数东西一样,所以你用实际的构造函数调用初始化它们:

 List = new ArrayList(); 

基本上,数组和类只是以不同的方式工作。

这只是Java设计。 ArrayListArrays是两回事。 不需要相同的声明。

我想创建Java的人希望保持语法接近C语法。 在Java中,数组是极简主义的低级对象,因此它们的情况有点特殊。

ArrayList是一个容器,它类似于C ++中的Vector,它可以添加和删除元素,但是数组不能改变它的大小

数组和ArrayList用于不同的目的。 如果你需要一个固定大小的对象集合,那么去数组,但如果你需要动态增长的对象集合,那么去arraylist。 在某种程度上,编译器需要知道您的需求,因此语法是不同的。