size和length方法的区别是什么?

68

.size().length之间有什么区别?.size()只适用于数组列表吗?.length只适用于数组吗?


这似乎是特定于编程语言的,而且没有标签。 - SBI
规范答案:https://dev59.com/2HVC5IYBdhLWcg3wbQbA这个也不错:https://dev59.com/NHI-5IYBdhLWcg3wN1hD - RedGreenCode
6个回答

99

size() 是在 java.util.Collection 中定义的一个方法,然后被标准库中的每个数据结构所继承。 length 是数组上的一个字段(数组是对象,只是通常不显示类),而 length()java.lang.String 上的一个方法,它只是一个封装了char[] 的薄包装器。

也许出于设计原因,字符串是不可变的,所有顶级集合子类都是可变的。 所以当你看到 "length" 时,你知道它是常量,而当你看到 "size" 时,它则不是。


10
你的意思是指这只是一个对String[]的轻量包装吗?是不是应该改为char[] - Nick Louloudakis
我知道这个线程很老,但我认为Matt是正确的,差异在于它们在内存中的存储方式。数组元素按顺序存储,访问它们的方式是base + offset,其中base是起始位置(索引0);这也使得数组相对较快。ArrayList属于链表家族,不是按顺序存储的,这就是它们可以“调整大小”的原因。因此,即使在概念上,链表具有“长度”,它们也不会作为“列表”存储在内存中,因此使用更通用的“size”。 - David Mordigal
string[] should be char[] - Eduardo Dennis
@MattPuntam: 正如你所说,Java也是; size()是在java.util.Collection中指定的方法,但我不知道length在数组中是如何定义的。这是我的面试问题。你能否演示一下以澄清我的疑虑? - Onic Team

47

长度是常量,用于确定数组存储容量而不是数组中元素的数量。

例子:

int[] a = new int[5]

a.length 总是返回5,这被称作数组的容量。但是,数组中元素的数量被称为大小。

例如:

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

这里的大小将为1,但a.length仍为5。请注意,数组上没有名为size的实际属性或方法,因此您无法只调用a.sizea.size()来获取值1。

size()方法适用于集合,在Java中应使用length来处理数组。


9
你不能在像 int[] 这样的基本数组上调用 size() 方法。因此,a.size=1 没有意义。 - Chinmay jain
请参见 https://stackoverflow.com/questions/46073467/java-array-attribute-size 以了解对此答案的讨论。 - NPE
@Chinmayjain:那不是一个赋值;那只是在说结果会是什么。 - JESii
1
@JESii 即使不是作业,这仍然是错误的。根本就没有 a.size 这样的东西。它根本不存在,所以声称它“将是”1毫无意义。 - xdavidliu

10
  • .length是一个字段,它包含了数组的容量(并非数组当前所包含的元素数)。

  • length()是一个方法,在字符串(以及其他类)中使用,用于返回字符串中字符的数量;对于字符串来说,容量和包含元素数(字符数)具有相同的值。

  • size()是由所有成员的集合(列表、集合、堆栈等)实现的方法。它返回集合包含元素的数量(而不是容量;有些集合甚至没有定义容量)。

2
length variable:

在Java中,数组(不是java.util.Array)是语言本身中预定义的类。为了查找数组的元素,设计者使用了length变量(length是预定义类中的字段成员)。他们必须已经给出length()本身来使Java具有一致性;但是没有这样做的原因是性能方面,在执行时,length变量比调用方法length()更快。这就像使用==和equals()比较两个字符串。equals()是一个方法调用,比执行==运算符需要更多的时间。

size() method:

它用于查找集合类中存在的元素数量。 它在java.util.Collection接口中定义。


1

根据语法推断,我认为它是C语言的后代。从我所见,length用于简单集合项,如数组,并且在大多数情况下它是一种属性。

size()是一个函数,用于动态集合对象。然而,在使用的所有情况下,您不会发现使用它们之间有任何差异产生的结果。在大多数实现中,size只返回长度属性。


那个标签是在我的回答之后添加的,所以我不可能知道。所有其他针对Java的答案都是在问题提出一年后给出的。 - Buddha
你对标记也是错误的。根据编辑历史,它是在“2015年2月14日3:00”添加的。除了你的两个(可能三个)答案之外(包括一个已删除的答案),早于java标记的正确识别了这个问题是Java相关的。 - Stephen C
@StephenC 这已经变得荒谬了。您能看到我在2013年11月25日,问题添加后4分钟就回答了这个问题,当时没有此类标签信息吗?而您自己也说标签是在2015年添加的。有些用户会假定编程语言并给出答案。我只是给出了我认为足够通用的解释,以便根据我的知识帮助候选人。我看到您在帮助社区方面做了很多工作。所以,我尊重您。但我宁愿通过回答来帮助其他人,而不是与您争论一个非问题来提高自己的自负心。 - Buddha
我已经给它点了踩,因为它现在客观上没有帮助。如果你的目的是帮助人们,那么适当的做法就是删除它。 - Stephen C
我很满意。在我看来,这不是一个糟糕的答案,因此不会删除它。 - Buddha
显示剩余2条评论

0

我敢打赌(没有指定语言),size()方法返回length属性。

然而有效的for循环应该是这样的:

for (int i = 0; i < values.length; i++) {}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接