JAVA中关于数组的深入

*  数组对象的类是什么?

既然数组是对象,那么数组究竟是什么呢?当然,不是java.util.Arrays

public class TestArray {

        private class Dog {

        }

        public static void main(String[] args) {

           int a[] = new int[10];

           int b[] = new int[5];

           //Dog a[][] = new Dog[2][];//[[LTestArray$Dog;

           //int a[][][] = new int[2][][];//[[[I

           //long a[][] = new long[10][];//[[J

           //float a[] = new float[2];//[F

     //String a[][] = new String[10][];

//[[Ljava.lang.String;

           Class clazz = a.getClass();

           System.out.println(clazz.getName());

           Class clazzb = b.getClass();

           System.out.println(clazzb.getName());

        }

}

根据上面的实例,可以得出结论:

ü  数组的类名由若干个’[‘和数组元素类型的内部名称组成,’[‘的数目代表了数组的

维数;

ü  具有相同类型元素和相同维度的数组,属于同一个类,如果两个数组的元素类型相

同,但维度不同那么它们也不属于同一个类,如果一个数组的元素类型和维度相同,但长度不同,那么他们还是属于同一个类;

(2) 数组的类有哪些成员?

实例测试:

public class TestArray {

        private class Dog {

        }

        public static void main(String[] args) {

           int a[] = new int[10];

           Class clazz = a.getClass();

       System.out.println(clazz.getName());

       System.out.println(clazz.getDeclaredFields().length);

       System.out.println(clazz.getDeclaredMethods().length);

    System.out.println(clazz.getDeclaredConstructors().length);

System.out.println(clazz.getDeclaredAnnotations().length);

       System.out.println(clazz.getDeclaredClasses().length);

       System.out.println(clazz.getSuperclass());

        }

}

打印结果:

[I

0

0

0

0

0

class java.lang.Object

    可见,[I这个类是java.lang.Object的直接子类,自身没有声明任何成员变量、成员方法、构造函数和Annocation,可以说:[I就是一个空类。学到这里,我们起码会产生这样一个疑问:为什么连length这个成员变量都没有呢?因为我们经常使用数组.length来获得数组的长度,编译器怎么就没有报错了?

*  数组的类在哪里声明?

类加载器先看看数组类是否已经被创建了。如果没有,那就说明需要创建数组类;如果有,那就无需创建了。

如果数组元素是引用类型,那么类加载器首先去加载数组元素的类。

JVM根据元素类型和维度,创建相应的数组类。

可见,是JVM自己在运行时生成了数组的类对象;再细想,JVM必须动态生成数组类,因为JAVA数组类的数量和元素类型、维度(最多255)有关,可见是无法预先声明好的。

*  没有length这个成员变量!

我们已经发现, JVM没有为数组类生成length这个成员变量,那么Array.length这样的语法如何通过编译,如何执行的呢?

让我们看看字节码吧!编写一段最简单的代码,使用jclasslib查看字节码。

1.public class Main {  

2.    public static void main(String[] args) {  

3.    int a[] = new int[2];  

4.        int i = a.length;  

5.    }  

6.} 

使用SUN JDK 1.6编译上述代码,并使用jclasslib打开Main.class文件,得到main方法的字节码:

0 iconst_2          //int型常量2压入操作数栈

1 newarray 10 (int) //2弹出操作数栈,作为长度,创建一个元素类型为int, 维度为1的数组,并将数组的引用压入操作数栈

3 astore_1     //将数组的引用从操作数栈中弹出,保存在索引为1的局部变量 (a)

4 aload_1           //将索引为1的局部变量(a)压入操作数栈

5 arraylength  //从操作数栈弹出数组引用(a),并获取其长度(JVM负责实现如何

           //获取),并将长度压入操作数栈

6 istore_2     //将数组长度从操作数栈弹出,保存在索引为2的局部变量(i)

7 return       //main方法返回

    可见,在这段字节码中,根本就没有看见length这个成员变量,获取数组长度是由一条特定的指令arraylength实现(怎么实现就不管了,JVM总有办法)。编译器对Array.length这样的语法做了特殊处理,直接编译成了arraylength指令。另外,JVM创建数组类,应该就是由newarray这条指令触发的了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的: 1. 掌握Java数组的基本概念和用法。 2. 熟悉Java数组的定义、初始化、赋值、遍历等操作。 3. 理解Java数组在编程的重要性和作用。 实验内容: 本次实验主要包括以下内容: 1. 数组的定义和初始化。 2. 数组的遍历和访问。 3. 数组的排序和查找。 4. 数组的复制和拼接。 实验步骤和结果: 1. 数组的定义和初始化 Java数组是一种特殊类型的变量,用于存储相同类型的数据。数组可以存储基本数据类型和对象类型。 定义和初始化数组的方法: ``` // 定义一个名为array的整型数组,长度为5 int[] array = new int[5]; // 初始化数组元素 array[0] = 1; array[1] = 2; array[2] = 3; array[3] = 4; array[4] = 5; ``` 也可以使用以下方式定义和初始化数组: ``` // 定义一个名为array的整型数组,同时初始化数组元素 int[] array = {1, 2, 3, 4, 5}; ``` 2. 数组的遍历和访问 数组的遍历和访问可以通过循环语句来实现。常用的循环语句有for循环和foreach循环。 ``` // 使用for循环遍历数组 for(int i=0; i<array.length; i++){ System.out.println(array[i]); } // 使用foreach循环遍历数组 for(int num : array){ System.out.println(num); } // 访问数组元素 System.out.println(array[0]); ``` 3. 数组的排序和查找 Java数组提供了sort()方法来对数组进行排序。sort()方法可以对基本数据类型和对象类型进行排序。 ``` // 对整型数组进行排序 Arrays.sort(array); // 对字符串数组进行排序 String[] strArray = {"apple", "banana", "orange"}; Arrays.sort(strArray); ``` Java数组也提供了binarySearch()方法来进行二分查找。binarySearch()方法可以对已经排序的数组进行查找。 ``` // 对整型数组进行二分查找 int index = Arrays.binarySearch(array, 3); ``` 4. 数组的复制和拼接 Java数组提供了copyOf()方法来复制数组。copyOf()方法可以对原数组进行复制,也可以指定复制的长度。 ``` // 复制整个数组 int[] newArray = Arrays.copyOf(array, array.length); // 复制部分数组 int[] partArray = Arrays.copyOf(array, 3); ``` Java数组也可以通过arraycopy()方法来进行拼接。arraycopy()方法可以将一个数组的元素复制到另一个数组。 ``` // 将两个数组拼接 int[] array1 = {1, 2, 3}; int[] array2 = {4, 5, 6}; int[] newArray = new int[array1.length + array2.length]; System.arraycopy(array1, 0, newArray, 0, array1.length); System.arraycopy(array2, 0, newArray, array1.length, array2.length); ``` 实验结论: 通过本次实验,我深入了解了Java数组的基本概念和用法。掌握了Java数组的定义、初始化、赋值、遍历、排序、查找、复制和拼接等操作。同时,也深刻认识到Java数组在编程的重要性和作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值