首先,你能快速回答下面的问题吗?
不借助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中一个字符数组并不等同于一个字符串。