数组Arrays
一个array数组是可以持有固定数量单一数据类型的容器对象。数组的长度在数组创建的时候确定的,创建以后数组的长度就是固定不变的。在之前的“HelloWorld”项目中的main
方法中,你已经见过简单的数组示例,本章节将更加详细的讨论数组。
包含10个元素的数组。An array of 10 elements.
数组中的每一个项目叫做一个element元素,每一个愿元素都可以通过的数字index索引类访问。就像上面的插图展示的一样,数字索引从0开始。第9个元素将通过索引8来访问。下面的程序中,ArrayDemo,创建了一个整数数组,在数组里放入了一些值,然后在标准输出中打印了每一个值。
|
|
程序的输出如下:
|
|
实际情况下,在上面的例子中,你可以使用一种数组支持的loop constructs循环结构来迭代数组的每一个元素,而不是一行一行的写。不过,这个例子清晰的说明了数组的语法。你将会在控制流程章节学到不同种类的循环结构(for
,while
以及do-while
).
声明一个引用数组的变量
之前的程序通过下面这一行代码声明了一个名为anArray
的数组:
|
|
就像声明其它类型的变量一样,声明数组包括两部分,数组类型和数组名称。数组类型写作*type*[]
其中*type*
是数组内元素的数据类型,方括号是一个特殊符号表明该变量持有一个数组。数组的长度并不是类型的一部分(因此方括号是空的).数组可以任意命名,只要你遵循命名章节中介绍的规则和约定。就像其他类型变量一样,声明的时候并没有创建一个数组,只是告诉编译器该变量将持有包含 特定类型数据的数组。
同样,你也可以声明其他数据类型的数组:
|
|
也可以把方括号置于数组名称之后:
|
|
不过一般情况下不推荐这么做,方括号标明了变量类型为数组,应该与指定类型一起出现。
创建,初始化,访问数组
创建数组的一种方法是适用new
操作符。接下来的代码展示了为数组分配了可以容纳10个integer元素的存储空间,并将这个数组指向anArray
变量。
|
|
如果确实本行的话,编译器会打印出如下的错误,并且编译失败:
|
|
下面几行代码为数组中的各个元素赋值:
|
|
每一个数组元素可以通过的数字索引来访问:
|
|
同样,你也可以适用以下语法直接创建和初始化一个数组:
|
|
这里,数组的长度由数组花括号中由逗号分隔的值的数量决定。你同样可以通过使用两组或者更多的方括号定义数组的数组(或者叫多维数组),例如String[][] names
.这样的话,每一个元素必须通过级联的数字索引值来访问。
在Java编程语言中,一个多维数组的组成部分仍然是数组,有别于C或者Fortran,这样做的其中一个结果就是允许每一行数据可以有不同 的长度,下面代码中将展示:
|
|
程序的输出如下:
|
|
最后,你可以使用数组内置的属性length
来判定任何数组的尺寸/长度。下面代码将输出数组的长度。
|
|
数组的复制
System
类有一个高性能的arraycopy
方法,你可以使用该方法高效得将数据由一个数组复制到另一个。
|
|
两个Object
参数分别是要考培的源数组和目标数组。三个int
参数分别是源数组的其实位置,目标数组的起始位置和将要复制的元素个数。
接下来的程序,声明了一个char
字符数组,单词”decaffeinated”的拼写。然后使用System.arraycopy
方法将数组内容的部分序列复制到第二个数组:
|
|
程序的输出如下:
|
|
数组的操作
数组是编程中非常强大和使用的概念。Java SE 提供了诸多方法来满足与数组相关的最常用操作。以上例子中,使用System
类的arraycopy
方法替代了手动迭代原数组的元素然后将每一个元素置于目标数组。开发者只用一行代码调用该方法就可以在后台完成复制的操作。
为了你的便利,Java SE 在java.util.Arrays
类中提供了许多方法来满足数组的操作(常见工作,诸如复制,排序,搜索数组)。
之前的例子也可以修改为使用java.util.Arrays
类中的copyOfRange
方法,下面例子由展示,使用该方法的不同之处在于,你可以不必在调用方法之前就创建目标数组,因为目标数组将由该方法创建和返回:
|
|
程序的输出同样是caffein
,尽管这样做需要更少的代码。注意,caopyOfRange
方法的第二个参数是要复制的范围的起始索引,包含该索引,同时第三个参数是要复制范围的结束索引,不包含该索引。在本例中,复制的范围不包含在索引9位置的元素(即字符a
).
java.util.Arrays
类还提供了其他有用的方法,如下:
- 搜索一个特定的值在数组中的位置下标.(方法
binarySearch
) - 比较两个数组以判定两个数组是否相等(方法
equal
) - 填充数组,为数组的每一个位置放置一个特定的值(方法
fill
) - 按照升序排序数组。可以使用
sort
方法进行循序排序,或者使用Java SE8引进的parallelSort
进行并发的排序。在多处理器系统中使用平行排序较大的数组比循序的排序要快得多。