int [] ar;
System.out.println(ar.length); // no parentheses
对于一个字符串而言,它将是
String st;
System.out.println(st.length());
int [] ar;
System.out.println(ar.length); // no parentheses
对于一个字符串而言,它将是
String st;
System.out.println(st.length());
length
(长度)不是关于实际内容的 - 它是维度!一个数组可以有length
(长度)为10,但只包含2个元素。length()
方法关于实际内容!原因是数组是一种语言结构 - 因此,每当您想要了解有关数组的信息时(例如它的长度或其他),您必须从JVM检索一个固定值,而不是调用评估某些东西的方法。
(Array
类只是实际 array 结构的代理。)
从技术上讲,array
(小写 a)只是内存分配,用于在内存中存储 array.length
个元素。(这就是为什么更改维度时不能简单地调整大小,而总是需要创建一个新数组的原因 - 它需要在内存中重新定位(在 C 中称为 realloc
),以便有足够的空间来存储 array.length * elementSize
位。)
size()
方法,因为它没有维度,并且只需要返回有关其内容的信息。)String实现了CharSequence接口,该接口定义了一个length()方法,因此String必须具有该方法。(除了静态常量外,接口不支持定义字段。)String可以将length作为一个方法和一个字段,但那会分散注意力。
灵活性。String的内部实现随着时间的推移而发生了变化:曾经它使用了一个内部char数组和单独的offset和length字段来定义char数组中的一个区域。这样做是为了子字符串可以共享父字符串的char数组(具有不同的偏移量和长度),而不是复制数组。后来发现这种优化很少有益,所以现在,String只有一个正确大小的char数组,length方法读取数组的length字段。String不再具有自己的length字段,甚至没有私有的length字段,但如果它是类的公共API的一部分,他们不能删除它,这会减少对内部实现的实验的灵活性。
CharSequence
是在Java 1.4中添加的,因此它并不是String
具有length()
方法的原因。 - Mark Rotteveel数组的length
是一个int字段,但String(和其他对象)通常使用getter方法。
请注意,两者之间的区别在于字符串的“length”仅仅是它在内部char
数组中已经存储的信息量,而数组的length
字段只是它的容量。
null
設置到 char
數組中,但如果你使用像 java.misc.Unsafe
這樣瘋狂的東西,在字符串上,特別是參考長度方法時就難說了。即使以那種形式,數組的長度也是不可設置的。 - Rogue