2

作为一名前 C/C++ 普通程序员,我刚刚开始使用 Java。我对 JDK8 中声明数组的方式很感兴趣。我正在阅读一本书,告诉我将数组声明为如下对象。

    int[] exampleArray = new int[10];

我完全同意将数组用作对象。但是在我的 IDE(Netbeans 8)上,我收到一条通知,上面写着“字段示例数组可以是最终的”。当我删除该new int[10]部分时,我会得到正常编译并且没有通知。这是否意味着 JDK 中的数组是动态分配的?我还没有尝试遍历数组。

根据我在 Google 上的发现,我认为数组是作为链表实现的,对吗?

如果没有,请有人告诉我在 Java 中正确使用数组。

谢谢

4

2 回答 2

6

关于数组

来自Java 语言规范(版本 8),第 329 页:

在 Java 编程语言中,数组是对象(第 4.3.1 节),是动态创建的,并且可以分配给 Object 类型的变量(第 4.3.2 节)。Object 类的所有方法都可以在数组上调用。

这里的关键是Object。因此,您的变量exampleArray可能是null. 接受数组和可变参数(也称为“可变参数”;由运行时将其制成数组)作为参数的公共方法(不包括公共静态 void main)不能保证调用exampleArray.length例如(因为NullPointerException可能会向你扔一个)。此外,对于您编写的每种类型(类和接口),都会有一个相应的类对象来表示数组(例如Foo[].classand Bar[].class)。

数组的实现方式将超出规范,而 JLS(Java 语言规范)没有解决这个问题,至少我在挖掘了一下之后能找到的问题。

此外,在将数组分配给变量时,您可以随意使用如下简写

int[] exampleArray = { 1, 2, 3 };

知道你把括号放在哪里并不重要。例如,这里有几种方法可以声明一个二维数组:

int[][] multi = {{}};

int[] multi[];

int multi[][];

正如您已经熟悉的那样,第一个示例是最流行的,并且 JLS(Java 语言规范)明确建议不要使用混合表示法(第 332 页)。

还有一点值得一提的是,数组的长度永远不会改变。

最终变量

关键字有几个不同的final含义,取决于你如何使用它,在什么上下文中。首先,常量在许多语言中仅作为源代码文字存在。如果您使用低级 API,则可以修改 Java 中的 final 字段,就像在 C++ 中将 const 指针强制转换为非 const 指针一样。但是,在 Java 中声明一个变量 asfinal会告诉编译器和大部分运行时这个变量只会被写入一次。在我看来,在 Java 中使用 final 关键字有三个原因。

  1. 您的源代码读起来更好。您将立即“保证”作为源代码的读者,变量.. 将只被写入一次。如果他在方法中作为局部变量出现,那么他很可能在现场初始化得太正确了,知道变量不会再次更改值,您可能会感到放心。如果您看到标记为 final 的静态字段或实例字段,您可以确信该字段将在对象完全构造之前由程序员在某处显式初始化(​​很可能在构造函数中)。

  2. 通过缓存程序员错误,将 final 放在变量前面将使您的编码生活更轻松。例如,假设您在 switch 语句中有 500 万个案例,每个案例都会为已声明的非最终变量赋予特定值,并且应该在 switch 之后的某个时间将其返回给调用者。如果您忘记了break任何地方,那么您的代码仍然可以编译。但是,如果您已将变量声明为 final,您的整个屏幕会立即闪烁红色,编译器会在没有制动的情况下捕获该情况并点亮他只是试图为您的宝贝重新分配新值的事实场地。

  3. 运行时可以根据变量不应该更改的事实进行一些很酷的优化。例如,所有最终原语都是自动线程安全的。

于 2014-03-30T00:10:54.563 回答
1

是的,数组是在 Java 中动态分配的。试试下面的代码:

int size = new Scanner(System.in).nextInt();
int[] exampleArray = new int[size];
System.out.println(exampleArray.length);

另外,我同意 Makoto 的评论,即 IDE 的建议可能令人困惑

于 2014-03-29T21:58:18.143 回答