JDK8中的动态数组

时间:2014-03-29 21:46:31

标签: java arrays java-8 netbeans-8

我刚刚开始搞乱Java,作为一名前C / C ++普通程序员。 我对在JDK8中声明数组的方式很感兴趣。 我跟着一本书告诉我把这个数组声明为跟随对象。

    int[] exampleArray = new int[10];

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

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

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

由于

2 个答案:

答案 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[].classBar[].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关键字的方式有三个原因。

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

  2. 通过缓存程序员错误,将最终放在变量前面将使编码生活更轻松一些。比如说你在switch语句中有500万个case,它们中的每一个都会给已经声明的非final变量赋予一定的值,并且应该在切换后的某个时间返回给调用者。如果您忘记了break,那么您的代码仍会编译。但是如果你已经将变量声明为final,那么整个屏幕会立即闪烁红色,并且编译器会在没有制动的情况下捕获到一个案例,并点亮了他只是试图为你的宝贵重新分配一个新值的事实字段。

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

答案 1 :(得分:1)

是的,数组是用Java动态分配的。请尝试以下代码:

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

另外,我同意Makoto的说法,IDE的建议可能令人困惑