数组
定义:相同类型数据的有序集合。可以通过下标进行访问【下标从0开始】
用处:简化程序,避免定义多个相同类型的变量
数据声明创建
数组的元素通过索引访问,索引从0开始
public static void main(String[] args) {
// 声明:
// dataType[] arrayRefVar;【推荐使用】
// 或者 dataType arrayRefVar[];(C和C++风格)
int[] nums;
// 创建:
// dataType[] arrayRefVar = new dataType[arraySize];
nums = new int[10];
int nums2 = new int[5];
// 获取数组长度:array.length
int l = nums.length;
// 赋值
nums[0] = 10;
System.out.println("l:"+l+"第一个数:"+nums[0]);
}
初始化状态
三种初始化方法
-
静态初始化
// 静态初始化 int[] a = {1,3,5,7,9}; Man[] mans = {new Man(),new Man()}; // Man为一个已建的类,这里作为引用类型
-
动态初始化
// 动态初始化 int[] a = new int[10]; // 此时默认的所有值都为0 a[0] = 1;
-
数组的默认初始化
- 数组是引用类型,它的元素相当于类的实例变量,因此数据一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化,即给了个默认的初始值0
特点
- 长度确定,一旦被创建,它的大小不可改变
- 元素必须相同类型
- 数组中的元素可以是任意类型,包括基本类型和引用类型
- 数组变量本身属于引用类型,也可以被看成是对象,数组中的每个元素相当于该对象的成员变量。
- 由于他本身就是对象,因此,他和其他对象一样在Java的堆中,无论其保存的是原始类型还是其他对象类型
- 只要是new出来的,都在堆中
内存分析
下标的范围在0 - arr.length-1,超过会报以下错误:
java.lang.ArrayindexOutOfBoundsException:数组下标越界错误
使用方法
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
// System.out.println(arr); // 输出一个地址
// 遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
// 数组求和
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum = sum + arr[i];
}
// 查找最大值
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max){
max = arr[i];
}
}
// for-each循环 jdk1.5开始
// 输入arr.for+回车
for (int i : arr) { // i代表数组中的每个元素
System.out.println(i);
}
rev(arr);
print(arr); // 不改变原数组
int[] rev = rev(arr);
print(rev);
}
// 打印数组元素
public static void print(int[] array){
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
}
// 反转数组
public static int[] rev(int[] array){
int[] res = new int[array.length];
for (int i = 0, j= array.length-1; i < array.length; i++,j--) {
res[j] = array[i];
}
return res;
}
多维数组
定义:多维数组可以看作是数组的数组。
二维数组
定义:特殊的一维数组,每一个元素都是一个一维数组
// 2行5列的数组
int[][] a = new int[2][5];
// 2行3列的数组
int[][] arr = {{1,2,4},{2,3,5}};
System.out.println(arr[0]); // 1 2 4
System.out.println(arr[0][2]); // 4
System.out.println(arr.length); // 2(有几个小数组)
System.out.println(arr[0].length); // 3(小数组的长度)
应用
Arrays类
-
数组的工具类java.util.Arrays【数组本身没有什么方法,因此API帮助我们对数组对象进行一些基本操作,查看JDK帮助文档Java8 API帮助文档】
【util是工具包】
-
Arrays类中的方法都是static的静态方法,可以直接调用(也可以使用对象进行调用)
-
常用方法:
- fill():给数组赋值
- sort():对数组排序
- equals():比较数组中的元素值是否相等
- binarySearch():对排序好的数据进行二分查找法操作来查找数组元素
int[] a = {456,123,789,55,44,6,1,2,3};
// 打印数组元素
System.out.println(Arrays.toString(a));
// 数组排序
Arrays.sort(a); // 改变原数组
System.out.println(Arrays.toString(a));
冒泡排序
共有8大排序算法,冒泡排序最为出名
时间复杂度:O(n2)【嵌套循环的时间复杂度即为O(n2)】
原理:两层循环,外层冒泡轮数,里层依次比较
public static void main(String[] args) {
int[] arr = {1,888,999,445645,48565,786243,45,12};
int[] sort = sort(arr);
System.out.println(Arrays.toString(arr));
}
// 冒泡排序
// 1.比较数组中两个相邻元素的,若第一个数比第二个数大,则交换位置
// 2.每次比较,都会产出一个最大,或者最小的数字
// 3.下一轮中,可以少一次比较和排序
// 4.依次循环直到结束
public static int[] sort(int array[]){
int temp = 0; // 临时变量,用于交换位置
// 外层循环,判断要走多少次
for (int i = 0; i < array.length-1; i++) {
// 内层循环,比较两个数,并换位置
for (int j = 0; j < array.length-1; j++) {
if (array[j+1]<array[j]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
return array;
}
稀疏数组(数据结构)
定义:一个算法,来压缩数据
使用场景:当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存
稀疏数组的处理方式:
- 记录数组一共有几行几列,有多少不同值(有效值)
- 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
// 稀疏数组
public static void main(String[] args) {
// 1.创建一个二维数组 11*11 0:没有棋子,1:白棋,2:黑棋
int[][] arr0 = new int[11][11];
arr0[1][2] = 1;
arr0[2][3] = 2;
System.out.println("输出原始数组:");
for (int[] i : arr0) {
for (int j : i) {
System.out.print(j+"\t");
}
System.out.println();
}
// 2.转换为稀疏数组
// 2.1获取有效值的个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (arr0[i][j]!=0){
sum++;
}
}
}
System.out.println("有效值的个数:"+sum);
// 2.2创建一个稀疏数组
// 行:有效值的个数加上最上方的统计行
// 列:第一列为行坐标,第二列为纵坐标,第三列为值
int[][] arr1 = new int[sum+1][3];
arr1[0][0] = 11;
arr1[0][1] = 11;
arr1[0][2] = sum;
// 2.3遍历二维数组,将非0值存入稀疏数组
int count = 0; // 代表稀疏数组的第几行-1(因为第一行为统计值)
for (int i = 0; i < arr0.length; i++) {
for (int j = 0; j < arr0[i].length; j++) {
if (arr0[i][j]!=0){
count++;
arr1[count][0] = i;
arr1[count][1] = j;
arr1[count][2] = arr0[i][j];
}
}
}
System.out.println("稀疏数组:");
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i][0]+"\t"+
arr1[i][1]+"\t"+
arr1[i][2]);
}
// 3.还原
System.out.println("还原数组:");
// 3.1读取稀疏数组
int[][] arr2 = new int[arr1[0][0]][arr1[0][1]];
// 3.2给其中的元素还原它的值
for (int i = 1; i < arr1.length; i++) {
arr2[arr1[i][0]][arr1[i][1]] = arr1[i][2];
}
for (int[] i : arr2) {
for (int j : i) {
System.out.print(j+"\t");
}
System.out.println();
}
}