我现在正在从头开始学习Java,而我发现有趣的一件事是必须以这种方式创建最复杂的数据结构:
ArrayList<String> list = new ArrayList<String>();
另一方面,只需键入以下内容即可初始化字符串
String[] str_array = new String[10];
为什么在初始化数组时不必提供通常与调用构造函数关联的括号?这只是一个风格选择吗?如果对JVM有更好了解的人可以提供一些见识来满足我的好奇心,那将是非常棒的。
答案 0 :(得分:1)
对象创建和数组创建之间的区别是:
new ArrayList<String>()
中的括号表示构造函数调用。 anewarray
,multianewarray
和newarray
字节码指令的副作用。通过执行可以证明没有构造函数的数组类
System.out.println(int[].class.getConstructors().length);
返回0。
最后,这归结为20年前语言设计者所做的决定,这些决定受到其他现有语言(例如C ++)的设计决定的影响。
答案 1 :(得分:-1)
不能以与创建ArrayList相同的方式创建数组。正如user207421所说,“数组被设计为通过使用[] 进行初始化”。 (例如)
ArrayList aList = new ArrayList(); // It is valid
Arrays aArr = new Arrays();// It is invalid. Since there is no public constructor in java.util.Arrays
源代码: http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/be44bff34df4/src/share/classes/java/util/Arrays.java
C和C ++语言使用相同的[]初始化数组。这样Java也随之而来。