为了账号安全,请及时绑定邮箱和手机立即绑定

Java中的length和length()

Java中的length和length()

烙印99 2019-11-23 10:42:15
为什么我们将数组的长度作为属性,为什么将array.lengthString作为方法str.length()?有什么原因吗?
查看完整描述

3 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

让我首先强调三种用于类似目的的不同方式。


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


length()- 与字符串相关的对象(String,StringBuilder等)-了解字符串的长度


size()- 集合对象(ArrayList,Set等)-知道集合的大小


现在忘记length()考虑公正length和size()。


length不是方法,因此完全无法在对象上使用是完全有意义的。它仅适用于数组。

size()它的名称更好地描述了它,并且因为它是一种方法,将在我上面所说的那些使用集合(集合框架)的对象的情况下使用。


现在来看length():

字符串不是原始数组(因此我们不能使用.length),也不是集合(因此我们不能使用.size()),这就是为什么我们还需要一个不同的数组length()(保持差异并达到目的)的原因。


作为为什么的答案?

我发现它很有用,易于记忆,易于使用且友好。


查看完整回答
反对 回复 2019-11-23
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

稍微简化一下,您可以认为它是一种特殊情况,而不是普通类(有点像基元,但不是)。字符串和所有集合都是类,因此获取大小,长度或类似内容的方法。


我猜设计的原因是性能。如果他们今天创建了它,他们可能想出了一些类似数组支持的集合类。


如果有人感兴趣,下面是一小段代码,以说明所生成代码中两者之间的区别,首先是源代码:


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());

  }

}

截断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

在第一种情况下(20-25),代码仅向JVM请求数组的大小(在JNI中,这将是对GetArrayLength()的调用),而在String情况下(28-35),它需要执行以下操作:方法调用以获取长度。


在1990年代中期,如果没有良好的JIT和功能,仅使用java.util.Vector(或类似的东西),而不是像一个类却表现得并不快的语言构造,将完全丧失性能。他们当然可以将属性掩盖为方法调用并在编译器中进行处理,但是我认为在不是真正类的东西上使用方法会更加令人困惑。


查看完整回答
反对 回复 2019-11-23
?
皈依舞

TA贡献1851条经验 获得超3个赞

考虑:


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

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


最终,这只是演变而来的不一致,如果从头开始重新设计该语言,那肯定会得到解决。据我所知,没有其他语言(C#,Python,Scala等)做同样的事情,因此这可能只是作为该语言一部分而出现的轻微缺陷。


如果仍然使用错误的代码,则会出现错误。


查看完整回答
反对 回复 2019-11-23
  • 3 回答
  • 0 关注
  • 478 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信