java(七)数组

来源:互联网 发布:java 深度遍历算法 编辑:程序博客网 时间:2024/06/02 02:08

数组

1、定义:数组是一个简单的复合数据类型,它是一系列有序相同类型数据的集合,可以通过数组名加上一个不会越界下标值来唯一确定数组中的元素。(一个比较特殊的对象,是object的直接子类)。

public class test {         int[] a0 = new int[10];        test t=new test();        System.out.println("一维数组:" + a0.getClass().getName());        int[][] a1 = new int[10][10];        System.out.println("二维数组:" + a1.getClass().getName());                   int[][][] a2 = new int[10][10][10];        System.out.println("三维数组:" + a2.getClass());        System.out.println(t.getClass());}
一维数组:[I
二维数组:[[I

三维数组:class [[[I
class day01to05.test

[代表维度,普通类是路径加类名作为自己的标识,而数组则已[+数组元素路径+类名作为标识,在数组中有一个特征的属性length,数组直接继承自object,object里没有length变量,那么数组如何实现length的

public class M {    public static void main(String[] args) {        int a[] = new int[2];        int i = a.length;    }}
M的class文件,打开字节码如下

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              //m方法返回
这里没有length这个成员变量,arraylength ,这条指令是用来获取数组的长度的,JVM对数组的长度做了特殊的处理,它是通过arraylength这条指令来实现的。
2、数组的应用:

数组要先声明在使用,细节为:声明:数组形式,分配空间:连续存储空间。赋值:数据初始化,基本类型初始值为0,引用类型初始值为null。处理:数据的操作,数组名加有效下标的处理。
数组的性能:数组是一种高效的存储和随机访问对象引用序列的方式。数组在某些地方的使用是不如List和Set集合,数组有自己的优势,集合的底层也是通过数组来实现的。比如在求和的使用中使用数组和list的对比。数组使用get函数获取数据,list使用get()函数。list.get(i)这个动作里进行了拆箱操作,Integer对象对int型数据进行对象封装,这里拆箱和数组获取相比慢了很多。

3、数组的操作

数组的长度:数组生明后长度不会改变,但是如果想让其改变,模拟arraylist的扩容方法,将原始数组拷贝至新数组中,新数组的长度时原数组的1.5倍。

数组的复制:使用List.toArray()方法转换成数组然后再通过Arrays.copyOf拷贝,再转换成集合,若数组元素为对象,则数组里面数据是对象引用,典型浅复制。

数组转换为list,Arrays的工具里有asList()方法,将其转化成列表

public static void main(String[] args) {        int[] a = new int[]{1,2,3};        List list = Arrays.asList(a);        System.out.println(list.size());    }
结果是1而不是3,在asList()的源码中T..a参数是泛型变长参数,这里没有报错是因为,数组是对象处理的可以是泛型
public static <T> List<T> asList(T... a) {        return new ArrayList<T>(a);    }
程序是把一个int型的数组作为了T的类型,所以在转换之后List中就只会存在一个类型为int数组的元素了。所以我们这样的程序System.out.println(datas.equals(list.get(0)));输出结果肯定是true。当然如果将int改为Integer,则长度就会变成3了。

0 0