灵魂拷问:Java如何获取数组和字符串的长度?length仍是length()?

限时 1 秒钟给出答案,来来来,听我口令:“Java 如何获取数组和字符串的长度?length 仍是 length()?”html

在逛 programcreek 的时候,我发现了上面这个主题。说实话,我当时脑海中浮现出了这样一副惊心动魄的画面:java

面试官老马坐在个人对面,地中海式的发型令我敬佩有加。尽管略显疲惫,但他仍然自信地向我抛出了上面这个问题。稍稍迟疑了一下,我回答说:“数组用 length,字符串用 length 跟上小括号”。老马不愧是面试中的高手,一瞬间就从个人回答中捕获到了不自信。我能感觉得出来,由于我看到老马的嘴角微微地动了一下,彷佛想要咂咂嘴。但出于对于个人礼貌,他克制住了。程序员

到底该用 length 仍是 length(),说真的,我当时真有点吃不许,怀念 IDE 的代码自动提醒功能啊!web

int[] arr = new int[4];
System.out.println(arr.length);// 获取数组的长度

String str = "沉默王二";
System.out.println(str.length());// 获取字符串的长度

按理说,数组字符串都是对象,访问长度都用 length() 方法就行了。为何数组恰恰剑走偏锋用的 length 字段呢?面试

首先呢,咱们必需要明白:数组是一个容器,当它被建立后,不只元素的类型是肯定的,元素的个数也是肯定的。换句话说,数组的长度是肯定的,不可能再变长或者变短。所以,数组可使用一个字段(length)来表示长度。数组

建立数组的方法有两种,这个应该你们都知道了。一种是经过 new 关键字建立指定长度后再赋值,另一种是经过 {} 直接进行初始化。ruby

// new
int[] arr = new int[4];
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
arr[3] = 3;

// {}
int [] arr1 = {0123};

但无论用哪一种方法,数组的长度是能够明确知道的。而且不会再变长或者变短(学不了孙悟空的金箍棒)。app

因为数组也是对象,因此如下代码是合法的。函数

Object arr2 = new int[4];

这就意味着数组继承了超类 java.lang.Object 的全部成员方法和字段。事实上,的确如此,咱们能够经过如下代码来获取数组的类型信息 Class。this

Object arr2 = new int[4];
System.out.println(arr2.getClass());

Object arr3 = new String[4];
System.out.println(arr3.getClass());

输出的结果会是什么呢?

class [I
class [Ljava.lang.String;

class [I 表示一个“int 类型数组”在运行时的对象类型信息;class [Ljava.lang.String; 表示一个“字符串类型数组”在运行时的对象类型信息。

那为何数组不单独定义一个类来表示呢?就像字符串 String 类那样呢?

一个合理的解释是 Java 将其隐藏了。假如真的存在一个 Array.java,咱们也能够假想它真实的样子,它必需要定义一个容器来存放数组的元素,就像 String 类那样。

public final class String
    implements java.io.SerializableComparable<String>, CharSequence 
{
    /** The value is used for character storage. */
    private final char value[];
}

但这样作真的有必要吗?为数组单独定义一个类,是否是有点多此一举的意味。那既然数组不必定义成一个类,也就没有必要再定义一个 length() 方法来获取数组的长度了,直接用 length 这个字段就能够了,不是吗?

那为何字符串 String 类会有 length() 方法呢?来看一下源码就明白了。

    /**
     * Returns the length of this string.
     * The length is equal to the number of Unicode
     * code units in the string.
     */

    public int length() {
        return value.length;
    }

length() 方法返回的正是字符数组 value 的长度(length),value 自己是 private 的,所以颇有必要为 String 类提供一个 public 级别的方法来供外部访问字符的长度。

总结一下,Java 获取数组长度的时候用 length,获取字符串长度的时候用的是 length(),他们之间的区别我相信你们已经搞清楚了。

最后提醒一点:万丈高楼平地起。一栋楼能盖多高,一座大桥能造多长,重要的是它们的地基。一样对于咱们技术人员来讲,基础知识越扎实,走得就会越远。


好了各位读者朋友们,以上就是本文的所有内容了。能看到这里的都是最优秀的程序员,二哥必需要伸出可爱的大拇指为你点个赞👍。若是以为不过瘾,还想看到更多,我再推荐几篇给你们。

灵魂拷问:为何 Java 字符串是不可变的?

灵魂拷问:建立 Java 字符串,用""仍是构造函数

灵魂拷问:如何检查Java数组中是否包含某个值 ?

灵魂拷问:Java 的 substring() 是如何工做的?

养成好习惯!若是是二哥的铁杆读者的话,请不要吝啬你的鼠标左键,点赞就对了,来年升职加薪就是你的了!若是想第一时间看到二哥的原创文章,扫下面这个码就对了。

相关文章
相关标签/搜索