`

(转)深入分析Java中的length和length()

 
阅读更多
在开始正文之前,请你快速回答如下问题:

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

这个问题我问过不同水平的程序员,包括初级和中级水平的。他们都不能准确而自信地回答这个问题(如果你能很准确很自信的回答这个问题,那么证明针对这一知识点你比大多数中级程序员掌握的好)。由于现在很多IDE都有代码补全功能,这使得开发人员在很多问题上都理解的很肤浅。本文将介绍几个关于Java数组的关键概念。

上面问题的正确回答姿势应该是这样的:

int[] arr = new int[3];
System.out.println(arr.length);//使用length获取数组的程度

String str = "abc";
System.out.println(str.length());//使用length()获取字符串的长度
那么问题来了,为什么数组有length属性,而字符串没有?或者,为什么字符串有length()方法,而数组没有?

为什么数组有length属性?

首先,数组是一个容器对象(Java中的数组是对象吗?),其中包含固定数量的同一类型的值。一旦数组被创建,他的长度就是固定的了。数组的长度可以作为final实例变量的长度。因此,长度可以被视为一个数组的属性。

有两种创建数组的方法:1、通过数组表达式创建数组。2、通过初始化值创建数组。无论使用哪种方式,一旦数组被创建,其大小就固定了。

使用表达式创建数组方式如下,该方式指明了元素类型、数组的维度、以及至少一个维度的数组的长度。

该声明方式是符合要求的,因为他指定了一个维度的长度(该数组的类型为int,维度为2,第一维度的长度为3)

int[][] arr = new int[3][];
使用数组初始化的方式创建数组时需要提供所有的初始值。形式是使用{和}将所有初始值括在一起并用,隔开。

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

这里可能会有一个疑问,既然数组大小是初始化时就规定好的,那么int[][] arr = new int[3][];定义的数组并没有给出数组的第二维的大小,那么这个arr的长度到底是如何“规定好”的呢?

其实,arr的长度就是3。其实Java中所有的数组,无论几维,其实都是一维数组。例如arr,分配了3个空间,每个空间存放一个一维数组的地址,这样就成了“二维”数组。但是对于arr来说,他的长度就是3。

int[][] a=new int[3][];
System.out.println(a.length);//3
int[][] b=new int[3][5];
System.out.println(b.length);//3
Java中为什么没有定义一个类似String一样Array类

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

Object obj = new int[10];
数组包含所有从Object继承下来方法(Java中数组的继承关系),除clone()之外。为什么没有一个array类呢?在Java中没有Array.java文件。一个简单的解释是它被隐藏起来了(注:Java中的数组有点类似于基本数据类型,是一个内建类型,并没有实际的类与他对应)。你可以思考这样一个问题——如果有一个Array类,那它会像什么样?它会仍然需要一个数组来存放所有的数组元素,对吗?因此,定义出一个Array类不是一个好的主意。(译者注:这里可能有点绕,道理有点类似于:鸡生蛋蛋生鸡问题,可能比喻也不是很恰当,请读者自行理解)

事实上我们可以获得数组的类定义,通过下面的代码:

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

class [I
“class [I”代表着”成员类型是int的数组”的class对象运行时类型的签名

为什么String有length()方法?

String背后的数据结构是一个char数组,所以没有必要来定义一个不必要的属性(因为该属性在char数值中已经提供了)。和C不同的是,Java中char的数组并不等于字符串,虽然String的内部机制是char数组实现的。(注:C语言中,并没有String类,定义字符串通常使用char string[6] = "hollis";的形式)

注:要想把char[]转成字符串有以下方式:

char []s = {'a','b','c'};
String string1 = s.toString();
String string2 = new String(s);
String string3 = String.valueOf(s);
分享到:
评论

相关推荐

    Java中的length和length()深入分析

    在Java编程语言中,`length` 和 `length()` 是两个非常基础且重要的概念,它们分别与数组和字符串有关。在Java中,数组的长度可以通过 `length` 属性获取,而字符串的长度则需要通过 `length()` 方法来获取。这两者...

    深入分析JAVA 反射和泛型

    深入分析JAVA 反射和泛型 JAVA 反射和泛型是 JAVA 编程语言中两个重要的概念,它们在 JAVA 编程中扮演着非常重要的角色。下面我们将深入分析 JAVA 反射和泛型的相关知识点。 JAVA 反射 JAVA 反射是 JAVA 编程语言...

    java十进制转换二进制

    本篇文章将深入解析一个使用Java语言编写的程序,该程序能够将十进制正数和负数转换为二进制形式。通过分析代码逻辑、算法原理以及实现细节,帮助读者更好地理解十进制到二进制转换的过程。 #### 转换正数到二进制 ...

    java十进制转十六进制

    在Java编程语言中,十进制到十六进制的转换是一项基本操作,它涉及到数字系统的理解和数据类型的应用。转换过程通常使用内置的`Integer.toHexString()`方法。以下是如何在Java中进行这种转换: ```java int decimal...

    java 字符串中文判断

    在Java编程语言中,处理字符串是非常常见的操作,尤其是在涉及到文本分析和处理的场景。本文将深入探讨如何在Java中进行中文字符的判断和计数,这主要基于Java的Unicode编码特性以及字符集的理解。 首先,我们需要...

    Java编程-金额小写转大写

    本文将深入探讨如何实现这个功能,并通过提供的`GetAmount.java`文件中的代码进行分析。 首先,我们要了解金额的大写规则。在中文环境下,数字的小写到大写的转换规则如下: 1. `0`对应`零` 2. `1`对应`壹` 3. `2`...

    Android中java和js交互

    本文将深入探讨Android中Java和JS交互的实现方式,并通过一个名为"MyWebh5"的示例项目进行说明。 首先,我们需要了解Android中的WebView组件。WebView是Android提供的一种用于加载和显示网页内容的控件。它不仅能够...

    Java编写的非常有用的方法,文字中提取中文字符

    在Java编程语言中,处理字符串是一项常见的任务,尤其是在文本处理和数据分析方面。本文将深入探讨两个关键知识点:如何从字符串中提取所有中文字符以及如何判断一个字符串是否为空白字符串。 首先,让我们关注...

    js java 判断中文,英文的混合长度

    根据给定文件的信息,本文将围绕“JS与Java中判断字符串中文、英文混合长度的方法”这一主题进行深入探讨。文章将分别介绍JavaScript和Java中如何处理包含中文字符和英文字符的混合字符串,并计算其等效长度。 ### ...

    java中英文字符串处理.

    在Java编程语言中,字符串处理是一项至关重要的任务,无论是在简单的数据操作,还是在复杂的文本分析和处理场景中。本文将深入探讨Java中处理中英文字符串的基本操作,包括子串的提取、比较、拼接、替换以及一些常用...

    Java计算校验和源码

    本文将深入解析一个用于计算十六进制数据校验和的Java方法:`makeChecksum`。该方法主要用于确保数据在传输过程中的完整性和一致性,避免因网络传输等问题导致的数据损坏。通过分析此方法的实现细节,可以帮助我们更...

    文《关于c++与java中文乱码问题分析与解决》中一个bug分析1

    文章《关于C++与Java中文乱码问题分析与解决》深入探讨了这一问题,并提供了一个解决方案。该解决方案涉及到使用`iconv`库进行编码转换,从GBK(中国的GBK编码标准)转换到UTF-8(一种广泛支持的Unicode编码格式)。...

    计算汉字笔画数java实现

    根据提供的文件信息,本文将详细解析如何通过Java编程语言实现计算汉字笔画数的方法,并对代码中的关键逻辑进行深入分析。 ### 概述 在Java中实现计算汉字笔画数的功能,主要涉及到对汉字编码的理解以及如何根据...

    java 中des文件加密源码

    本文将深入探讨如何在Java中实现DES文件加密,并基于提供的源码`TestDES.java`和`DES.java`来解析相关知识点。 ### 1. DES算法简介 DES全称为数据加密标准,是一种块加密算法,它使用64位的密钥对64位的数据块进行...

    Java IO操作和将字符串解析为数值数组

    本文将深入探讨这两个主题,并结合提供的两个文件名`TestWriteD.java`和`TestSplitD.java`进行分析。 首先,Java IO操作包括对文件、网络、系统流等的读写操作。核心类库提供了一系列接口和类,如`InputStream`、`...

    java后台汉字转拼音

    在Java编程语言中,将汉字转换为拼音是一项常见的任务,特别是在处理...这个"java后台汉字转拼音"的压缩包文件可能是为了帮助开发者快速理解和实现这个功能,通过阅读和运行其中的代码示例,可以加深对此知识点的理解。

    object转化为时间类型

    接下来,我们将深入分析题目给出的示例代码: ```csharp public string GetTime(object all) { try { string time = all.ToString(); if (time.Length > 7) time = time.Substring(0, 8); return DateTime....

    java 音频解析 代码

    在Java编程环境中,音频解析是一项重要的任务,它涉及到读取、处理和理解音频文件的内部结构。本篇文章将深入探讨如何使用Java进行音频解析,并提供相关的代码示例。我们将主要关注以下几个方面:音频文件格式、Java...

    JAVA贪吃蛇源代码

    在本项目"JAVA贪吃蛇源代码"中,我们将会深入探讨如何利用Java来实现一个经典的小游戏——贪吃蛇。这个项目对于初学者来说是绝佳的实践机会,它可以帮助你巩固基础,理解面向对象编程的原理,以及如何将这些概念应用...

    java 数组和字符串

    在顾客消费管理系统的设计中,不仅展示了如何创建和引用数组,还深入实践了对象数组的使用,以及通过循环和条件语句来实现对象数组的初始化和数据的动态管理。 #### 总结与反思 本次实验通过实际操作,加深了对...

Global site tag (gtag.js) - Google Analytics