【问题标题】:length in arrays and length() in String数组中的长度和字符串中的长度()
【发布时间】:2012-10-17 17:31:02
【问题描述】:

当我们谈论数组时,为什么 length 是一个数据字段,而当我们谈论 Java 中的 String 时,为什么是 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();

为什么长度不是数组的函数,反之亦然?

【问题讨论】:

  • 可能是因为数组长度是作为数组对象的一部分存储的,而字符串长度不是并且需要计算。
  • @Shmiddty -- 其实存储的是字符串长度。
  • @HotLicks 很可能与向后兼容性有关?
  • @Shmiddty -- 这绝对是向后兼容。也许还有一些自负。

标签: java arrays string


【解决方案1】:

简单地说:就是这样,而且一直都是这样。

JLS section 10.7 中指定数组有一个公共的最终length 字段。为了保持一致性,它本可以被指定为一种方法 - 但它不是......同样String 可以 已经做出了一个实现决定来拥有一个公共最终 length 字段 - 但是再一次,它恰好不是那样的。

自 1.0 以来存在一些不一致的地方 - 显然这些东西在发布后确实无法更改...

【讨论】:

  • 而且由于 JIT 无论如何都可能内联 String:length(),因此性能上也不应该有任何差异。
  • 是的,我敢肯定,如果它完成了,它会以不同的方式完成。要么使数组长度成为方法调用,要么为所有对象的只读字段引入通用方案。
  • @jon skeet:那么,在下一个版本中是否出现意味着他们可以在 String 中添加长度数据字段?
  • @VaibhavAgarwal:这将偏离公认的将 API 与实现分离的最佳实践。更好的解决方法是在数组中引入 length() 方法,但同时拥有这两种方法会令人困惑,IMO。
  • 首先,Java 很少(如果有的话)完全消除了一个类或方法——通常它们只是被“弃用”并且强烈反对。其次,API 的守护者(尤其是主要java. 类之外的API)与Java 虚拟机、字节码等的守护者不同。后一组(通常)对错误比较保守,而前一组通常太快而无法引入新功能和选项。
【解决方案2】:

String 实现了CharSequence,因此在这种情况下length 需要是一个方法,因为接口只能指定方法。

数组不需要实现任何接口,所以length在这种情况下被实现为一个公共的final字段以避免额外的方法调用开销。

编辑:

正如 Hot Licks 在下面指出的,CharSequence 在 Java 1.4 之前并不存在。尽管 CharSequence 显然不是这种设计选择背后的驱动原因(因为它不存在),但考虑到 String 将来可能需要实现新接口,选择这种设计仍然是有意义的。

【讨论】:

  • 做出此决定时,还没有 CharSequence 这样的东西。
  • @HotLicks - 这是一个非常好的观点,String 的 1.2 文档证明了这一点。尽管当时不存在 CharSequence,但在未来的界面中使用 length 的能力很可能在决定中发挥了作用。不过我会更新我的答案。
  • 一个更大的问题是为什么 Java 没有为类似 String 的对象实现基类并让 String 成为子类。 CharSequence 是从这种疏忽中恢复过来的一次微不足道的尝试。
【解决方案3】:

它被认为是一个变量而不是一个方法。就好像您创建了一个类并说 Public static int num 然后在一个方法中告诉该 num 等于全局的某个值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多