前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础系列(五):数组

Java基础系列(五):数组

作者头像
山禾说
发布2019-01-21 10:00:23
7110
发布2019-01-21 10:00:23
举报
文章被收录于专栏:Vi的技术博客Vi的技术博客
简介

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

创建一个数组的方法

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

代码语言:javascript
复制
int[] a;
int a[];

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

代码语言:javascript
复制
int[] a = new int[100];

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

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

代码语言:javascript
复制
//遍历数组的一种方式
for (int i = 0;i < a.length; i++) {
    System.out.println(a[i])
}

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

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

数组初始化

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

代码语言:javascript
复制
int[] smallPrimes = {2, 3, 5, 7 ,11};

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

代码语言:javascript
复制
new int[] {17, 19, 23, 29, 31, 37};

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

代码语言:javascript
复制
smallPrices = new int[] {17, 19, 23, 29, 31, 37};
//简写如下:
int[] anoymous = {17, 19, 23, 29, 31, 37};
smallPrices = anoymous;

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

数组拷贝

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

代码语言:javascript
复制
int[] luckyNumbers = smallPrimes;
luckyNumbers[5] = 12 //这时smallPrimes[5]也是12

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

代码语言:javascript
复制
int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers, luckyNumbers.length);

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

命令行参数

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

代码语言:javascript
复制
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会分别输出以下结果:

代码语言:javascript
复制
GoodBye,
 Vi-Young
 Space
!

Hello,
 Vi-Young
 Space
!
数组排序

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

代码语言:javascript
复制
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


下节预告

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Vi的技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 创建一个数组的方法
  • 数组初始化
  • 数组拷贝
  • 命令行参数
  • 数组排序
  • Arrays-Api
  • 下节预告
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档