数组
概念
数组是多个相同类型数据的组合,实现对这些数据的统一管理
数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型
数组属于引用数据类型,数组型数据是对象(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]);
}
数组元素的初始化默认值
基本数据类型的数组
- 对于
byte
、short
、int
、long
而言,创建数组以后,默认值为0
- 对于
float
、double
而言,创建数组以后,默认值为0.0
。 - 对于
char
而言,创建数组以后,默认值为\0
,即空格。 - 对于
boolean
而言,创建数组以后,默认值为false
。
引用数据类型的数组
- 以
String
类为例,默认初始化值为null
。
一维数组的内存结构
内存基本结构,如图-1
基本数据类型的数组在内存中的结构,如图-2
引用数据类型的数组在内存中的结构,如图-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");
}
}
二维数组的内存结构
数组的常见异常
- 数组下标越界的异常:
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