---
url: /doc/Java/9nbwy9bg/index.md
---
# 5 数组、排序和查找

> 数组：可以存放多个同一类型的数据。数组也是一种数据，是引用类型。
>
> 即：数组就是一组数据。

## 5.1 一维数组

> 数组可以是多个相同类型数据的组合，实现对这些数据的统一管理。
>
> 数组中的元素可以是任何数据类型。包括基本类型和引用类型。
>
> 数组的下标从 0 开始。且必须在指定范围内使用，否则报错。
>
> 数组属于 引用类型，数组型数据是 对象（Object）
>
> 数组创建后，如果没有赋值，有默认值：int（0），short（0），byte（0），long（0L），float（0.0F），double（0.0），char（\u0000），boolean（false），String（null），Object（null）

**数组的构造方法：**

使用数组的步骤：1.声明数组并开辟空间 2.给数组各个元素赋值 3.使用数组

* 构造方式 1：动态初始化

  ```
  int[] ints = new int[5];				// 创建了数组 name，存放5个int
  int ints2[] = new int[1];				// 这种写法也行
  ints[2] = 15;							// 访问数组第3个数JAVA
  ```

* 构造方式 2：动态初始化

  ```
  char[] chars;							// 先声明数组 name，此时数组是 null
  chars = new char[2];					// 分配内存空间，可以存放数据了
  chars[1] = '\t';JAVA
  ```

* 构造方式 3：静态初始化

  ```
  boolean[] bools = {true, false, true, false};
  String[] strs = new String[]{"阿伟，你又在打电动噢", "烦啦"};JAVA
  ```

  确切知道数组每个元素的场合可以用这个方法。

**数组的使用方法：**

* 访问数组元素：`数组名[元素下标]`

  其中，元素下标从 0 开始编号。如：访问 strs 数组的第一个元素 `strs[0]`

* 数组长度：`数组名.length`

  是一个 int 值。不能通过试图改变该值来改变数组容量

### 5.1.1 数组赋值机制

1. 基本数据类型赋值，赋值方式是值拷贝。这个值就是具体的数据，且互不影响

2. 数组在默认情况下是引用传递，赋的值是地址，赋值方式为引用传达。

   ```
   int[] array1 = {0, 0, 0};
   int[] array2 = array1;
   array2[0] = 100;JAVA
   ```

   上述情况下，`array1[0]` 也会变成 `100`。因为数组在 JVM 的 栈 里是一个地址，指向 堆 里的一个空间。这两个数组在上述情况下指向同一空间。

   ```
   int[] array1 = {0, 0, 0};
   int[] array2 = new int[array1.length];
   for (int i = 0;i < array1.length;i++) {
       array2[i] = array1[i];
   }JAVA
   ```

   上述方式拷贝后，两数组相互独立。

### 5.1.2 数组的扩容

当数组达到上限时，创建一个容量更大的新数组。将旧数组的元素依次放入，之后替换旧数组。

以下是一个扩容方法：

```
import java.util.Scanner;
public class Code5_1_3{

	public static void main(String[] args){

		Scanner inP = new Scanner(System.in);
		int[] arr1 = {1, 2, 3};		// 这是原数组
		int add = 0;				// 这个变量记录输入的新元素的值
		int count = arr1.length;	// 这个变量是新数组的长度
		char yN = 'a';				// 记录询问继续与否时用户的输入字符

		do{
       	/* 创建多一位的新数组，把新元素赋给新数组的最后一位 */
				System.out.println("请输入添加数字：");
				add = inP.nextInt();
				int[] tem = new int[arr1.length + 1];
				tem[count] = add;

       	/* 把旧数组的值全部赋给新数组 */
				for(int i = 0; i < arr1.length; i++){
					tem[i] = arr1[i];
				}

       	/* 把新数组保存下来，输出现在的数组 */
				arr1 = tem;
				count++;
				System.out.println("\n\n当前数组为：");

				for(int i = 0; i < arr1.length; i++){
					System.out.print(arr1[i] + " ");
				}

       	/* 询问是否继续添加，输入n跳出，否则循环 */
				System.out.println("\n\n是否继续添加？（Y/N）");
				yN = inP.next().charAt(0);

		}while(yN != 'N' && yN != 'n');

	}
}JAVA
```

## 5.2 二维数组

```
int[][] ints;					// 声明一个二维数组
int[] ints2[];					// 也能这样声明
int ints3[][];					// 这样也行
int[] x,y[];					// 声明了两个数组，一个是 int[] x 一个是 int[][] y
								// 把 int[] 视作一个类型，就能很好地理解这个写法JAVA
```

二维数组实际是由多个一维数组组成的，它的各个元素的长度可以相同，也可以不同。

数组是一个对象，所以二维数组的元素存放的是一维数组的地址。

**二维数组构造方法：**

* 构造方法 1：动态初始化

  ```
  int[][] many_ints = new int[3][4]	// 创建 有3个 包含4个元素的一维数组 的二维数组
  JAVA
  ```

* 构造方法 2：动态初始化

  ```
  double[][] many_doubles;			// 先声明变量
  many_doubles = new double[3][4];	// 再开辟空间JAVA
  ```

* 构造方法 3：动态初始化-列数不确定

  ```
  char[][] many_chars = new char[3][];	// 创建一个三行列数不确定的二维数组
  for (int i = 0; i < 3; i++) {
      many_chars[i] = new char[i + 1];	// 此时，每个数组空间依次增大
  }JAVA
  ```

* 构造方法 4：静态初始化

  ```
  int[][] many_many = {{1, 3}, {4, 10, 2}, {95}};
  JAVA
  ```

**二维数组使用方法：**

* `ints.length`：该二维数组的长度，这里是 3
* `ints[0]`：该二维数组的第一个子数组
* `ints[0].length`：该二维数组的第一个子数组的长度，这里是 4
* `ints[1][0]`：该二维数组第二个子数组的第一个元素的值，这里是 21

\~~这是一维数组：int\[] a、这是二维数组：int\[]\[] b。好了，现在来写一个堆排序吧~~
