Java官方教程(二-3)数组 Arrays(2020.12.16)

前言

本文是橙子出于兴趣爱好对Java官方教程的尝试翻译,几乎每日更新,感兴趣的朋友可以关注一下橙子;翻译过程中尽可能多的对一些关键词保留了英文原文,如果你想看最纯正的英文原版教材却又看不懂,可以试着来看一下橙子的翻译版啊,欢迎大家留言讨论,冲鸭!
更多相关文章点击阅读
Java官方教程目录2020最新版

语言基础

数组 Arrays

数组 Arrays

An array 是一个包含固定数量的单一类型(single type)的容器对象(container object)。创建array时将确定array的长度。创建后,其长度是固定的。在“Hello World” application的main方法中,你已经看到了数组的示例,本节将讨论数组的更多细节。
在这里插入图片描述
Array中的每一个item都叫做element。每一个element都可以通过数字索引(numerical index)进行访问。如上图所示,编号从0开始,例如,第9个元素将在index 8处访问。

下面的program,ArrayDemo,创建了一个整形数组,在数组中存了一些值,并将每个值打印到标准输出。

class ArrayDemo {
    public static void main(String[] args) {
        // declares an array of integers
        int[] anArray;

        // allocates memory for 10 integers
        anArray = new int[10];
           
        // initialize first element
        anArray[0] = 100;
        // initialize second element
        anArray[1] = 200;
        // and so forth
        anArray[2] = 300;
        anArray[3] = 400;
        anArray[4] = 500;
        anArray[5] = 600;
        anArray[6] = 700;
        anArray[7] = 800;
        anArray[8] = 900;
        anArray[9] = 1000;

        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]);
        System.out.println("Element at index 4: "
                           + anArray[4]);
        System.out.println("Element at index 5: "
                           + anArray[5]);
        System.out.println("Element at index 6: "
                           + anArray[6]);
        System.out.println("Element at index 7: "
                           + anArray[7]);
        System.out.println("Element at index 8: "
                           + anArray[8]);
        System.out.println("Element at index 9: "
                           + anArray[9]);
    }
} 

program的输出为:

Element at index 0: 100
Element at index 1: 200
Element at index 2: 300
Element at index 3: 400
Element at index 4: 500
Element at index 5: 600
Element at index 6: 700
Element at index 7: 800
Element at index 8: 900
Element at index 9: 1000

在实际编程中,你可能会使用一个循环结构来遍历(iterate through)数组中的每个元素。而不是像示例中单独编写每一行。但该示例清晰的说明了array的语法,你将学习各种循环控制结构 (for, while, and do-while) 在Control Flow 章节。

声明变量去引用数组 Declaring a Variable to Refer to an Array

上面的示例中用以下代码declares 一个名为anArray的array:

// declares an array of integers
int[] anArray;

像声明其它类型的变量一样,declaration 一个 array也有两个部分:the array’s type and the array’s name 。The array的type写作type[ ],其中type是所包含element的类型。方括号[ ]是特殊符号,指示该variable包含一个array。数组的大小不是其类型的一部分,这也是方括号[ ]为空的原因。数组的名称可以是遵循命名规约的任何名称。与其它类型的variable一样,declaration实际上并没有创建一个array;它只是告诉编译器该variable将特定类型的array。

同样,你也可以declare其它type的数组:

byte[] anArrayOfBytes;
short[] anArrayOfShorts;
long[] anArrayOfLongs;
float[] anArrayOfFloats;
double[] anArrayOfDoubles;
boolean[] anArrayOfBooleans;
char[] anArrayOfChars;
String[] anArrayOfStrings;

你也能把方括号[ ]放在array名称后面:

// this form is discouraged
float anArrayOfFloats[];

然而,规约不建议这样做。方括号[ ]标识array type,应该与类型名称(type designation)一起出现。

创建,初始化和访问数组 Creating, Initializing, and Accessing an Array

创建array的方法之一是使用new运算符。ArrayDemo program的下一条语句为一个有10个整形element的array分配(allocate)足够的内存空间,并将该array分配(assign)给anArray variable。

// create an array of integers
anArray = new int[10];

如果缺少此语句(statement),编译器会打印如下错误,并且编译失败:

ArrayDemo.java:4: Variable anArray may not have been initialized.

接下来的几行语句为数组中的每一个element赋值:

anArray[0] = 100; // initialize first element
anArray[1] = 200; // initialize second element
anArray[2] = 300; // and so forth

每一个数组element均通过它的numerical index进行访问:

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]);

或者,你也可以使用快捷语法来create and initialize一个数组:

int[] anArray = { 
    100, 200, 300,
    400, 500, 600, 
    700, 800, 900, 1000
};

这里数组的length由括号之间用逗号分隔的值的数量决定。

你还可以使用两组或多组括号来declare一个array(多维数组),例如,String[][] names.因此每个element必须通多对应数量的index value来访问。

在Java语言中,多维数组是一个成分本身为数组的array。这与C或者Fortran的数组不同。这样做的结果是,允许行的长度发生变化,如下面的MultiDimArrayDemo program所示:

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);

复制数组 Copying Arrays

The System class有一个arraycopy方法,可以有效的将data从一个数组复制到另一个数组。

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

两个object参数(arguments)要指定源数组和目标数组。三个int argument指定源数组中的起始位置,目标数组中的起始位置和要复制element的数量。

下面的ArrayCopyDemo程序declare一个char元素数组,拼写单词 “decaffeinated” 。它用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

数组操作方法 Array Manipulations

Arrays是一个强大而有用的概念。Java SE提供了一些方法去执行一些数组中最常见的操作。例如,ArrayCopyDemo的例子使用了System class中的arraycopy方法,而不是手动遍原源数组中的每个element然后放入目标数组。这是在后天执行的,从而使开发人员仅需一行代码来调用方法。

为了方便起见,Java SE在java.util.Arrays class中提供了一系列的方法去操作数组,比如常见的复制,排序,搜索数组等。例如,之前的例子可以改为用copyOfRange方法,如ArrayCopyOfDemo示例。区别在于使用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));
    }
}

虽然使用了更少的代码,但这两个程序的输出是相同的(caffein)。需要注意的是,copyOfRange方法的第二个参数是要复制范围的初始索引,第三个参数是要复制范围的最终索引。在此示例中,要复制的范围不包含index 9(a)处的数组元素。

java.util.Arrays类中提供的一些常用操作如下:

  • 在数组中搜索特定值并获取该值的索引(the binarySearch method)
  • 比较两个数组是否相等(the equals method)
  • 为数组中的每个索引分配指定值(the fill method)
  • 将数组以升序排序(the sort method or parallelSort method)

年轻人不要不讲武德,进来了点个赞再走啊!

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值