首页 > 代码库 > Java中的length和length()

Java中的length和length()

首先,你能快速回答下面的问题吗?

不借助IDE的代码自动完成,如何获取一个数组的长度?如何获取一个字符串的长度?


我曾问过不同层次的开发者这个问题。他们不能正确的或者自信的回答这个问题。当IDE提供了便捷的代码完成功能,也带来了对问题理解仅停留在表面的问题。在这里,我会解释一些关于数组的关键概念。

答案:

int[] arr = new int[3];
System.out.println(arr.length);//length for array
 
String str = "abc";
System.out.println(str.length());//length() for string


为什么数组具有length属性而字符串没有?为什么字符串有length()方法而数组没有?

第一个问题:为什么数组有length属性?


首先,数组是一个存储固定数目的单一类型的值的容器对象。当一个数组被创建后,它的长度不能再被改变。数组的长度可以看做一个不可变实例的变量length。因此,长度可以被看做一个数组明确的属性。

可以通过两种方式创建数组:1)一个创建数组表达式和2)数组初始化器。当它被创建时,大小已被指定。

在上面例子中我们使用了创建数组表达式。它指定了元素类型,嵌套数组的维度和数组的长度至少为一维数组。

这个声明也是合法,只要指定了数组的第一维度。

使用数组初始化器创建一个数组并指定了数组包含的所有初始化值,使用{}包含所有的值,每个值之间用逗号分隔。

例如:

int[] arr = {1,2,3};


第二个问题:为什么不定一个类似于"String"一样的类”Array“


因为数组是一个对象,所以下面的代码也是合法的:

Object obj = new int[10];


一个数组包含所有从类对象继承过来的成员(不包括克隆)。为什么不定义一个数组类?我们找不到Array.java这个文件。一个粗暴的回答就是它藏起来了不让我们发现。你可以这样考虑这个问题——如果存在Array这样一个类,它看起来会像什么?它仍然需要一个数组存储数组数据,对吧?因此,定义这样的一个类意义不大。

实际上,我们可以通过下面的代码获得一个数组的类:

int[] arr = new int[3];
System.out.println(arr.getClass());


输出

class [I


class [I“代表了元素类型为int的数组的类对象的运行时类型签名。


第三个问题:为什么字符串有length()方法


一个字符串的备份数据结构是一个字符数组。不需要定义不是每个程序都必需的一个字段length。不同于C,在Java中一个字符数组并不等同于一个字符串。

Java中的length和length()