zoukankan      html  css  js  c++  java
  • 从length与length()开始谈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

  • 相关阅读:
    [JSOI2007][BZOJ1031] 字符加密Cipher|后缀数组
    leetcode Flatten Binary Tree to Linked List
    leetcode Pascal's Triangle
    leetcode Triangle
    leetcode Valid Palindrome
    leetcode Word Ladder
    leetcode Longest Consecutive Sequence
    leetcode Sum Root to Leaf Numbers
    leetcode Clone Graph
    leetcode Evaluate Reverse Polish Notation
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6467067.html
Copyright © 2011-2022 走看看