为啥 int[] a = new int[1] 而不是 int a?

Posted

技术标签:

【中文标题】为啥 int[] a = new int[1] 而不是 int a?【英文标题】:Why int[] a = new int[1] instead of just int a?为什么 int[] a = new int[1] 而不是 int a? 【发布时间】:2011-09-07 12:41:56 【问题描述】:

这段代码中是否有一些我在java中看不到的隐藏含义?有什么用?

int[] a = new int[1];

不仅仅是

int a;

因为在我看来是一样的?

【问题讨论】:

第一个是包含一个int的数组。另一个只是int。你能解释一下为什么你认为它们是一样的吗? 【参考方案1】:
int a

定义一个原始 int。

int[] a = new int[1];

定义一个有空间容纳 1 个 int 的数组。

它们是两种截然不同的东西。原语上没有方法/属性,但数组上有属性(长度)和方法(特别是它的 on clone 方法,以及 Object 的所有方法)。

数组有点奇怪。它们在JLS 中定义。

实际上,当您需要与采用数组并对结果进行操作的 API 进行交互时,这样做是有意义的。传入对具有 0、1 或 n 个属性的数组的引用是完全有效的。定义具有 1 个元素的数组可能还有其他正当理由。

我想不出任何用例,你会想要定义一个包含一个元素的数组,只是为了绕过数组并获取元素。

【讨论】:

那么创建一个包含 1 个元素的数组而不是创建一个 int 的原因是什么? 当你有一个 Java 对象整数时,你就有了可以用来对这个对象进行操作的方法。原始类型只允许基本的算术运算。 从可以访问a 但不能重新分配它的范围内,int[] 允许对实际的int 值进行突变。 @hvgotcodes +1 。只是想问一下,有时我使用没有 () 的 ArrayName.length 因此它表示长度是一个静态成员。但是它存在于哪个类中,即它在哪个类中是对象。 myArray.length 不是静态成员。您创建的任何数组都有自己的长度字段。 java中所有不是原始的东西都是对象。我认为数组是一个特例——Java api 中没有数组类。它在 JLS java.sun.com/docs/books/jls/third_edition/html/… 中定义【参考方案2】:

一个在栈上,一个在堆上。

【讨论】:

@Algorithmist:谢谢。 :-) @Gabe:不是吗? 更多关于原始生活在堆上的解释可以在这里找到:***.com/questions/2099695/…【参考方案3】:

一个区别是您可以编写一个通过更改arg[0] 来更改其int 参数的方法。这个技巧在我见过的一些代码中被大量使用。例如,它允许您返回一个表示成功或失败的boolean 和一个用于其他目的的int 值。如果没有这个技巧,您将不得不返回某种包含这两个值的对象。

【讨论】:

是的,这是一种传递引用的形式。 @Gabe - 完全正确。我想我可以用一个(好吧,三个)词而不是三个句子。 :) @Gabe - 从技术上讲,它是一种在 Java 中模拟通过引用语义传递的方法。 @Stephen:“一种形式”和“一种模拟方式”有什么区别? @Gabe - 一个是真的,另一个是假的。在真正的引用调用中,被调用者通过显式或隐式传递变量的地址。在这个伪造的版本中,调用者必须创建并填充一个数组,然后在返回时将值从数组中提取出来。【参考方案4】:
int a;

定义一个可以保存 int 的变量

int[] a;

定义一个变量,可以容纳一个int数组

int[] a = new int[1];

在上面这样做,但也通过实际创建一个数组(大小为 1 - 它可以容纳 1 个 int)来初始化它,并定义变量 a 来保存该数组,但没有定义数组中的内容。

int[] a = new int[1]1;

在上面做了,但也定义了数组中的内容:int 1。

我想它做了一个 类似 的事情,在那个空间被分配给 1 个 int,但数组也定义了一个数组。我想你可以说这些是相似的:

int a = 1;
int b = a + 1;
// now b == 2

int[] a = new int[1]1;
int b = a[0] + 1;   
// now b == 2

【讨论】:

其实我觉得int[] a = new int[1]1;一般写成int[] a = 1;【参考方案5】:

大小为 1 的数组与单个整数不同。

即使它们携带相同的信息,它们也是不同的类型,因此您可以在不同的上下文中使用它们。

例如,如果您有一个函数对数组的所有元素执行函数,但您只想计算一个值,您应该传递一个 int[1],因为该函数需要一个数组并且想要知道它应该处理多少个值。

【讨论】:

【参考方案6】:

java 中的所有数组都是对象。声明时:int x = 5; 您正在声明一个原始类型。

当声明 int[] x = new int[]; 时,您正在创建一个类型为 int[] 的对象。

所以int[] 实际上是一个类。

【讨论】:

以上是关于为啥 int[] a = new int[1] 而不是 int a?的主要内容,如果未能解决你的问题,请参考以下文章

为啥泛型类型只能引用类型,而不能是基本类型

java里面既然可以用int定义整形变量,为啥还要用Integer,求大神详细解答

C语言int 取最小值为啥是-32768而不能是-32769

C语言int 取最小值为啥是-32768而不能是-32769

sprintf为啥用int和double 数组也可以存进去?

为啥 InputStream#read() 返回一个 int 而不是一个字节?