从length与length()开始谈Java

简介: 翻译人员: 铁锚 翻译时间: 2013年11月23日 原文链接: Start from length & length() in Java 首先请看下面的问题,你能快速地回答上来吗? 假设没有任何集成开发环境和自动补全功能,如何获取数组的长度?如何取得字符串的长度? 我将为  新手以及中等水平这个水平之间的开发者回答这个问题:。

翻译人员: 铁锚

翻译时间: 2013年11月23日

原文链接: Start from length & length() in Java


首先请看下面的问题,你能快速地回答上来吗?

  • 假设没有任何集成开发环境和自动补全功能,如何获取数组的长度?如何取得字符串的长度?

我将为  新手以及中等水平这个水平之间的开发者回答这个问题:。因为他们中的很多人并不能正确回答出来,或者是对自己的答案缺乏信心(译者注: 老外的初级程序员真的这样么).

虽然IDE提供了方便快捷的代码补全功能,但同时也附带了一个缺点,称为 表面上很了解(surface understandin)。

本文将解释Java数组的一些重要概念。

上面问题的答案是:

int[] arr = new int[3];
System.out.println(arr.length);//数组长度
 
String str = "abc";
System.out.println(str.length());//字符串长度
问题是为什么数组有length属性域而String没有呢?或者说为什么字符串对象有 length() 方法而数组没有呢?

1. 为什么数组有length属性?
首先,数组是一个容器对象,用于保存单个类型的固定数量的值。在数组创建以后,其长度是固定不变的。所以数组的length属性可以作为一个final域存在.

因此length可以作为数组(array)的定义属性(defining attribute).

数组有两张创建方式:

1) new 数组创建表达式

2) 大括号形式的数组初始化器( array initializer)

数组在创建的时候,其大小就被指定了.

上面的例子中就使用到了数组创建表达式( array creation expression ),表达式指定了元素的类型, 数组的维度,以及最少要指定最顶层维度的大小。

下面的声明也是合法的,因为指明了数组的维度以及顶层维度的大小。

int[][] arr = new int[3][];
数组初始化器( array initializer) 通过指定包含的所有元素来创建一个数组,在大括号"{ }"中用分号(,)分开的表达式列表.例如:

int[] arr = {1,2,3};
2. 为什么不像String一样定义一个"Array"类呢?
既然数组是对象,那么下面的代码就是合法的:

Object obj = new int[10];
数组对象含有所有从Object类继承的成员( 除了 clone 方法).为什么没有定义一个array的类呢? 我们也不能找到一个叫做 Array.java 的类(文件).
一个粗略的即使是这个类对开发者不可见。

可以思考这个问题? —— 如果有一个显式的Array类,那么它应该是什么样子呢? 它仍然需要一个数组来保存 数组元素,对吧?  因此定义这样一个类是不太合理的。

实际上我们可以得到一个数组的 class(属性),代码如下所示:

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

class [I
" class [I" 代表 "一个成员类型是 int 的数组"  的运行时签名.
3. 为什么String有length() 方法呢?
String对象背后的数据结构是 char 字符数组, 并不需要定义一个不怎么用到的属性域, 和C语言不一样,在Java中一个 char型的数组并不是String。

参考资料

[1] Arrays
[2] JLS Array

相关阅读:

  1. How to Convert Array to ArrayList in Java?
  2. Example of Sorting Arrays
  3. Java Method to Shuffle an Array
  4. Top 10 Methods for Java Arrays

目录
相关文章
|
24天前
|
Java
java equals和==
==是进行对象的地址值比较,如果确实需要字符串的内容比较,可以使用两个方法 public boolean equals(0bjectobj):参数可以是任何对象,只有参数是一个字符串并且内 容相同的才会给true;否则返回false 注意事项: 1.任何对象都能用object进行接收。 2.equals方法具有对称性,也就是a.equals(b)和b.equals(a)效果一样。 3.如果比较双方一个常量一个变量,推荐把常量字符串写在前面。 推荐:"abc".equals(str) 不推荐:str.equals("abc") public boolean egualsIgnoreCas
11 0
|
3月前
|
Java
Java中 ==与equals的区别
Java中 ==与equals的区别
16 1
|
9月前
|
存储 Java
Java 中==与equals()的区别
Java 中==与equals()的区别
38 0
|
10月前
|
Java
Java中==和equals的区别
Java中==和equals的区别
69 0
|
10月前
|
Java
java equals和==
==是进行对象的地址值比较,如果确实需要字符串的内容比较,可以使用两个方法
57 1
|
10月前
|
SQL 分布式计算 Spark
成功解决java.lang.StringIndexOutOfBoundsException: String index out of range: -2147483648
成功解决java.lang.StringIndexOutOfBoundsException: String index out of range: -2147483648
223 0
|
10月前
|
SQL 分布式计算 Spark
java.lang.StringIndexOutOfBoundsException: String index out of range: -2147483648 成功解决
java.lang.StringIndexOutOfBoundsException: String index out of range: -2147483648 成功解决
160 0
|
11月前
|
存储 Java C++
浅谈Java中的equals和==
浅谈Java中的equals和==
91 0
|
存储 Java 编译器
Java中==与equals区别
关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系
|
Java 数据库连接 mybatis
Cause: java.lang.IndexOutOfBoundsException: Index: 5, Size: 5【已解决】
Cause: java.lang.IndexOutOfBoundsException: Index: 5, Size: 5【已解决】
Cause: java.lang.IndexOutOfBoundsException: Index: 5, Size: 5【已解决】