为什么在Java中,我们谈论数组时使用length数据字段,而在谈论字符串时使用length()函数?
int a[10] = {1,2,3,4,5,6,7,8,9,10};
String str = "foo";
int a_len = a.length;
int str_len = str.length();
为什么数组中长度不是一个函数或相反的情况?
为什么在Java中,我们谈论数组时使用length数据字段,而在谈论字符串时使用length()函数?
int a[10] = {1,2,3,4,5,6,7,8,9,10};
String str = "foo";
int a_len = a.length;
int str_len = str.length();
简单来说:这就是它的本来面目,一直以来都是这样。
根据JLS第10.7节的规定,数组有一个公共的final length
字段。出于一致性考虑,它本应该被指定为一个方法,但实际上并没有......同样地,String
也可以选择使用公共的final length
字段进行实现,但实际情况并非如此。
自1.0版本以来,有一些不一致的地方一直存在——很明显,这些东西在发布后真的无法更改......
String:length()
,因此性能上也不应该有任何差异。 - cdhowielength()
方法,但同时拥有两者可能会令人困惑,我个人认为。 - Jon Skeetjava.
类之外的API)与Java虚拟机、字节码等的管理者不同。后者通常非常保守,而前者经常过于追求新功能和选项。 - Hot LicksString
实现了 CharSequence
接口,因此在这种情况下需要将 length
设计为方法,因为接口只能指定方法。
数组不需要实现任何接口,因此在这种情况下,length
被实现为公共的 final 字段,以避免额外的方法调用开销。
编辑:
正如 Hot Licks 在下面指出的那样,在 Java 1.4 之前并不存在 CharSequence
。虽然 CharSequence
显然不是这种设计选择背后的驱动原因(因为它当时还不存在),但考虑到 String 可能需要在未来实现新的接口,这种设计仍然是有道理的。
CharSequence
这个概念还不存在。 - Hot Lickslength
的能力很可能在决策中起了作用。我会更新我的回答。 - DaoWen它被认为是一个变量而不是一个方法。这就像你创建了一个类,并且声明了 Public static int num,然后在一个方法中告诉该变量在全局范围内等于某个值。