Java中的数组

数组

数组是一种数据结构, 用来存储同一类型值的集合。通过一个整型下标来访问数组中 的每一个值。 例如, 如果 a 是一个整型数组, a[i] 就是数组中下标为 i 的整数。
那我们如何声明一个数组变量呢?
在声明数组变量时, 需要指出数组类型 (数据元素类型紧跟 [ ] ) 和数组变量的名字。 例如:int [ ]a;声明了整形数组a。但是这个语句只是声名了变量a,并没有将a初始化为一个真正的数组。所以我们使用 new 运算符创建数组。例如:int[] = new int[20];这条语句创建了一个可以存储20个整数的数组。数组长度不要求是常量:new int [n]会创建一个长度为n的数组。

- for each 循环

Java 有一种功能很强的循环结构, 可以用来依次处理数组中的每个元素 (其他类型的元 素集合亦可)而不必为指定下标值而分心。
这种增强的 for 循环的语句格式为:
for (variable : collection) statement
定义一个变量用于暂存集合中的每一个元素, 并执行相应的语句(当然, 也可以是语句块)。 collection 这一集合表达式必须是一个数组或者是一个实现了 Iterable 接口的类对象(例如ArrayList) 。
例如:

for (int element : a)
System.out.println(element) :

打印数组 a 的每一个元素, 一个元素占一行。
这个循环应该读作 循环 a 中的每一个元素 (for each element in a )。 Java 语言的设计者认为应该使用诸如 for each、 in 这样的关键字, 但这种循环语句并不是最初就包含在 Java 语言中的, 而是后来添加进去的, 并且没有人打算废除已经包含同名 (例如 System.in) 方法或变量的旧代码。
当然, 使用传统的 for 循环也可以获得同样的效果:

for (int i = 0; i < a.length; i++)
System,out.println(a[i]);

但是, for each 循环语句显得更加简洁、 更不易出错(不必为下标的起始值和终止值而操心 。)
需要注意的是:foreach 循环语句的循环变量将会遍历数组中的每个元素, 而不需要使用下标值。然而,在很多场合下, 还是需要使用传统的 for 循环遍历集合中的每个元素, 或者在循环内部需要使用下标值等。

数组初始化以及匿名数组

在 Java 中, 提供了一种创建数组对象并同时赋予初始值的简化书写形式。 下面是一 例子:

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

请注意, 在使用这种语句时, 不需要调用 new。 甚至还可以初始化一个匿名的数组:

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

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

small Primes = new int[ ] { 17, 19, 23, 29, 31, 37 }

这是下列语句的简写形式:

int[ ] anonymous = { 17, 19, 23, 29, 31, 37 };
smallPrimes = anonymous;

在 Java 中, 允许数组长度为 0。 在编写一个结果为数组的方法时, 如果碰巧结果为空, 则这种语法形式就显得非常有用。 此时可以创建一个长度为 0 的数组: new elementType[0],需要注意的是数组长度为 0 与 null 不同。
ps:(数组初始化)
动态初始化:int [] array = new int []{1,2,3,4};
静态初始化:int [] array2={1,2,3,4};
定义数组: int [] array3=new int [10]; 默认值为0

数组拷贝

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

intQ luckyNumbers = smallPrimes;
1uckyNumbers[S] = 12; // now smallPrimes[5] is also 12

图 3. 14 显示了拷贝的结果。图3.14

如果希望将一个数组的所有值拷贝到一个新的数组中去, 就要使用 Arrays 类的 copyOf 方法:

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

第 2 个参数是新数组的长度。 这个方法通常用来增加数组的大小:

luckyNumbers = Arrays.copyOf(luckyNumbers, 2 * luckyNumbers.length);

如果数组元素是数值型, 那么多余的元素将被赋值为 0 ;
如果数组元素是布尔型, 则将赋值 为 false。 相反, 如果长度小于原始数组的长度, 则只拷贝最前面的数据元素。
Java 数组与 C++ 数组在堆栈上有很大不同, 但基本上与分配在堆(heap) 上 的数组指针一样。 也就是说,

intD a = new int[100]; // Java

不同于

int a[100]; // C++

而等同于

int* a = new int[100]; // C++

Java 中的 [ ] 运算符被预定义为检查数组边界, 而且没有指针运算, 即不能通过 a 加1得到数组的下一个元素。

命令行参数

每一个 Java 应用程序都有一个带 String arg[]参数的 main 方法。 这个参数表明 main 方法将接收一个字符串数组, 也就是命令行参数。
例如:

public class Message{
public static void main(String[] args){
if (args.length = 0||args[0].equals(" -h"))
System.out .printCHello,"); 
else if (args[0].equa1s("-g"))
System.out.print ("Goodbye,");
// print the other command-line arguments for (int i = 1; i < args.length; i++)
System.out.print(" " + args[i]);
System out.println("!"); 
   }
}

如果使用下面这种形式运行这个程序: java Message -g cruel world
args 数组将包含下列内容:
args[0]:"-g"
args[l] "cruel "
args[2] “world”
这个程序将显示下列信息 : Goodbye, cruel world!
在 Java 应用程序的 main 方法中, 程序名并没有存储在 args 数组中 .例如 :
当使用下列命令运行程序时 java Message -h world
args[0]是“ -h”,而不是“ Message”或“ java”。
数组排序
要想对数值型数组进行排序, 可以使用冒泡排序法: 给定一个数组, 让数组升序 (降序) 排序.
算法思路:
每次尝试找到当前待排序区间中最小(或最大)的元素, 放到数组最前面(或最后面).
代码示例

public static void main(String[] args) {
 int[] arr = {9, 5, 2, 7};
 bubbleSort(arr);
 System.out.println(Arrays.toString(arr));
}
public static void bubbleSort(int[] arr) {
 // [0, bound) 构成了一个前闭后开区间, 表示已排序区间
 // [bound, length) 构成了一个前闭后开区间, 表示待排序区间
 // 每循环一次, 就找到一个合适大小的元素, 已排序区间就增大1.
 for (int bound = 0; bound < arr.length; bound++) {
 for (int cur = arr.length - 1; cur > bound; cur--) {
 if (arr[cur - 1] > arr[cur]) {
 int tmp = arr[cur - 1];
 arr[cur - 1] = arr[cur];
 arr[cur] = tmp;
 }
 }
 } // end for
} // end bubbleSort
// 执行结果
[2, 5, 7, 9] 

或者 Arrays 类中的 sort 方法:
int[] a = new int[10000];

Arrays.sort (a)
这个方法使用了优化的快速排序算法。快速排序算法对于大多数数据集合来说都是效率比较高的,而冒泡排序性能较低。

多维数组*
多维数组将使用多个下标访问数组元素,它适用于表示表格或者更加复杂的排列方式。
这里以二维数组(也成为矩阵)为例来进行声明。
基本语法: 数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };
而同一维数组一样,在调用new对多维数组进行初始化之前不能使用它。另外,如果知道数组元素,就可以不调用new,而直接使用简化的书写形式对多维数组进行初始化。一旦数组被初始化,就可以利用两个方括号访问每个元素。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值