第3篇 Java中的数组及Array工具类

数组

1、数组的几个重要特征

  • 连续存储空间(方便查找)

  • 数组长度固定(灵活性差)

  • 数组中只能存放相同的数据类型

  • 数组下标从0开始计算

2、数组的声明定义

//定义int型数组ary0并声明长度为4
int ary0[] = new int[4];
//定义int型数组ary1同时赋初始值
int ary1[] = new int[]{1,2,3,4};

在上面对两个数组的定义中:赋值运算左边为对数组的定义,包括有数组类型、数组名;赋值运算右边为对数组开辟相应数据类型、对应长度的内存空间。

3、数组的遍历

通过ary0.length可以获取数组的长度

int ary0[] = new int[10];
//以数组长度为边界,根据下标对应赋值
for (int i = 0; i < ary0.length; i++) {
    ary0[i] = i;
}
//加强for循环,i依次指向数组每个元素,打印输出
for (int i : ary0) {
    System.out.println("ary0中第"+i+"个元素:"+ary0[i]);
}

输出结果为:

ary0中第0个元素:0
ary0中第1个元素:1
ary0中第2个元素:2
ary0中第3个元素:3
ary0中第4个元素:4
ary0中第5个元素:5
ary0中第6个元素:6
ary0中第7个元素:7
ary0中第8个元素:8
ary0中第9个元素:9

 Arrays工具类

 Arrays类为java.util包里的一个工具类,提供对数组的一些操作方法,常用的有排序(sort)、填充(fill)、拷贝(copyOf)、查找(binarySearch)、判断相等(equals)

1、排序(sort)

Arrays.sort() 支持的类型有char、double、int、byte、float等,同时还支持泛型,但需要自己实现Comparator接口

int ary1[] = new int[]{5,23,15,33,24,6,79,19};
//使用Arrys.sort()对ary1进行从小到大排序
Arrays.sort(ary1);
for (int i : ary1) {
    System.out.print(i+" ");
}

打印结果为:

5 6 15 19 23 24 33 79 

2、填充(fill)

将数组所有元素赋值为统一的填充值,如果对应元素已经有值了,则将覆盖原来的值

//Arrays.fill(int[] a, int val) 的实现:
public static void fill(int[] a, int val) {
        for (int i = 0, len = a.length; i < len; i++)
            a[i] = val;
}

对数组ary2进行填充,将所有元素填充为9:

int ary2[] = new int[10];
Arrays.fill(ary2, 9);
for (int i : ary2) {
    System.out.print(i+" ");
}

最后填充所得到的结果为:

9 9 9 9 9 9 9 9 9 9 

3、拷贝(copyOf)

参数:

  int[] original:被拷贝的数组

  int newLength:被拷贝的长度,即original中被拷贝元素的长度

Arrays.copyOf() 函数会返回一个全新的数组,数组中的元素依次被赋值为orignal数组中前n个元素的值,n即被拷贝的长度,当n大于original数组的长度时,可用来对数组长度进行扩展,扩展部分元素值为0

int ary0[] = new int[]{1,2,3,4,5,6};
int ary1[];
//将ary0前三个元素拷贝给ary1
ary1 = Arrays.copyOf(ary0, 3);
//打印ary1的长度与元素值
System.out.println(ary1.length);
for (int i : ary1) {
    System.out.print(i+" ");
}

打印结果为:

3
1 2 3 

表明ary0中前3个元素【1,2,3】被复制给了一块新的内存空间,同时ary1指向该空间:

4、二分查找(binarySearch)

  • 使用二分查找时,必须先将数组排序
  • 一般用在查找元素是否存在
  • 如果数组没有排序,结果无法确定
  • 如果包含多个指定值,无法保证找到的是哪一个,如果找不到,则返回负数
int ary0[] = new int[]{1,2,5,4,3,6};
//对ary0中3这个元素进行查找
int index = Arrays.binarySearch(ary0, 3);
System.out.println("未排序的数组为:");
showAry(ary0);
System.out.println("未排序进行查找结果:"+index);
//对ary0进行排序,再次查找
Arrays.sort(ary0);
System.out.println("排序的数组为:");
showAry(ary0);
index = Arrays.binarySearch(ary0, 3);
System.out.println("排序后进行查找结果:"+index);
//ary0指向新的、存在多个相同元素数组
ary0 = new int[]{1,2,3,4,5,2,6,3,8};
//再次进行查找
Arrays.sort(ary0);
System.out.println("多值相同且排序过的数组:");
showAry(ary0);
index = Arrays.binarySearch(ary0, 3);
System.out.println("多值相同进行查找结果:"+index);

打印结果为:

未排序的数组为:
1 2 5 4 3 6
未排序进行查找结果:-3
排序的数组为:
1 2 3 4 5 6
排序后进行查找结果:2
多值相同且排序过的数组:
1 2 2 3 3 4 5 6 8
多值相同进行查找结果:4

5、判断相等(equals)

使用Arrays.equals() 判断相等时,进行的是数组各元素的值的比对,而非对ary0和ary1所指向地址的比对,具体实现如下:

public static boolean equals(int[] a, int[] a2) {
        if (a==a2)
            return true;
        if (a==null || a2==null)
            return false;

        int length = a.length;
        if (a2.length != length)
            return false;

        for (int i=0; i<length; i++)
            if (a[i] != a2[i])
                return false;

        return true;
}

区别如下:

int ary0[] = new int[]{1,2,3,4,5};
int ary1[] = new int[]{1,2,3,4,5};
//根据地址判断相等
System.out.println(ary0==ary1);        
//根据值判断相等
System.out.println(Arrays.equals(ary0, ary1));

所得打印结果为:

false
true

在这里要注意不要将其与object类下的equals()方法搞混了,因为object类的equals方法本质上还是使用的 ”==“ 比较运算符,所以所得结果还将是false

最后是一些练习

将数组 ary0={1,2,3,4,5}、ary1={6,7,8,9,10} 整合成一个新的数组并打印

int ary0[] = new int[]{1,2,3,4,5};
int ary1[] = new int[]{6,7,8,9,10};

//先将ary0拷贝进ary2,数组长度为两数组长度之和
int []ary2 = Arrays.copyOf(ary0,ary0.length+ary1.length);
//打印ary2
showAry(ary2);
//再将ary1中元素通过赋值的方法依次拷贝
for (int i = 0; i < ary1.length; i++) {
    ary2[i+ary0.length] = ary1[i];
}
//得到最后结果,打印ary2
showAry(ary2);

得到打印结果如下:

1 2 3 4 5 0 0 0 0 0 
1 2 3 4 5 6 7 8 9 10 
posted @ 2018-07-04 16:29  Zero_Yi  阅读(251)  评论(0编辑  收藏  举报