数组的长度属性在哪里定义?

时间:2012-02-15 17:10:23

标签: java arrays

我们可以使用公开方法ArrayList<E>来确定size()的长度,例如

ArrayList<Integer> arr = new ArrayList(10);
int size = arr.size();

同样,我们可以使用Array属性

确定length对象的长度
String[] str = new String[10];
int size =  str.length;

size()类的ArrayList方法是在ArrayList类中定义的,length属性Array定义在哪里?

7 个答案:

答案 0 :(得分:247)

数组是java中的特殊对象,它们有一个名为length的简单属性final

没有数组的“类定义”(你无法在任何.class文件中找到它),它们是语言本身的一部分。

  

10.7。数组成员

     

数组类型的成员是以下所有成员:

     
      
  • public final字段length,其中包含数组的组件数。 length可能是正数或零。
  •   
  • public方法clone,它会覆盖类Object中相同名称的方法,并且不会抛出任何已检查的异常。数组类型clone的{​​{1}}方法的返回类型为T[]

         

    多维数组的克隆很浅,也就是说它只创建一个新数组。子阵列是共享的。

  •   
  • 所有成员都继承自班级T[];唯一没有继承的Object方法是Object方法。
  •   

<强>资源:

答案 1 :(得分:114)

它&#34;特别&#34;基本上,使用自己的字节码指令:arraylength。所以这个方法:

public static void main(String[] args) {
    int x = args.length;
}

被编译成如下字节码:

public static void main(java.lang.String[]);
  Code:
   0:   aload_0
   1:   arraylength
   2:   istore_1
   3:   return

因此,它不像正常字段一样被访问。实际上,如果你试图把它当作一个普通的领域,就像这样,那就失败了:

// Fails...
Field field = args.getClass().getField("length");
System.out.println(field.get(args));

所以不幸的是,每个具有公共最终字段length的数组类型的JLS描述都有些误导:(

答案 2 :(得分:18)

它在Java language specification

中定义
  

数组类型的成员是以下所有成员:

     
      
  • public final字段length,其中包含数组的组件数。 length可能是正数或零。
  •   

由于存在无限数量的数组类型(对于每个类都有相应的数组类型,然后有多维数组),它们不能在类文件中实现; JVM必须即时完成。

答案 3 :(得分:15)

即使这不是问题的直接答案,但它是对.length vs .size()参数的补充。我正在研究与这个问题相关的事情,所以当我遇到它时,我注意到这里提供的定义

  

公共最终字段长度,包含数组的组件数

并非“完全”正确。

字段长度包含放置组件的 可用位置 的数量,而不是数组中存在的组件数。因此它表示分配给该阵列的总可用内存,而不是填充了多少内存。

Array Memory Allocation

示例:

static class StuffClass {
    int stuff;
    StuffClass(int stuff) {
        this.stuff = stuff;
    }
}

public static void main(String[] args) {

    int[] test = new int[5];
    test[0] = 2;
    test[1] = 33;
    System.out.println("Length of int[]:\t" + test.length);

    String[] test2 = new String[5];
    test2[0] = "2";
    test2[1] = "33";    
    System.out.println("Length of String[]:\t" + test2.length);

    StuffClass[] test3 = new StuffClass[5];
    test3[0] = new StuffClass(2);
    test3[1] = new StuffClass(33);
    System.out.println("Length of StuffClass[]:\t" + test3.length);         
}

输出:

Length of int[]:        5
Length of String[]:     5
Length of StuffClass[]: 5

但是,.size()的{​​{1}}属性确实提供了列表中元素的数量:

ArrayList

输出:

ArrayList<Integer> intsList = new ArrayList<Integer>();
System.out.println("List size:\t" + intsList.size());
intsList.add(2);
System.out.println("List size:\t" + intsList.size());
intsList.add(33);
System.out.println("List size:\t" + intsList.size());

答案 4 :(得分:5)

它是公共最终字段,其中包含数组的组件数(长度可能为正或零)

因此,数组具有与以下类相同的公共字段和方法:

class A implements Cloneable, java.io.Serializable {
    public final int length = X;
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            throw new InternalError(e.getMessage());
        }
    }
}

的更多信息

10.7阵列成员

http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html

答案 5 :(得分:0)

要按原样回答,数组定义的长度属性在哪里?在特殊的Object header

通过JOL

轻松查看
 int [] ints = new int[23];
 System.out.println(ClassLayout.parseInstance(ints).toPrintable());

此输出中的一行将是:

OFFSET  SIZE      TYPE DESCRIPTION
16       4        (object header)   17 00 00 00 (00010111 00000000 00000000 00000000) (23)

通常,对象有两个标题(mark和klass),数组的长度总是4 bytessizeint

答案 6 :(得分:-1)

关键字长度的作用类似于定义的数据字段。在数组中使用时,我们可以使用它来访问数组中的元素数量。关于String [],我们可以调用String类中定义的length()方法。关于ArrayList,我们可以使用ArrayList中定义的size()方法。请注意,在使用ArrayList&lt;&gt;(capacity)创建数组列表时,此数组列表的初始大小()为零,因为没有元素。