JDK8中的动态数组

Ped*_*dro 1 java arrays java-8 netbeans-8

我刚刚开始搞乱Java,作为一名前C/C++普通程序员.我对在JDK8中声明数组的方式很感兴趣.我跟着一本书对我说要把数组声明为对象如下.

    int[] exampleArray = new int[10];
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢

Mar*_*son 5

关于数组

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

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

这里的关键是对象.因此,您的变量exampleArray可能是null.接受数组和变量的公共方法(不计算公共静态void main)(也称为"变量arity参数";由运行时制成数组)作为参数无法保证exampleArray.length,例如调用它总是安全的(因为一个人NullPointerException可能会被抛向你).此外,对于您编写的每种类型(类和接口),都会有一个相应的类对象来表示数组(例如Foo[].classBar[].class).

如何实现一个数组将超出规范,JLS(Java语言规范)没有解决这个问题,至少在我挖掘一下后我能找到的东西.

此外,在为变量分配数组时,您可以像这样使用速记:

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

要知道你把括号放在哪里都没关系.例如,您可以通过以下几种方式声明二维数组:

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

int[] multi[];

int multi[][];
Run Code Online (Sandbox Code Playgroud)

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

值得一提的另一点是数组的长度永远不会改变.

最终变量

final关键字取决于你如何使用它,在什么情况下几个不同的含义.首先,常量仅作为许多语言的源代码文字存在.如果使用低级API,则可以修改Java中的最后一个字段,因为const指针可以在C++中转换为非常量指针.但是,在Java中声明一个变量final将告诉编译器和大多数运行时,该变量只会被写入一次.我看待它的方式,在Java中使用final关键字有三个原因.

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

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

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