我刚刚开始搞乱Java,作为一名前C / C ++普通程序员。 我对在JDK8中声明数组的方式很感兴趣。 我跟着一本书告诉我把这个数组声明为跟随对象。
int[] exampleArray = new int[10];
我完全同意将数组用作对象。但是在我的IDE(Netbeans 8)上,我收到一条通知,说明"字段示例数组可以是最终的"。当我删除new int[10]
部分时,我得到正常的编译并且没有通知。这是否意味着JDK中的数组是动态分配的?我还没有尝试迭代数组。
根据我在Google上发现的内容,我认为数组是作为链接列表实现的吗?
如果没有,请有人告诉我在Java中正确使用数组。
由于
答案 0 :(得分:5)
从Java Language Specification(版本8),第329页:
在Java编程语言中,数组是对象(§4.3.1),是 动态创建,可以分配给Object类型的变量 (§4.3.2)。可以在数组上调用Object类的所有方法。
这里的关键是对象。因此,您的变量exampleArray
可能是null
。接受数组和变量的公共方法(不计算 public static void main )(也称为“变量arity参数”;由运行时制成数组)作为参数无法保证它是例如,总是安全地调用exampleArray.length
(因为可能会向您抛出NullPointerException
)。此外,对于您编写的每种类型(类和接口),都会有相应的类对象来表示数组(例如Foo[].class
和Bar[].class
)。
如何实现将超出规范,JLS(Java语言规范)无法解决该问题,至少在挖掘后我无法找到一点。
此外,在为变量分配数组时,您可以像这样使用简写:
int[] exampleArray = { 1, 2, 3 };
请注意,放置括号的位置并不重要。例如,您可以通过以下几种方式声明二维数组:
int[][] multi = {{}};
int[] multi[];
int multi[][];
正如您已经熟悉的那样,第一个示例是最受欢迎的,JLS(Java语言规范)明确建议使用混合表示法(第332页)。
值得一提的另一点是数组的长度永远不会改变。
final
关键字在某些情况下具有一些不同的含义,具体取决于您如何使用它。首先,常量仅作为许多语言的源代码文字存在。如果使用低级API,则可以修改Java中的最后一个字段,因为const指针可以在C ++中转换为非常量指针。但是,将Java中的变量声明为final
将告诉编译器和大多数运行时,该变量只会被写入一次。我在Java中使用final关键字的方式有三个原因。
您的源代码读起来更好。您将立即“保证”作为源代码的读者,变量..将只写入一次。如果他在方法中显示为局部变量,那么他很可能在现场初始化得太正确,您可能会感到放心,因为知道该变量不会再次改变值。如果您看到一个静态字段或一个标记为final的实例字段,您可以确信该字段将在完全构造对象之前由程序员显式初始化(很可能在构造函数中)。
通过缓存程序员错误,将最终放在变量前面将使编码生活更轻松一些。比如说你在switch语句中有500万个case,它们中的每一个都会给已经声明的非final变量赋予一定的值,并且应该在切换后的某个时间返回给调用者。如果您忘记了break
,那么您的代码仍会编译。但是如果你已经将变量声明为final,那么整个屏幕会立即闪烁红色,并且编译器会在没有制动的情况下捕获到一个案例,并点亮了他只是试图为你的宝贵重新分配一个新值的事实字段。
运行时可以基于变量不应该更改的事实进行一些很酷的优化。例如,所有最终基元都是自动线程安全的。
答案 1 :(得分:1)
是的,数组是用Java动态分配的。请尝试以下代码:
int size = new Scanner(System.in).nextInt();
int[] exampleArray = new int[size];
System.out.println(exampleArray.length);
另外,我同意Makoto的说法,IDE的建议可能令人困惑