首页 > Java, 挨踢(IT) > 简易Java(11):细说Java中的lengthlength()

简易Java(11):细说Java中的lengthlength()

2014年7月3日 发表评论 阅读评论 331 人阅读    

首先,在开始正文之前,请你快速回答如下问题:

在不使用任何IDE自动补全的情况下,如何获取一个数组的长度?以及,如何获取一个字符串的长度?

这个问题,我问过初级和高级,两个不同层次的开发人员。他们都不能准确而自信地回答这个问题。当IDE提供方便的代码自动补全功能时,它也会带来“理解肤浅”的问题。在这篇文章中,D瓜哥将给大家介绍几个关于Java数组的关键概念。

上述问题的正确答案是:

/**
 * Coder:D瓜哥,http://www.diguage.com/
 */

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属性?

首先,一个数组是一个对象容器,包含了一定数量的对象,这些对象都是同一个类型。当一个数组创建完成后,它的长度不会再改变。数组的长度可以当成一个final实例变量。因此,length可以当做数组的一个定义好的属性。

数组有两种创建方式:1)数组创建表达式,2)数组初始化。当它被创建时,它的长度已经确定下来。

上面的例子就是用的数组表达式。它指明了元素类型、数组嵌套的层次数以及每一层(至少一层)的数组长度。

下面的这个声明方式也是合法的,即使只声明了嵌套中一层的长度。

int[][] arr = new int[3][];

数组初始化也可以创建数组,比提供所有的初始化值。它写起来像是逗号分割的表达式列表,只是被括号包裹。例如:

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

2、为什么没有定义一个类似StringArray类?

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

Object obj = new int[10];

数组包含所有从Object继承下来方法,除clone()之外。为什么没有为数组定义一个类呢?我们也不能发现Array.java文件。一个简单的解释是它们隐藏起来了。你可以这样想这个问题,如果存在这样一个类Array,那么它将会是什么样子呢?那么,还是需要一个数组来包含数组数据,对吧?因此,定义一个这样的类并不是好点子。

实际上,我们可以通过下面的这段代码来获取一个数组的类型:

/**
 * Coder:D瓜哥,http://www.diguage.com/
 */

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

输出如下:

class [I

class [I表示int数组的运行时类型。

3、为什么字符串有length()方法?

String背后的数据结构是一个char数组。所以,没有必要再定义一个属性。这点和C不同,字符数组在Java中不是一个字符串。

《Simple Java》是一本讲解Java面试题的书。讲解也有不少独特之处,为了面试,《简易Java》走起!



作 者: D瓜哥,https://www.diguage.com/
原文链接:https://wordpress.diguage.com/archives/101.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

分类: Java, 挨踢(IT) 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.