Java 其中是数组';是否定义了s长度属性?

Java 其中是数组';是否定义了s长度属性?,java,arrays,Java,Arrays,我们可以使用数组列表的公共方法size()来确定其长度,如 ArrayList<Integer> arr = new ArrayList(10); int size = arr.size(); 虽然ArrayList的size()方法是在ArrayList类中定义的,但是Array的length属性在哪里定义的?数组是java中的特殊对象,它们有一个名为length的简单属性,它是final 数组没有“类定义”(在任何.class文件中都找不到),它们是语言本身的一部分 10.7.

我们可以使用
数组列表的公共方法
size()
来确定其长度,如

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

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

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

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

10.7. 数组成员 数组类型的成员包括以下所有成员:

  • public
    final
    字段
    length
    ,其中包含阵列的组件数<代码>长度
可以是正或零
  • public
    方法
    clone
    ,它覆盖类
    对象中同名的方法,并且不抛出任何选中的异常。数组类型
    T[]
    clone
    方法的返回类型为
    T[]

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

  • 从类
    对象继承的所有成员
    对象
    唯一没有继承的方法是它的
    克隆
    方法

  • 资源:

    定义如下:

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

    • public final
      字段
      length
      ,其中包含数组的组件数<代码>长度
      可以是正或零
    由于数组类型的数量是无限的(每个类都有一个对应的数组类型,然后是多维数组),它们不能在类文件中实现;JVM必须在运行中完成它。

    它基本上是“特殊的”,有自己的字节码指令:
    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));
    

    因此,不幸的是,JLS对具有公共最终字段
    长度
    的每种数组类型的描述有些误导:(

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

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

    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阵列成员


    尽管这不是对问题的直接回答,但它是对
    .length
    vs
    .size()
    参数的补充。我正在研究与此问题相关的内容,因此当我遇到它时,我注意到此处提供的定义

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

    不“完全”正确

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

    例如:

    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
    
    List size:  0
    List size:  1
    List size:  2
    
    但是,
    ArrayList
    .size()
    属性确实给出了列表中的元素数:

    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());
    

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

    要按原样回答,数组的此长度属性定义在哪里?在特殊的
    对象标头中

    易于通过

    此输出的其中一行是:

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

    通常,对象有两个头(mark和klass),数组还有一个头总是占据
    4字节的长度,因为
    size
    int

    注意
    ArrayList.size()
    提供数组中实际存储的对象数量,而
    myArray.length
    []
    )提供“容量”。也就是说,如果for
    myArray=newint[10];
    ,返回10。这不是你在数组中放入的对象数。@Colin数组对象为何如此特殊,我的意思是为什么设计人员需要使其特殊,为什么不提供数组的类文件?@VikasVerma为什么数组与对象不同?因为历史。当设计Java时,大多数语言创新尝试都失败了,因为在语法和风格上,C++和Objul-C和java是不太相似的语言之一。java有意识地设计了包括卷发支架和普通阵列的程序,使他们对当天的主流程序员来说是熟悉的。见詹姆斯·高斯林和其他太阳人的采访。有些人坚持使用CYL。java java java语言必须在纯的OOP上进行,避免使用简单的数组。@ VikasVC++,在某个时候,Java必须建立在较低级别的技术上。如果Java不存在,就不能用Java来构建它。C++必须使用C++(或者其他的东西,但是C++)为Java的其余部分构建一些原始编译,以便使其自身存在上下文。在没有任何最终的类的情况下,在C++中对其进行编码。如果不能使用<代码>列表<代码>,那么在java中如何使用java?照原样回答,我记不清阿尔伯特·爱因斯坦的一句名言了,但上面说的是“人民理解我们”
     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)