一、数组概述
数组的定义:相同类型数据的有序集合,相同类型若干个数据按照一定的先后次序排列组合而成。每一个数据称为一个数组元素,每个数组元素可以通过一个下标来访问它。
二、数组声明创建
-
两种声明数组的方式:
-
使用new创建数组
-
定义数组=声明+创建
🎈数组对应的内存
🎈数组的三种初始化
-
动态初始化
-
静态初始化
-
数组的默认初始化:数组是引用类型,它的元素相当于类的实例变量,数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
🎈数组的特点
数组一旦被创建,其大小不可变,长度确定 |
---|
数组的元素可以是任何数据类型,包括基本类型和引用类型,但一个数组中的元素类型必须相同,不允许出现混合类型 |
数组变量 属于引用类型,数组本身就是对象,Java中的对象位于堆中,数组对象也在堆中,数组中的每个元素相当于该对象的成员变量 |
🎈数组边界
合法区间:[0 , length-1]
ArrayIndexOutOfBoundsException: 数组下标越界异常!
三、数组使用
for-each循环、for循环遍历
数组作方法入参
数组作返回值
四、多维数组
多位数组即数组的数组,例如二维数组就是特殊的一维数组,它的每个元素都是一个一维数组
- 二维数组
int[][] a=new int[3][2];
int[][] b={{1,2}, {3,4}, {5,6}};
- 二维数组的遍历
int[][] arr=new int[11][11];
arr[1][2]=1;
arr[2][3]=2;
//开始遍历!!!!!!!
//方法一!!
for (int[] arr1 : arr) {
for (int a : arr1) {
System.out.print(a+"\t");
}
System.out.println();
}
//方法二!!
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j <arr1[i].length; j++) {
System.out.print(arr1[i][j]+"\t");
}
}
五、Arrays类
借助API文档,利用Arrays中的方法,向Arrays中传入创建的数组。
- 冒泡排序,八大排序之一
两层排序,外层表示冒泡轮数、里层表示元素依次比较。
嵌套循环:时间复杂度O(n^2)
import java.util.Arrays;
public class 冒泡排序 {
//冒泡排序
//1.比较数组中两个相邻的元素,如果第一个数比第二个数大,则交换他们的位置
//2.每一轮比较,都会在 结尾 产生最大数、或者最小数
//3.下一轮,可以减少一次排序
//4.依次循环,直到结束
public static void main(String[] args) {
int[] arr={2,99,1,4,6,7,2};
int[] ints = bubbleSort(arr);
System.out.println(Arrays.toString(ints));
}
public static int[] bubbleSort(int[] a) {
boolean flag=false;//优化冒泡排序,不需要两两交换即已经排好序的数组,停止冒泡。
//不用对开始就排好序的数组重复比较以及待排序数组的最后一次的比较
for (int i = 0; i <a.length-1; i++) {
//外层循环:进行多少轮冒泡
int tmp=0;
for (int j = 0; j <a.length-1-i; j++) {
if (a[j]>a[j+1]) {
flag=true;
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
if (flag==false) {
break;//结束循环
}
}
return a;
}
}
六、稀疏数组
稀疏数组,是一种数据结构,是一种压缩数据的途径。
-
使用场景
当一个数组中大部分元素为0时,或者为同一个值时,可以使用稀疏数组来保存。
-
处理方式
记录数组一共有几行几列,有多少个不同值
把具有不同值的元素和行列及值,记录在一个小规模的数组中,从而压缩程序的规模。
public class 稀疏数组表示棋盘 {
public static void main(String[] args) {
//创建一个11*11的棋盘,利用二维数组 1为黑棋,2为白棋
int[][] arr1=new int[11][11];
arr1[1][2]=1;
arr1[2][3]=2;
System.out.println("原始数组:");
for (int[] arrr1 : arr1) {
for (int a : arrr1) {
System.out.print(a+"\t");
}
System.out.println();
}
System.out.println("==========================");
//转换为稀疏数组保存
//1.获取有效值的个数
/*增强for循环遍历二维数组
int sum=0;
for (int[] arrr1 : arr) {
for (int a : arrr1) {
if (a!=0) {
sum++;
}
}
}
System.out.println(sum);
*/
int sum=0;
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j <arr1[i].length; j++) {
if (arr1[i][j]!=0) {
sum++;
}
}
}
System.out.println(sum);
//2.创建一个稀疏数组(行=有效值+1;列=3)
int[][] arr2=new int[sum+1][3];
//表中第一行:几行几列,几个有效值
arr2[0][0]=11;
arr2[0][1]=11;
arr2[0][2]=sum;
//3.遍历二维数组,将非零的值,按要求记录进稀疏数组
int count=0;
for (int i = 0; i <arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
if (arr1[i][j]!=0) {
count++;
arr2[count][0]=i;//记录行号
arr2[count][1]=j;//记录列号
arr2[count][2]=arr1[i][j];//记录值
}
}
}
//输出稀疏数组
System.out.println("稀疏数组:");
/* for (int i = 0; i < arr2.length; i++) {
for (int j = 0; j <arr2[i].length; j++) {
System.out.print(arr2[i][j]+"\t");
}
System.out.println();
}
*/
for (int[] arr2222 : arr2) {
for (int a : arr2222) {
System.out.print(a+"\t");
}
System.out.println();
}
System.out.println("==========================");
//还原稀疏数组
System.out.println("还原数组:");
//1.创建还原数组
int[][] arr3=new int[arr2[0][0]][arr2[0][1]];
//2.还原元素的值
for (int i = 1; i < arr2.length; i++) {
arr3[arr2[i][0]][arr2[i][1]]=arr2[i][2];
}
//3.打印还原数组
for (int[] arr333 : arr3) {
for (int a : arr333) {
System.out.print(a+"\t");
}
System.out.println();
}
}
}