首先,你能够快速回答下面的问题吗?
在不使用具有任何代码自动补全功能的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()方法而数组没有呢?
问题1 为什么数组有length属性?
首先,数组是一个保存固定大小的单一类型的对象的容器。数组一经创建,其length不会改变[1]。数组的length是可以得到的作为一个final的实例变量。因此,length可以认为是数组的一个规定的属性。数组可以通过两种方式创建:1)数组声明表达式 2)数组初始化器。一旦创建,其大小就被固定了。数组的声明表达式已经在上面的例子中使用了,它指出了元素的类型,数组的维数,以及数组至少一维的长度。下面的声明也是合法的,因为它声明了多维数组中的一个的长度。
int[][] arr = new int[3][];
数组初始化器在声明的同时给定了初始值,它是写成一个用花括号包起来的逗号分隔的列表的形式。
举个例子,
int[] arr = {1,2,3};
问题2 为什么没有一个像“String”那样的叫做”Array”的类呢?
既然数组是一个对象,那么下面的代码是合法的:
Object obj = new int[10];
数组包含了所有的从Object那里继承而来的成员(除了clone)。为什么没有数组类的定义呢?我们找不到一个叫做Array.java的文件,一个模棱两可的解释是这个文件是对我们隐藏了。你能够想象一下,如果有一个数组类,它会长什么样呢?它依然需要一个数组来保存数组的数据,对吧?因此,定义数组这样的一个类不是一个好主意。
事实上,我们可以通过下面的代码得到数组的类:
int[] arr = new int[3];
System.out.println(arr.getClass());
输出:
class [I
“class [I” 代表了“一个装了int类型数据的数组对象”的运行时类型符号。
问题3 为什么String有length()方法呢?
字符串的内部是使用字符数组来实现的。不需要定义一个在任何程序中都不需要的字段,与C语言不同,在Java中字符数组不是字符串。