Java基础教程(6)--数组

摘要:数组是一个可以存放固定数量的同一类型的值的容器对象。创建数组时,必须确定数组的长度。在《回顾HelloWorld》一文中,我们已经看到了一个使用数组的例子。本节将会更加详细地讨论数组。

1.基本概念

  数组中的每一项称为元素,每个元素都通过数字索引(也可以称为下标)访问,编号从0开始。例如,第4个元素的索引为3。下面的程序创建了一个int类型的数组,把一些值放入数组中并将每个值打印出来:

class ArrayDemo {
    public static void main(String[] args) {
        // 声明数组
        int[] anArray;
        // 指定数组的空间
        anArray = new int[10];   
        // 初始化每个元素
        anArray[0] = 100;
        anArray[1] = 200;
        anArray[2] = 300;
        anArray[3] = 400;
        // 将每个元素打印出来
        System.out.println("Element at index 0: " + anArray[0]);
        System.out.println("Element at index 1: " + anArray[1]);
        System.out.println("Element at index 2: " + anArray[2]);
        System.out.println("Element at index 3: " + anArray[3]);
    }
} 

  该程序的输出是:

Element at index 0: 100
Element at index 1: 200
Element at index 2: 300
Element at index 3: 400

  在实际编程时,可能会使用循环结构来遍历数组的每个元素,而不是像上面的示例中那样单独处理每个元素。但是,该示例清楚地说明了数组的语法。在后续教程中将会介绍各种循环结构(for,while,和do-while)。

2.声明一个引用数组的变量

  前面的程序使用以下代码声明了一个名为anArray的数组:

int[] anArray;

  与声明其他类型的变量一样,数组变量的声明也有两个部分:数组的类型和数组的名称。数组的类型写为type[],type表示元素的数据类型,方括号表示这是一个数组变量。与其他类型的变量一样,声明一个数组变量实际上并没有创建数组,它只是告诉编译器这个变量可以引用一个指定类型的数组。还可以像其他语言那样将方括号放在名称后面,例如int anArray[],但在Java中并不推荐这种写法。

3.创建、初始化和访问数组

  一种创建数组的方法是使用new操作符。下面的语句创建了一个长度为10的整数数组,并将这个数组的引用赋值给了anArray:

anArray = new int[4];

  下面的语句为数组中的每个元素赋值:

anArray[0] = 100;
anArray[1] = 200;
anArray[2] = 300;
anArray[3] = 400;

  每个元素都可以通过数字索引进行访问:

System.out.println("Element 1 at index 0: " + anArray[0]);
System.out.println("Element 2 at index 1: " + anArray[1]);
System.out.println("Element 3 at index 2: " + anArray[2]);

  也可以通过以下语法创建并初始化一个数组:

int[] anArray = { 100, 200, 300, 400 };

  这里数组的长度由大括号内元素的数量决定,每个元素使用逗号分隔。
  还可以使用两对或更多对方括号声明数组(也称为多维数组),例如String[][] names。在多维数组中,数组的每一个元素都是数组。这与C或C++中的数组不同。这样做的结果是允许每个数组的长度不同,例如下面的MultiDimArrayDemo程序:

class MultiDimArrayDemo {
    public static void main(String[] args) {
        String[][] names = {
            {"Mr. ", "Mrs. ", "Ms. "},
            {"Smith", "Jones"}
        };
        // Mr. Smith
        System.out.println(names[0][0] + names[1][0]);
        // Ms. Jones
        System.out.println(names[0][2] + names[1][1]);
    }
}

  这个程序的输出是:

Mr. Smith
Ms. Jones

  可以使用数组的length属性来获取数组的大小。以下代码将数组的大小打印到控制台:

System.out.println(anArray.length);

4.拷贝数组

  有时候需要将数组拷贝一份,这样在操作一个数组时并不会影响另外一个数组。下面的代码并不能完成数组的拷贝:

anotherArray = anArray;

  因为这样知识将anArray对数组的引用赋值给了anotherArray,此时的anotherArray和anArray引用了同一个数组,在任何一个变量上执行对数组的操作都会影响到数组。System类有一个arraycopy方法,使用它可将数据从一个数组复制到另一个数组:

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

  两个Object参数指定源数组和目标数组,三个int参数指定源数组中的起始位置,目标数组中的起始位置以及要复制的元素的数量。下面的声明了一个char数组,它使用System.arraycopy方法将源数组的子序列复制到目标数组中:

class ArrayCopyDemo {
    public static void main(String[] args) {
        char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e', 'i', 'n', 'a', 't', 'e', 'd' };
        char[] copyTo = new char[7];
        System.arraycopy(copyFrom, 2, copyTo, 0, 7);
        System.out.println(new String(copyTo));
    }
}

  这个程序的输出是:

caffein

  Arrays类(位于java.util包中)也提供了copyOfRange方法来拷贝数组。不同之处在于,使用该方法不需要在调用方法之前创建目标数组,因为这个方法会返回一个数组:

class ArrayCopyOfDemo {
    public static void main(String[] args) {
        
        char[] copyFrom = {'d', 'e', 'c', 'a', 'f', 'f', 'e', 'i', 'n', 'a', 't', 'e', 'd'};  
        char[] copyTo = java.util.Arrays.copyOfRange(copyFrom, 2, 9);
        System.out.println(new String(copyTo));
    }
}

  这个方法的三个参数分别表示源数组,要复制元素的起始位置(包含)和结束位置(不包含)。
  java.util.Arrays类中提供的一些其他有用的方法是:

  • binarySearch方法:在数组中搜索特定值并获取其索引。
  • equals方法:比较两个数组以确定它们是否相等。
  • fill方法:使用指定值填充数组。
  • sort方法:按升序对数组进行排序。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容

  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,201评论 1 44
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,151评论 0 13
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,107评论 1 32
  • 风中的纸屑 周国平 有人说“有钱可以买时间。”这话当然不错。但是,如果大前提是“时间就是金钱",买得的时间又追加为...
    奇葩兽阅读 652评论 2 0
  • 山水遥迢,岁月沉香。 谁的人生不是一场单程的出发!是晴是雨是颠簸是坦荡,且从容走过,细细研磨静静品味这一朝一夕有限...
    秋凝浅浅_阅读 375评论 2 4