Java基础系列(五):数组

简介

在Java中,有一种数据结构叫做数组,它用来存储同一类型的值的集合。通过一个整型下标可以访问数组中的每一个值。例如,如果a是一个整型数组,那么a[i]就是数组中下标为i的整数。

创建一个数组的方法

首先,我们可以声明一个数组,声明一个数组有两种方法:

int[] a;
int a[];

当然,一般情况下我们更喜欢使用第一种方式来声明一个数组,因为它将类型与变量名分开,优化了代码的可读性。 刚刚我们只是声明了一个数组a,但是并没有将a初始化为一个真正的数组,我们应该使用new运算符创建数组:

int[] a = new int[100];

这里我们就创建了一个可以存储100个整型的数组,这里需要注意,数组的长度没有要求是一个常量,比如: newint[n]会创建一个长度为n的数组。

数组的下标从0开始,而不是1,比如我们要访问上文数组a中的元素的话,则下标范围需要0~99之间,如果使用了范围之外的下标,就会抛出一个数组越界异常(array index out of bounds)。我们如果想要知道当前数组的长度,可以使用 array.length,比如:

//遍历数组的一种方式
for (int i = 0;i < a.length; i++) {
    System.out.println(a[i])
}

当我们在创建一个数组的时候没有为这个数组初始化值,数字数组的所有元素会初始化为0,布尔数组的元素会初始化为false,对象数组的元素则被初始化为一个特殊值null,表示这些元素还没存放任何对象。一旦我们创建了一个数组,就不能改变它的大小。

数组的遍历可以使用上节中所讲的所有循环语句来进行遍历,其中最常用的是foreach,效率最高的是常规for循环。

数组初始化

在Java中,提供了一种创建数组对象并同时赋予初始值的简化书写方式。如下所示:

int[] smallPrimes = {2, 3, 5, 7 ,11};

这里需要注意一点,如果在使用这种语句初始化一个数组的时候,不需要调用new。 甚至我们可以使用这种方式初始化一个匿名的数组:

new int[] {17, 19, 23, 29, 31, 37};

这种表示法将创建一个新数组并利用括号中提供的值进行初始化,数组的大小就是初始值的个数。使用这种方式可以在不创建新变量的情况下重新初始化一个数组。例如:

smallPrices = new int[] {17, 19, 23, 29, 31, 37};
//简写如下:
int[] anoymous = {17, 19, 23, 29, 31, 37};
smallPrices = anoymous;

在Java中,允许数组长度为0,但是这里需要注意一点,数组长度为0与null并不相同,不要将两者混淆。

数组拷贝

在Java中,允许将一个数组变量拷贝给另一个数组变量。这时,两个变量将引用同一个数组,例如:

int[] luckyNumbers = smallPrimes;
luckyNumbers[5] = 12 //这时smallPrimes[5]也是12

如果希望将一个数组中的所有值拷贝到另外一个数组中去,可以使用 Arrays类中的 copyOf方法:

int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers, luckyNumbers.length);

第2个参数是新数组的长度,如果新数组的长度大于原始数组的长度,根据原始数组的数据类型初始化为对应的初始值,如果新数组的长度小于原数组的长度,则会只拷贝最前面的数据元素。

命令行参数

如果我们细心观察会发现,每一个Java程序都有一个带有String args[]参数的main方法,这个参数表示main方法将会接受一个字符串数组,也就是命令行参数。比如:

public class Message {

    public static void main(String[] args) {
        if (args.length == 0 || args[0].equals("-h")) {
            System.out.println("Hello,");
        } else if (args[0].equals("-g")){
            System.out.println("GoodBye,");
        }

        for (int i = 1; i < args.length; i++) {
            System.out.println(" " + args[i]);
        }

        System.out.println("!");
    }
}

如果我们在当前目录命令行分别输入 javaMessage-gVi-YoungSpacejavaMessage-hVi-YoungSpace会分别输出以下结果:

GoodBye,
 Vi-Young
 Space
!

Hello,
 Vi-Young
 Space
!

数组排序

要是想对数值型数组进行排序,我们可以使用Arrays类中的 sort方法

int[] a = new int[10000];
...
Arrays.sort(a);

这个方法使用了优化的快速排序算法。快速排序算法对于大多数数据集合来说都是效率比较高的。

Arrays-Api

方法名

返回值

描述

toString(T[]a)

String

返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号分隔

copyOf(T[]a,intlength)

T[]

返回a类型相同的一个数组,参数length为拷贝的数组长度

copyOfRange(T[]a,intstart,intend)

T[]

返回与a类型相同的一个数组,数组从下标为start处开始拷贝,到end处(不包括end)截止

sort(T[]a)

void

采用优化的快速排序算法对数组进行排序

binarySearch(T[]a,T v)

int

采用二分查找法在a中寻找值v,如果查找成功,则返回相应的下标值,否则,返回一个负数值r。-r-1是为保持a有序v应插入的位置

binarySearch(T[]a,intstart,intend,T v)

int

采用二分查找法在a的start(包括)和end(不包括)之间寻找值v,如果查找成功,则返回相应的下标值,否则,返回一个负数值r。-r-1是为保持a有序v应插入的位置

fill(T a,T v)

void

将数组的所有数据元素值设置为v

equals(T a,T b)

boolean

如果两个数组大小相同,且下标相同的元素都对应相等,返回true


下节预告

本文分享自微信公众号 - Vi的技术博客(viyoungblog)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券