Java中的长度和长度()

Nit*_*eti 85 java arrays string

为什么我们将数组的长度作为属性,array.length对于String我们有一个方法,str.length()

有什么理由吗?

Sai*_*aif 98

让我首先强调三种不同的方式来达到类似的目的.

length- 阵列(int[],double[],String[]) -知道数组的长度

length()- 字符串相关的Object(String,StringBuilder等) - 知道String的长度

size()- Collection Object(ArrayList,Set等) - 知道Collection的大小

现在忘记length()考虑公正lengthsize().

length不是一种方法,所以完全有意义的是它不能用于对象.它只适用于数组.
size()它的名字描述得更好,因为它是一种方法,它将用于那些使用集合(集合框架)的对象,正如我在那里所说的那样.

现在来length():
String不是一个原始数组(所以我们不能使用.length),也不是一个Collection(所以我们不能使用.size()),这就是为什么我们还需要一个不同的length()(保持差异并达到目的).

作为答案为什么?
我发现它很有用,易于记忆,使用和友好.

  • 很棒的解决方案! (6认同)

Fre*_*rik 25

有点简化你可以把它想象成数组是一个特例而不是普通类(有点像基元,但不是).字符串和所有集合都是类,因此是获取大小,长度或类似事物的方法.

我想设计时的原因是性能.如果他们今天创建它们,他们可能会想出类似数组支持的集合类.

如果有人有兴趣,这里有一小段代码来说明生成代码中两者之间的区别,首先是源代码:

public class LengthTest {
  public static void main(String[] args) {
    int[] array = {12,1,4};
    String string = "Hoo";
    System.out.println(array.length);
    System.out.println(string.length());
  }
}
Run Code Online (Sandbox Code Playgroud)

切割字节代码中不那么重要的部分,javap -c在类上运行会导致以下两行:

20: getstatic   #3; //Field java/lang/System.out:Ljava/io/PrintStream;
23: aload_1
24: arraylength
25: invokevirtual   #4; //Method java/io/PrintStream.println:(I)V
28: getstatic   #3; //Field java/lang/System.out:Ljava/io/PrintStream;
31: aload_2
32: invokevirtual   #5; //Method java/lang/String.length:()I
35: invokevirtual   #4; //Method java/io/PrintStream.println:(I)V
Run Code Online (Sandbox Code Playgroud)

在第一种情况下(20-25),代码只询问JVM的数组大小(在JNI中这可能是对GetArrayLength()的调用)而在String情况下(28-35)它需要做一个方法调用获取长度.

在20世纪90年代中期,如果没有良好的JIT和东西,它将完全杀死性能只有java.util.Vector(或类似的东西),而不是一个语言结构,它实际上不像一个类,但速度很快.他们当然可以将属性作为方法调用进行掩码并在编译器中处理它,但我认为在一个不是真正的类的东西上使用方法会更加困惑.


Gor*_*son 7

考虑:

int[] myArray = new int[10];
String myString = "hello world!";
List<int> myList = new ArrayList<int>();

myArray.length    // Gives the length of the array
myString.length() // Gives the length of the string
myList.size()     // Gives the length of the list
Run Code Online (Sandbox Code Playgroud)

字符串和数组很可能是在不同时间设计的,因此最终使用了不同的约定.一个理由是,由于Strings在内部使用数组length(),因此使用一种方法来避免重复相同的信息.另一个是使用方法length()有助于强调字符串的不变性,即使数组的大小也是不可更改的.

最终,这只是一种不一致的演变,如果语言从头开始重新设计,肯定会被修复.据我所知,没有其他语言(C#,Python,Scala等)做同样的事情,所以这可能只是一个轻微的缺陷,最终成为语言的一部分.

如果你使用了错误的一个,你会收到一个错误.


小智 7

.length是Java的一次性属性.它用于查找单维数组的大小.

.length()是一种方法.它用于查找a的长度String.它避免重复该值.