Java数组.xmind

1.什么是数组?

1.数组的定义

数组是相同类型数据的有序集合。
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。

2.数组的声明与创建

1.数组的声明

首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:

  1. dataType[] arrayRefVar; // 首选的方法
  2. dataType arrayRefVar[]; // 效果相同,但不是首选方法

demo01

  1. double[] myList; // 首选的方法
  2. double myList[]; // 效果相同,但不是首选方法

2.数组的创建

Java语言使用new操作符来创建数组,语法如下:

  1. arrayRefVar = new dataType[arraySize];

上面的语法语句做了两件事:

  • 一、使用 dataType[arraySize] 创建了一个数组。
  • 二、把新创建的数组的引用赋值给变量 arrayRefVar。

数组变量的声明,和创建数组可以用一条语句完成,如下所示:

  1. dataType[] arrayRefVar = new dataType[arraySize];

另外,还可以使用如下的方式创建数组。

  1. dataType[] arrayRefVar = {value0, value1, ..., valuek};

数组的元素是通过索引访问的。数组索引从 0 开始,所以索引值从 0 到 arrayRefVar.length-1。

demo02

下面的语句首先声明了一个数组变量 myList,接着创建了一个包含 10 个 double 类型元素的数组,并且把它的引用赋值给 myList 变量。

  1. public class TestArray {
  2. public static void main(String[] args) {
  3. // 数组大小
  4. int size = 10;
  5. // 定义数组
  6. double[] myList = new double[size];
  7. myList[0] = 5.6;
  8. myList[1] = 4.5;
  9. myList[2] = 3.3;
  10. myList[3] = 13.2;
  11. myList[4] = 4.0;
  12. myList[5] = 34.33;
  13. myList[6] = 34.0;
  14. myList[7] = 45.45;
  15. myList[8] = 99.993;
  16. myList[9] = 11123;
  17. // 计算所有元素的总和
  18. double total = 0;
  19. for (int i = 0; i < size; i++) {
  20. total += myList[i];
  21. }
  22. System.out.println("总和为: " + total);
  23. }
  24. }

以上实例输出结果为:

  1. 总和为: 11367.373

image.png

3.数组的三种初始化

1.静态初始化

  1. int[] a={1,2,3};
  2. Man[] mans={new Man(1,1),new Man(2,2)};

2.动态初始化

  1. int[] a=new int[2];
  2. a[0]=1;
  3. a[1]=2;

3.数组的默认初始化

数组是引用类型,它的元素相当于类的实例变量,因此数组- -经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。

4.数组的内存分析

04 Java数组 - 图2

5.数组的基本特点

  1. 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
  2. 其元素必须是相同类型,不允许出现混合类型。
  3. 数组中的元素可以是任何数据类型,包括基本类型和引用类型。
  4. 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

    6.数组边界

    下标的合法区间:[0,length-1],如果越界就会报错:

    1. public static void main(String[] args){
    2. int[] a=new int[2];
    3. System.out.println(a[2]);
    4. }

    ArrayIndexOutOfBoundsException :数组下标越界异常!

    7.数组的使用

    1.For——Each循环遍历数组

    For-Each 循环或者加强型循环,它能在不使用下标的情况下遍历数组。
    语法格式如下:

    1. for(type element: array)
    2. {
    3. System.out.println(element);
    4. }

    demo

    该实例用来显示数组 myList 中的所有元素:

    1. public class TestArray {
    2. public static void main(String[] args) {
    3. double[] myList = {1.9, 2.9, 3.4, 3.5};
    4. // 打印所有数组元素
    5. for (double element: myList) {
    6. System.out.println(element);
    7. }
    8. }
    9. }

    以上实例编译运行结果如下:

    1. 1.9
    2. 2.9
    3. 3.4
    4. 3.5

    2.数组作为函数的参数

    数组可以作为参数传递给方法。
    例如,下面的例子就是一个打印 int 数组中元素的方法:

    1. public static void printArray(int[] array) {
    2. for (int i = 0; i < array.length; i++) {
    3. System.out.print(array[i] + " ");
    4. }
    5. }

    下面例子调用 printArray 方法打印出 3,1,2,6,4 和 2:

    1. printArray(new int[]{3, 1, 2, 6, 4, 2});

    3.数组作为函数的返回值

    1. public static int[] reverse(int[] list) {
    2. int[] result = new int[list.length];
    3. for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {
    4. result[j] = list[i];
    5. }
    6. return result;
    7. }

    以上实例中 result 数组作为函数的返回值。

    1.数组的输出,求和,求最大元素demo

    1. public class ArrayDemo03 {
    2. public static void main(String[] args) {
    3. int[] arrays={1,2,3,4,5};
    4. //打印全部的数组元素
    5. for (int i = 0; i <arrays.length ; i++) {
    6. System.out.println(arrays[i]);
    7. }
    8. System.out.println("===============================");
    9. //计算所有元素的和
    10. int sum=0;
    11. for (int i = 0; i <arrays.length ; i++) {
    12. sum+=arrays[i];
    13. }
    14. System.out.println("sum="+sum);
    15. System.out.println("===============================");
    16. //查找最大元素
    17. int max=arrays[0];
    18. for (int i = 0; i <arrays.length ; i++) {
    19. if (arrays[i]>max){
    20. max=arrays[i];
    21. }
    22. }
    23. System.out.println("max="+max);
    24. }
    25. }

    2.数组的反转demo

    ```java public class ArrayDemo04 { public static void main(String[] args) {

    1. int[] arrays={1,2,3,4,5};

// for (int array:arrays) { // System.out.println(array); // } int[] reverse=reverse(arrays); printArray(arrays); System.out.println(); printArray(reverse); }

  1. //打印数组元素
  2. public static void printArray(int[] arrays) {
  3. for (int i = 0; i <arrays.length ; i++) {
  4. System.out.print(arrays[i]+" ");
  5. }
  6. }
  7. //反转数组
  8. public static int[] reverse(int[] arrays){
  9. int[] result=new int[arrays.length];
  10. //反转的操作
  11. for (int i = 0,j=result.length-1; i <arrays.length ; i++,j--) {
  12. result[j]=arrays[i];
  13. }
  14. return result;
  15. }

}

  1. <a name="xUltR"></a>
  2. # 8.多维数组(以二维数组为例进行说明)
  3. <a name="YyNxI"></a>
  4. ### 1.多维数组的动态初始化
  5. <a name="nYhyh"></a>
  6. #### 1.直接为每一维分配空间
  7. ```java
  8. type[][] typeName = new type[typeLength1][typeLength2];

type 可以为基本数据类型和复合数据类型,typeLength1 和 typeLength2 必须为正整数,typeLength1 为行数,typeLength2 为列数。
例如:

  1. int[][] a = new int[2][3];

二维数组 a 可以看成一个两行三列的数组。

2.从最高维开始,分别为每一维分配空间,

例如:

  1. String[][] s = new String[2][];
  2. s[0] = new String[2];
  3. s[1] = new String[3];
  4. s[0][0] = new String("Good");
  5. s[0][1] = new String("Luck");
  6. s[1][0] = new String("to");
  7. s[1][1] = new String("you");
  8. s[1][2] = new String("!");

s[0]=new String[2]s[1]=new String[3] 是为最高维分配引用空间,也就是为最高维限制其能保存数据的最长的长度,然后再为其每个数组元素单独分配空间 s0=new String(“Good”) 等操作。

2.多维数组的引用

对二维数组中的每个元素,引用方式为 arrayName[index1][index2],例如:

  1. num[1][0];

9.Arrays 类

java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。
具有以下功能:

  • 给数组赋值:通过 fill 方法。
  • 对数组排序:通过 sort 方法,按升序。
  • 比较数组:通过 equals 方法比较数组中元素值是否相等。
  • 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。

具体说明请查看下表:
image.png

10.冒泡排序

1.算法说明

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢”浮”到数列的顶端。

2.算法步骤

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
bubbleSort.gif

3.时间复杂度分析

1.最快的情况

当输入的数据已经是正序时。

2.最坏的情况

当输入的数据是反序时。

4.代码实现

  1. public class Bubble {
  2. public static void main(String[] args) {
  3. //冒泡排序算法
  4. int[] numbers = new int[]{1, 5, 8, 2, 3, 9, 4};
  5. bubble1(numbers);
  6. }
  7. public static void bubble1(int[] numbers) {
  8. //需进行length-1次冒泡
  9. for (int i = 0; i < numbers.length - 1; i++) {
  10. for (int j = 0; j < numbers.length - 1 - i; j++) {
  11. if (numbers[j] > numbers[j + 1]) {
  12. int temp = numbers[j];
  13. numbers[j] = numbers[j + 1];
  14. numbers[j + 1] = temp;
  15. }
  16. }
  17. }
  18. System.out.println("从小到大排序后的结果是:");
  19. for (int i = 0; i < numbers.length; i++)
  20. System.out.print(numbers[i] + " ");
  21. }
  22. }

11.稀疏数组

1.稀疏数组的使用场景

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组,稀疏数组的处理方法是:

  • 记录数组一共有几行几列,有多少个不同的值。
  • 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。

    2.稀疏数组的表示

    image.pngimage.png
    即第一行第一列记录记录原始数组行数,第一行第二列记录原始数组列数,第一行第三列总共有多少个值,第二行记录第一个有效数据,第三行记录第二个有效数据。

    3.稀疏数组的应用实例

  • 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)

  • 把稀疏数组存盘,可以重新恢复原来的二维数组数
  • 整体思路分析

image.png
二维数组转稀疏数组的思路
1.遍历原始的二维数组,得到有效数据的个数sum
2.根据sum就可以创建稀疏数组sparseArr int[sum+ 1] [3]
3.将二维数组的有效数据数据存入到稀疏数组

稀疏数组转原始的二维数组的思路
1.先读取稀疏数组的第一行,根据第一行的数据, 创建原始的二维数组,比如上面的chessArr2 = int [11][11]
2.在读取稀疏数组后几行的数据,并赋给原始的二维数组即可.

4.代码实现

  1. public class SparseArr {
  2. public static void main(String[] args) {
  3. //创建一个二维数组 11*11
  4. //0表示没有棋子,1表示黑棋,2表示蓝棋
  5. int[][] chessArr = new int[11][11];
  6. chessArr[1][2] = 1;
  7. chessArr[2][3] = 2;
  8. //输出原始的二维数组
  9. System.out.println("原始的二维数组:");
  10. for (int i = 0; i < chessArr.length; i++) {
  11. for (int j = 0; j < chessArr[i].length; j++) {
  12. System.out.print(chessArr[i][j]+"\t");
  13. }
  14. System.out.println();
  15. }
  16. //将二维数组转换为稀疏数组
  17. //1.先遍历二维数组得到非零数据的个数
  18. int sum = 0;
  19. for (int i = 0; i < 11; i++) {
  20. for (int j = 0; j < 11; j++) {
  21. if (chessArr[i][j] != 0){
  22. sum++;
  23. }
  24. }
  25. }
  26. //2.创建对应的系数数组
  27. int[][] sparseArr = new int[sum+1][3];
  28. //给系数数组赋值
  29. sparseArr[0][0] = 11;
  30. sparseArr[0][1] = 11;
  31. sparseArr[0][2] = sum;
  32. //遍历二维数组将非零的值存放到稀疏数组
  33. int count = 0;
  34. for (int i = 0; i < chessArr.length; i++) {
  35. for (int j = 0; j < chessArr[i].length; j++) {
  36. if (chessArr[i][j] != 0){
  37. count++;
  38. sparseArr[count][0] = i;
  39. sparseArr[count][1] = j;
  40. sparseArr[count][2] = chessArr[i][j];
  41. }
  42. }
  43. }
  44. //输出稀疏数组
  45. System.out.println();
  46. System.out.println("稀疏数组:");
  47. for (int i = 0; i < sparseArr.length; i++) {
  48. System.out.println(sparseArr[i][0]+"\t"+sparseArr[i][1]+"\t"+sparseArr[i][2]);
  49. }
  50. //将稀疏数组恢复成二维数组
  51. //1.先读取稀疏数组的第一行,根据第一行创建二维数组
  52. int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
  53. //2.读取稀疏数组后几行赋值给二维数组
  54. //注意这里是从第二行开始
  55. for (int i = 1; i < sparseArr.length; i++) {
  56. chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
  57. }
  58. System.out.println();
  59. System.out.println("恢复后的二维数组:");
  60. for (int[] row : chessArr2) {
  61. for (int data : row) {
  62. System.out.print(data+"\t");
  63. }
  64. System.out.println();
  65. }
  66. }
  67. }