数组
数组是相同类型数据的有序集合,每个数据称作数组元素,可以通过下标来访问。
数组是引用类型,存在默认初始化
一、声明和创建
//声明=创建数组(new)
int[] numbers = new int[2]; //[2]表示长度为2
//给数组元素赋值
numbers[0] = 100;
//通过下标取值,从0开始
System.out.println(numbers[0]); //100
System.out.println(numbers[1]); //未赋值的,为默认值
二、初始化及内存分析
-
堆:存放new的对象和数组(创建部分)
-
栈:存放基本变量类型、引用变量的地址(声明部分)
-
方法区:包含所有class和static变量
//静态初始化:创建+赋值 int[] num1 = {1,2,3,4}; //动态初始化:包含默认初始化 int[] num2 = new int[10]; }
三、下标越界
数组的长度是确定的,下标越界会报错:ArrayIndexOutOfBoundsException
int[] nums = {1,2,3}; //只有下标0,1,2
System.out.println(nums[3]);//下标越界
四、数组的使用
-
遍历数组
int[] nums = {1,2,3,4,5}; //遍历数组(获取数组长度:numbers.length) for (int i = 0; i < nums.length; i++) { System.out.println(nums[i]); } //遍历数组,该方法无法用下标获取 for (int array:nums){ System.out.println(array); }
-
反转数组
public static int[] reverse(int[] arrays){ int[] result = new int[arrays.length]; for (int i = 0, j = arrays.length-1; i < arrays.length; i++,j--) { result[j] = arrays[i]; } return result; }
五、二维数组
//二位数组:int[][]=new int[2][5]
int[][] array = {{1,11},{2,22},{3,33}};
//遍历
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.println(array[i][j]);
}
}
六、Arrays类
可以查看jdk帮助文档:https://docs.oracle.com/javase/8/docs/api/
导入包:import java.util.Arrays;
int[] nums = {1222,244,31,41,5};
//打印数组元素:Arrays.toString()
System.out.println(Arrays.toString(nums));
//排序:升序
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
//填充:指定索引位置
Arrays.fill(nums,2,4,0);//第3和第4个变成0
System.out.println(Arrays.toString(nums));
//填充:全部
Arrays.fill(nums,0); //所有数组元素值变成0
System.out.println(Arrays.toString(nums));
七、冒泡排序
时间复杂度:O(n^2)
//冒泡排序
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-i; 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) { //棋盘:创建二维数组11*11,0表示没有棋子,1表示黑棋,2表示白棋 int[][] array = new int[11][11]; array[1][2] = 1; array[2][3] = 2; //输出原始数组 System.out.println("输出原始数组:"); for (int[] ints : array) { for (int anInt : ints) { System.out.print(anInt+"\t"); } System.out.println(); } System.out.println("=============================="); //转换为稀疏数组 //获取有效值的个数 int sum = 0; for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if(array[i][j]!=0){ sum++; } } } System.out.println("有效值的个数:"+sum); //创建稀疏数组 int[][] array1 = new int[sum+1][3];//3列分别是:行数,列数,值 array1[0][0] = 11; array1[0][1] = 11; array1[0][2] = sum; //遍历二维数组将非0的值存放到稀疏数组中 int count = 0; for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { if (array[i][j]!=0){ count++; array1[count][0] = i; array1[count][1] = j; array1[count][2] = array[i][j]; } } } //输出稀疏数组 System.out.println("输出稀疏数组:"); for (int i = 0; i < array1.length; i++) { System.out.println(array1[i][0]+"\t"+array1[i][1]+"\t"+array1[i][2]+"\t"); } System.out.println("=============================="); //还原 int[][] array2 = new int[array1[0][0]][array1[0][1]]; for (int i = 1; i < array1.length; i++) { array2[array1[i][0]][array1[i][1]] = array1[i][2]; } System.out.println("输出还原的稀疏数组:"); for (int[] ints : array2) { for (int anInt : ints) { System.out.print(anInt+"\t"); } System.out.println(); }}