【问题标题】:Java array: Attribute size?Java数组:属性大小?
【发布时间】:2018-02-14 20:11:30
【问题描述】:

我在 Stack Overflow 上找到了这个答案:

length 是常数,用于找出数组的存储容量,而不是数组中的元素个数

例子:

int a[] = new int[5]

a.length 总是返回 5 这称为容量 数组,所以长度总是返回容量。但是

"数组中元素的个数称为大小"

例子:

int a[] = new int[5]
a[0] = 10

将导致a.size = 1a.length = 5

size() 适用于集合,length 适用于 java 中的数组

(Difference between size and length methods?, 2017-09-06)

由于这个答案获得了 5 票赞成,我认为它是正确的。但实际上 Java 中的数组没有 size 属性。我知道 ArrayLists 有一种方法。但是,如果使用普通数组,a.size 怎么可能等于 1?我错过了什么吗?

【问题讨论】:

  • 答案并不是说数组有size 方法。用户只是说数组的大小为 1。用户特别提到“size 与集合一起使用”,如列表中所示。用户没有错,可能有点混乱但没有错。
  • @tima:很抱歉,但答案是正是。我引用:将导致a.size = 1 和a.length = 5。(这里,a 是一个数组。)
  • @NPE 在我看来它不是实际代码,而只是一个表达式,但我明白为什么可以这样理解它
  • 作者可能只是选择了一个令人困惑的表示。
  • 你不应该混淆正确性和赞成票。通常情况下,赞成的答案是完全错误的。我们通常会尝试通过投票来解决这个问题。

标签: java arrays arraylist


【解决方案1】:

你是对的,答案是错误的:Java 数组没有.size 属性,只有.length

为了让答案的作者受益,我怀疑他们试图解释ArrayList 内部如何使用数组。

ArrayList 实际上通常有一个.size 成员在元素数组旁边

class ArrayList<T> implements ... {
    private T[] elements;
    private int size;
    ...
}

【讨论】:

  • 点击“已编辑”,研究历史看看原作者的回答。有人(不是作者)将答案从“example a[0]=10,size=1 and length=5”更改为现在所说的。原作者从未提及a.size。相反,他似乎暗示 a 的概念大小为 1。是编辑弄错了。
  • @KlitosKyriacou:即使是“概念大小”也具有误导性,因为它显然取决于应用程序(对于某些人来说,概念大小在“int a[] = new int[5]”之后是五个)。但是,是的,编辑对答案没有任何帮助。
  • 确实如此。我不确定 OP 到底是什么意思。
  • @KlitosKyriacou:我什至想修正答案,但这会使这个问题无效,不利于我们的 OP。
【解决方案2】:

但是,如果使用普通数组,a.size 怎么可能等于 1?我错过了什么吗?

ArrayList 在内部使用数组,并且随着您不断向其中添加元素,它会不断增加数组的长度。

size 方法检查数组中实际存在的元素数量并返回该计数。

如果你查看数组列表的源代码,它会维护一个大小变量并在添加元素时递增它

public void add(int index, E element) {
393         rangeCheckForAdd(index);
394 
395         ensureCapacity(size+1);  // Increments modCount!!
396         System.arraycopy(elementData, index, elementData, index + 1,
397                          size - index);
398         elementData[index] = element;
399         **size++;**
400     }

但是数组上没有这样的包装器,并且您直接对数组进行操作,因此有所不同。

【讨论】:

  • 是的,我知道。作者所说的 a.size = 1 只是令人困惑,他将 a 声明为数组。
【解决方案3】:

数组在声明时被初始化,因此它们的大小总是等于它们的长度。

int[] array = new int[5];
for (int i : array) System.out.println(i);
System.out.println(array[4]);

将为循环打印 5 次“0”,然后再次打印“0”。请注意array[4] 也不例外:此元素存在。

ArrayList 不一样。

ArrayList<Integer> list = new ArrayList<>(5);
// no output, because no elements are contained
for (int i : list) System.out.println(i);
// Exception: no such element
System.out.println(list.get(4));

【讨论】:

  • 我知道。只是作者使用大小作为数组的属性,当然不存在。我想确定,我没有遗漏任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 2011-03-03
相关资源
最近更新 更多