Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDK8中的动态数组_Java_Arrays_Java 8_Netbeans 8 - Fatal编程技术网

Java JDK8中的动态数组

Java JDK8中的动态数组,java,arrays,java-8,netbeans-8,Java,Arrays,Java 8,Netbeans 8,作为一名前C/C++普通程序员,我刚开始玩弄Java。 我对JDK8中声明数组的方式很感兴趣。 我正在阅读一本书,书中告诉我将数组声明为对象,如下所示 int[] exampleArray = new int[10]; 我完全同意将数组用作对象。但在我的IDE(Netbeans 8)上,我收到一个通知,上面说“字段示例数组可以是最终的”。当我删除newint[10]部分时,我得到了正常的编译,没有任何通知。这是否意味着JDK中的数组是动态分配的?我还没有尝试遍历数组 根据我在谷歌上的发

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

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

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

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


谢谢

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

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

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

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

int size = new Scanner(System.in).nextInt();
int[] exampleArray = new int[size];
System.out.println(exampleArray.length);
此外,我同意Makoto的观点,即IDE的建议可能会混淆阵列 从(第8版)第329页:

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

这里的关键是对象。因此,变量
exampleArray
可能是
null
。公共方法(不包括公共静态void main)接受数组和vararg(也称为“variable 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,可以修改爪哇中的最后一个字段,因为C++中的const指针可以被转换成非const指针。但是,在Java中将一个变量声明为
final
将告诉编译器和大部分运行时,这个变量将只写入一次。在我看来,在Java中使用final关键字有三个原因

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

  • 将final放在变量前面将通过缓存程序员错误使您的编码过程变得更容易。例如,假设在switch语句中有500万个case,每个case都会给已经声明的非最终变量指定一个值,该变量应该在切换之后的某个时间返回给调用方。如果您忘记了任何地方的
    中断
    ,那么您的代码仍然可以编译。但是,如果您将变量声明为final,整个屏幕将立即闪烁红色,编译器将捕获一个又一个没有停止的案例,并点亮一个事实,即他只是尝试将新值重新分配给您的宝贵字段

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

  • 关于数组 从(第8版)第329页:

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

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

    数组的实现方式将超出规范,JLS(Java语言规范)没有解决这个问题,至少没有解决这个问题