数组

Author Avatar
Ninefire 9月 13, 2018
  • 在其它设备中阅读本文章

概念

  • 数组是多个相同类型数据的组合,实现对这些数据的统一管理

  • 数组中的元素可以是任何数据类型,包括基本数据类型引用数据类型

  • 数组属于引用数据类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量


定义数组

/** 声明数组 **/

// 声明一个存放字符串的数组names
String[] names;

// 声明一个存放整型的数组scores
int scores[];

/** 初始化数组 **/

// 1.静态初始化:初始化数组和给数组元素赋值同时进行
names = new String[]{"赵涵","赵娟","赵雨婕"};

// 2.动态初始化:初始化数组和给数组元素赋值分开进行
scores = new int[3];
scores[0] = 97;
scores[1] = 98;
scores[2] = 99;

声明数组的错误写法:

// (1)
String[] names = new String[3]{"aa", "bb", "cc"};

// (2)
int i[10];

// (3)
int i = new int[];

无论是动态初始化还是静态初始化数组,必定在创建的时候就指明了数组的长度!


数组的长度

通过数组的length属性可以获取数组的长度。

System.out.println(names.length); // 3
System.out.print(scores.length); // 3

数组的遍历

for (int i = 0; i < names.length; i++) {
    // 打印数组names中的所有元素
    System.out.println(names[i]);
}

数组元素的初始化默认值

基本数据类型的数组

  • 对于byteshortintlong而言,创建数组以后,默认值为0
  • 对于floatdouble而言,创建数组以后,默认值为0.0
  • 对于char而言,创建数组以后,默认值为\0,即空格。
  • 对于boolean而言,创建数组以后,默认值为false

引用数据类型的数组

  • String类为例,默认初始化值为null

一维数组的内存结构

内存基本结构,如图-1
图-1

基本数据类型的数组在内存中的结构,如图-2
图-2

引用数据类型的数组在内存中的结构,如图-3
图-3

一些创建数组方式,它们的内存结构都是相同的。

int[] scores1 = new scores1[]{12, 13, 14};

int scores2[] = {15, 16, 17};

int[] scores3;
scores3 = new int[]{18, 19, 20};

数组元素的引用

  • 定义并用运算符new为之分配空间后,才可以引用数组中的每个元素
  • 数组元素的引用方式:数组名[数组元素下标]
  • 数组元素下标可以是整型常量或整型表达式 如a[3]b[i]c[6*i]
    • 数组元素下标从0开始,长度为n的数组合法下标取值范围是0==>n-1,如int a[] = new int[3];可以引用的数组元素为a[0]a[1]a[2]
  • 每个数组都有一个属性length指明它的长度,例如a.length指明数组a的长度(即元素的个数)
    • 数组一旦初始化,其长度是不可变

二维数组

声明并初始化

// (1)
String[][] str = new String[4][3]; // 类似于4行3列

// (2)
String[][] str1 = new String[4][];
str1[0] = new String[3];
/**** 赋值 *****/
str1[3] = new String[5];
/**** 赋值 *****/

// (3)
int[][] arr = new int[][]{{1, 2, 3}, {4, 5}, {6}}

// 引用二维数组
arr[1][0] = 12; // 需要两个下标来引用一个元素

二维数组的长度

arr.length; // 3
arr[1].length; // 2

遍历二维数组

for(int i = 0; i < arr.length; i++) {
    for(int j = 0; j < arr[i].length; j++) {
        // 打印数组的所有元素
        System.out.print(arr[i][j] + "\t");
    }
}

二维数组的内存结构

图-1
图-2


数组的常见异常

  • 数组下标越界的异常:java.lang.ArrayIndexOutOfBoundsException
int[] i = new int[10];
i[0] = 90;
i[10] = 99;
for(int m = 0; m <= i.length; m++) {
    System.out.println(i[m]);
}
  • 空指针的异常:NullPointerException
// 第一种
boolean[] b = new boolean[3];
b = null;
System.out.println(b[0]);

// 第二种
String[] str = new String[4];
System.out.println(str[3].toString());

// 第三种
int[][] j = new int[3][];
j[2][0] = 12;

数组的常见算法

  • 求数组元素的最大值、最小值、和、平均值等
  • 数组的复制和反转等
/**** 方法一 ****/
for(int i = 0; i < arr.length / 2; i++) {
    int temp = arr[i];
    arr[i] = arr[arr.length - 1 - i];
    arr[arr.length - 1 - i] = temp;
}

/**** 方法二 ****/
for(int x = 0, y = arr.length - 1; x < y; x++, y--) {
    int temp = arr[x];
    arr[x] = arr[y];
    arr[y] = temp;
}
  • 数组元素的排序
    • 插入排序
      直接插入排序、折半排序、Shell排序
    • 交换排序
      冒泡排序、快速排序(或分区交换排序)
    • 归并排序
    • 基数排序
// 冒泡排序
for(int i = 0; i < arr.length - 1; i++) {
    for(int j = 0; j < arr.length - 1 - i; j++) {
        if(arr[j] > arr[j + 1]) {
            int temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}

开发中一般会直接调用Arrays工具类的Arrays.sort()方法。

如发现错误请联系我,谢谢你。
本文链接:http://ninefire.tk/Java.basics/03.html