Java JDK8中的动态数组
作为一名前C/C++普通程序员,我刚开始玩弄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中的数组是动态分配的?我还没有尝试遍历数组 根据我在谷歌上的发
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语言规范)没有解决这个问题,至少没有解决这个问题