翻译人员: 铁锚

翻译时间: 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

从length与length()开始谈Java的更多相关文章

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

    限时 1 秒钟给出答案,来来来,听我口令:"Java 如何获取数组和字符串的长度?length 还是 length()?" 在逛 programcreek 的时候,我发现了上面这个 ...

  2. 【JAVA】java中的length和length()

    参考链接: 你注意到Java中的length和length()了吗?外加一个size() java中的求长度length有时有小括号,有时没有小括号,到底什么时候该加小括号呢? 总结: Java中St ...

  3. 分析Java中的length和length()

    在不适用任何带有自动补全功能的IDE的情况下,我们怎么获取一个数组的长度?如何获取字符串的长度? 这里我们先举用实例去分析一下:int[] arr=new int[3]:System.out.prin ...

  4. 关于Java中length、length()、size()的区别

    length——数组的属性: length()——String的方法: size()——集合/映射的方法:(List.Set.Map) 转载自https://blog.csdn.net/qq_3323 ...

  5. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  6. 【转】浅谈Java中的hashcode方法(这个demo可以多看看)

    浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...

  7. 谈JAVA的内存回收(一)

    谈JAVA的内存回收 程序员需要通过关键字new创建Java对象,即可视为Java对象申请内存空间,JVM会在堆内存中为每个对象分配空间,当一个Java对象失去引用时,JVM的垃圾回收机制会自动清除他 ...

  8. 【转】浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...

  9. 浅谈Java中的hashcode方法(转)

    原文链接:http://www.cnblogs.com/dolphin0520/p/3681042.html 浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地 ...

  10. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

随机推荐

  1. jQuery – AJAX load() 方法

    jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 语法: $(selector). ...

  2. Redis源码学习:字符串

    Redis源码学习:字符串 1.初识SDS 1.1 SDS定义 Redis定义了一个叫做sdshdr(SDS or simple dynamic string)的数据结构.SDS不仅用于 保存字符串, ...

  3. linux:关于Linux系统中 CPU Memory IO Network的性能监测

    我们知道:系统优化是一项复杂.繁琐.长期的工作.通常监测的子系统有以下这些:CPUMemoryIO Network 下面是常用的监测工具 Linux 系统包括很多子系统(包括刚刚介绍的CPU,Memo ...

  4. 20160221.CCPP体系详解(0031天)

    程序片段(01):01.结构体静态数组.c+02.结构体动态数组.c 内容概要:结构体数组 ///01.结构体静态数组.c #include <stdio.h> #include < ...

  5. Dynamics CRM2016 关闭错误报告弹框提示

    在之前的版本中错误报告的弹框提示是可以在隐私首选项中设置关闭的,如下图所示 但是在2016中这个设置没了 有人说在右上角的选项中设置,但那个只能是设置个人的无法修改系统级别的.在系统中找了半天还是没有 ...

  6. Windows Python requests 详细模块安装方法

    据说requests是一个很吊的处理网络问题的第三方库.我折腾了半天.终于在Win上安装好了. 网上找到的都不详细,我是反复尝试才成功的. 还是自己写一个傻瓜式的指南吧: 1.安装 Setuptool ...

  7. JQuery插件使用之Validation 快速完成表单验证的几种方式

    JQuery的Validation插件可以到http://plugins.jquery.com/上去下载.今天来分享一下,关于这个插件的使用. 简易使用 这第一种方式可谓是傻瓜式的使用,我们只需要按照 ...

  8. Java基本语法-----java流程控制语句

    1顺序语句 语句:使用分号分隔的代码称作为一个语句. 注意:没有写任何代码只是一个分号的时候,也是一条语句,称作空语句. 顺序语句就是按照从上往下的顺序执行的语句. 2判断(if-else) 在我们找 ...

  9. 剑指Offer——腾讯+360+搜狗校招笔试题+知识点总结

    剑指Offer--腾讯+360+搜狗校招笔试题+知识点总结 9.11晚7:00,腾讯笔试.选择题与编程.设计题单独计时. 栈是不是顺序存储的线性结构啊? 首先弄明白两个概念:存储结构和逻辑结构. 数据 ...

  10. iOS关于图片点到像素转换之杂谈

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 不管是以什么方法生成的图片,是从磁盘上读取的,还是从其他对象中 ...