Java 数组详解 - 用法/遍历/排序/实用API
## 概述
数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式,这些按序排列的同类数据元素的集合称为数组。
组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。
## 一维数组
### 动态初始化
```java
int[] array = new int[3];
// 两种方式都可以
// int array[] = new int[3];
array[0] = 1;
array[1] = 2;
array[2] = 3;
System.out.println(array[0]);
```
### 静态初始化
```java
int[] array = { 1, 2, 3, 4 };
int[] array1 = new int[] { 1, 2, 3, 4 };
System.out.println(array[2]);
System.out.println(array1[2]);
```
### 默认初始化
```java
int[] array = new int[4];
System.out.println(array[2]);
```
### 获取数组的长度
```java
int[] array = new int[10];
int length = array.length;
System.out.println("数组array的长度是:" + length);
```
## 二维数组
### 二维数组初始化
同一维数组一样,共有4总不同形式的定义方法:
```java
int[][] array1 = new int[10][10];
int array2[][] = new int[10][10];
int array3[][] = { { 1, 1, 1 }, { 2, 2, 2 } };
int array4[][] = new int[][] { { 1, 1, 1 }, { 2, 2, 2 } };
```
### 不定长二维数组
```java
int[][] array = new int[3][];
array[0] = new int[1];
array[1] = new int[2];
array[2] = new int[3];
```
### 获取二维数组的长度
```java
int length1 = array.length;
int length2 = array[0].length;
// 获取二维数组的第一维长度(3)
System.out.println(length1);
// 获取二维数组的第一维的第一个数组长度(1)
System.out.println(length2);
```
## 数组遍历
### 传统方式遍历
```java
int[] array = new int[] { 1, 2, 3 };
for (int i = 0; i < array.length; i++) {
System.out.println("array[" + i + "] = " + array[i]);
}
```
### 增强for循环方式遍历
```java
int[] array = new int[] { 1, 2, 3 };
for (int i : array) {
System.out.println(i);
}
```
## 数组排序
```java
int[] array = { 3, 2, 1, 4, 5 };
Arrays.sort(array);
System.out.println(Arrays.toString(array));
```
常用的排序方法有冒泡排序、快速排序、选择排序、插入排序、希尔(Shell)排序、堆排序。可参考[Java 数组排序](http://baike.xsoftlab.net/view/79.html)
## 数组异常
### 数组下标越界异常
在java中,数组下标从0开始,我们定义了一个长度为3的数组,想要从中取出第四位,便会抛出java.lang.ArrayIndexOutOfBoundsException。
```java
int[] array = new int[] { 1, 2, 3 };
System.out.println(array[3]);
```
## 实用API
### 输出数组
```java
int[] array = { 1, 2, 3 };
System.out.println(Arrays.toString(array));
```
### 数组转List
```java
String[] array = { "a", "b", "c", "d", "e" };
List list = new ArrayList(Arrays.asList(array));
System.out.println(list);
```
### 数组转Set
```java
String[] array = { "a", "b", "c", "d", "e" };
Set set = new HashSet(Arrays.asList(array));
System.out.println(set);
```
### List转数组
```java
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
String[] array = new String[list.size()];
list.toArray(array);
for (String s : array)
System.out.println(s);
```
### 数组中是否包含某个值
```java
String[] array = { "a", "b", "c", "d", "e" };
boolean b = Arrays.asList(array).contains("a");
System.out.println(b);
```
###
### 数组复制
```java
int array[] = new int[] { 1, 2, 3, 4 };
int array1[] = new int[array.length];
System.arraycopy(array, 0, array1, 0, array.length);
```
### 数组合并
```java
int[] array1 = { 1, 2, 3, 4, 5 };
int[] array2 = { 6, 7, 8, 9, 10 };
int[] array = org.apache.commons.lang.ArrayUtils.addAll(array1, array2);
System.out.println(Arrays.toString(array));
```
### String数组转字符串(使用指定字符拼接)
```java
String[] array = { "a", "b", "c" };
String str = org.apache.commons.lang.StringUtils.join(array, ", ");
System.out.println(str);
```
### 数组逆序
```java
int[] array = { 1, 2, 3, 4, 5 };
org.apache.commons.lang.ArrayUtils.reverse(array);
System.out.println(Arrays.toString(array));
```
### 数组元素移除
```java
int[] array = { 1, 2, 3, 4, 5 };
int[] removed = org.apache.commons.lang.ArrayUtils.removeElement(array, 3);
System.out.println(Arrays.toString(removed));
```