Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数组中的长度和字符串中的长度()_Java_Arrays_String - Fatal编程技术网

Java 数组中的长度和字符串中的长度()

Java 数组中的长度和字符串中的长度(),java,arrays,string,Java,Arrays,String,为什么当我们谈论数组时,length是一个数据字段,而当我们谈论Java中的字符串时,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(); 为什么长度在数组中不是一个函数,反之亦然?它被认为是一个变量,而不是一个方法。这就好像你创建了一个类,说了Public static int num,然后在一个方

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

为什么长度在数组中不是一个函数,反之亦然?

它被认为是一个变量,而不是一个方法。这就好像你创建了一个类,说了Public static int num,然后在一个方法中告诉num在全局范围内等于某个值,很简单:它就是这样,而且一直都是这样

数组中指定了一个公共的final
length
字段。为了一致性,它可以被指定为一个方法,但它不是。。。同样地,
String
本可以做出一个实现决定,使用一个公共的final
length
字段,但同样,它碰巧不是这样


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

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

数组不需要实现任何接口,因此在本例中,
length
作为公共final字段实现,以避免额外的方法调用开销

编辑:


正如下面所指出的,
CharSequence
在Java1.4之前是不存在的。虽然CharSequence显然不是此设计选择背后的驱动因素(因为它不存在),但选择此设计时考虑到字符串将来可能需要实现新接口,这仍然是有意义的。

可能是因为数组长度存储为数组对象的一部分,而且字符串长度不是而且需要计算。@shmiddy——实际上,字符串长度是存储的。这里也讨论了:@HotLicks很可能与向后兼容性有关?@shmiddy——它肯定是向后兼容性。也许还有一些自我。而且由于JIT很可能是内联的
String:length()
,所以性能也不会有任何差异。是的,我确信如果它被重新完成,它会以不同的方式完成。要么将数组长度设置为方法调用,要么为所有对象的只读字段引入一个通用方案。@jon skeet:那么,在下一个版本中不是出现了这种情况吗?这意味着他们可以将长度数据字段添加到字符串中?@VaibhavAgarwal:这将偏离将API与实现分离的公认最佳实践。更好的解决方法是在数组中引入
length()
方法,但在我看来,两者都有可能会让人混淆。首先,Java很少(如果有的话)完全消除类或方法——通常它们只是“不推荐”和强烈反对。其次,API的守护者(尤其是主
java.
类之外的API)不同于java虚拟机、字节码等的守护者。后者(通常)对故障比较保守,而前一组人往往很快就加入了新的功能和选项。在做出这个决定时,并没有像
CharSequence
这样的东西。@HotLicks-这是一个非常好的观点,1.2文档就证明了这一点。虽然CharSequence在当时并不存在,但在未来的接口中使用
长度
的能力很可能在决策中发挥了作用。不过我会更新我的答案。一个更大的问题是为什么Java没有为类似字符串的对象实现基类,并使字符串成为子类。CharSequence是从这种疏忽中恢复过来的一种微弱尝试。