JDK8中的动态数组

我刚开始搞乱Java,担任C / C ++平均程序员。 我对JDK8中声明数组的方式很感兴趣。 我跟着一本书,对我说要将数组声明为下面的对象。

    int[] exampleArray = new int[10];

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

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

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

谢谢


关于数组

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

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

这里的关键是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关键字有三个原因。

  • 你的源代码读得更好。 您将立即被“保证”作为源代码的读者,该变量将被写入一次。 如果他在某个方法中表现为局部变量,那么他很可能在现场进行初始化,并且您可能会感到放心,因为知道该变量不会再次更改值。 如果你看到一个静态字段或者一个标记为final的实例字段,那么你可以确信,在对象被完全构造之前(很可能在构造函数中),字段将被程序员明确地初始化。

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

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


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

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

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

    链接地址: http://www.djcxy.com/p/91877.html

    上一篇: Dynamic arrays in JDK8

    下一篇: Webservice client with android.os.NetworkOnMainThreadException error