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

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

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

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

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

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

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

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

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

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

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

// {}int [] arr1 = {0, 1, 2, 3};

但不管用哪种方法,数组的长度是可以明确知道的。并且不会再变长或者变短(学不了孙悟空的金箍棒)。

由于数组也是对象,所以以下代码是合法的。

Object arr2 = new int[4];

这就意味着数组继承了超类 java.lang.Object 的所有成员方法和字段。事实上,的确如此,我们可以通过以下代码来获取数组的类型信息 Class。

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

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

输出的结果会是什么呢?

class [Iclass [Ljava.lang.String;

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

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

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

public final class String    implements java.io.Serializable, Comparable<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() 是如何工作的?

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

原文地址:https://www.cnblogs.com/qing-gee/p/12090216.html

时间: 2024-10-23 12:13:51

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

Base64 报错 的解决办法 (Base-64 字符数组或字符串的长度无效。, 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。)

Base64 报错 的解决办法, 报错如下:1. FormatException: The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or a non-white space character among the padding characters. ]    System.Convert.FromBase64Str

java常用的数组、字符串、集合操作以及数据结构与算法基本知识

java中常用封装的数组 .字符串. 集合来操作对象,但数据结构中常用的有栈和队列   数与图以及他们之间的排序,查找. 数组声明没有分配内存空间  只有创建或者是初始化时才分配,创建时把数组中的数据类型数据所在的内存空间首地址赋值给数组名,在创建每个对象时,都会给该对象分配地址和它存储的数据 .如变量    int arr[]; int arr[]={1,2,3};  arr=new int[10] ,int arr[][]={{1,9,7},{1,2,3}}  int arr[][]=new

Java学习-----02.数组和字符串

数组: 数组的定义: 声明数组.分配空间.赋值 数组对象的创建: 元素为引用数据类型的数组: 二维数组: 二维数组初始化: 复制数组: arraycopy()方法 字符串: java.long.String 类,不可变字符序列 类常用方法: public char charAt(int index) 返回字符串中第index个字符. public int length() 返回字符串的长度. public int indexOf(String str) 返回字符串中出现str的第一个位置 pub

Java 实例 – 获取数组长度

package array; public class ArrayLength { public static void main(String[] args) { /** * 获取数组的长度 */ int i[] = { 1, -4, 1, -2, 4, 7, 8, 5, 4, -1, 25 }; System.out.println("数组长度是:"+i.length); } } 输出结果为 数组长度是:11 原文地址:https://www.cnblogs.com/zhuxiao

工厂设计模式灵魂拷问-Java实现

show me the code and take to me,做的出来更要说的明白 GitHub项目JavaHouse同步收录 喜欢就点个赞呗! 你的支持是我分享的动力! 引入 我们经常听到工厂模式,比如说 Spring 用了工厂模式啦,面试也会被问到工厂模式等等,这见工厂模式是日常开发中比较重要的一种设计模式.其实工厂模式也是比较简单的一种设计模式,这年头似乎不了解工厂模式,你都不好意思说你学过 编程一样(手动狗头).那么,允许我灵魂拷问一下,你真的了解工厂模式吗. UML类图 不急,我们先

java 判断含有中文的字符串的长度

public static boolean isLetter(char c) { int k = 0x80; return c / k == 0 ? true : false; } /** * 判断字符串是否为空 * @param str * @return */ public static boolean isNull(String str){ if(str==null||str.trim().equals("")||str.trim().equalsIgnoreCase("

Java之字节数组和字符串的转换问题

今天在使用字节流复制图片的时候发现一个问题,就是将字节数组转化为字符串的时候会出现长度不同的问题.这其实是个错误的操作. public static void main(String[] args) throws IOException { // 第一种方式(不会出现问题) /*FileInputStream fis = new FileInputStream("D:\\美女.jpg"); FileOutputStream fos = new FileOutputStream(&quo

Java基础知识-数组与字符串

数组 声明 类型[] 数组名//建议使用 类型 数组名[] 数组声明后不会分配内存,必须new 数组名 = new 类型[大小] e.g. int [] arr = new int[8]; 使用 数组下标从0开始 赋值 数组名[下标]=数据 e.g. arr[5]=8; 访问 数组名[下标] e.g. System.out.println(arr[5]); 初始化 动态初始化 先声明,再赋值 静态初始化 声明的同时赋值:类型[] 数组名 = {数据1, 数据2, 数据3,-} e.g. int[

数组中字符串按照长度大小排序

直接上代码了 let arr=['css','js','html']; arr.sort(function(a,b){ return a.length-b.length }); 获取arr中最后一个元素,内容及长度 原文地址:https://www.cnblogs.com/yuwen1995/p/9191632.html