Java中数组的定义和应用
这是一个关于Java中数组简单应用的笔记
1.定义
相同类型数据的有限集合,按照一定的先后次序组合而成,通过数组下标访问
2.数组的声明创建
-
声明
//一维数组 int [] nums; //首选 声明一个数组,将nums压入栈底,此时数组并不存在 int nums[];//另一种方法
-
创建数组
nums = new int[10];//创建一个数组,此时才在堆中申请空间 int[] array = {1,2,3,4,5}
-
赋值
//若一个数组空间未赋值输出默认值0 nums.length;//获取数组长度
3.内存分析
- 声明数组时将nums的定义压入栈底
- 创建数组时在堆中申请空间
- java中对象都是在堆中的
- new出来的是对象
4.初始化
-
静态初始化
int[] a = {1,2,3,4,5,16};//创建+赋值
-
动态初始化(包含默认初始化:初始化数组元素有默认值)
int[] b = new int[10];//申请一片空间,需要后期赋值
5.数组的各种操作
package com.kong.array;
public class ArrayDomo02 {
public static void main(String[] args) {
int[] arrays = {1,2,3,4,5,6};
// for (int array : arrays) {
// System.out.println(array);
// }
int[] reverse = reverseNow(arrays);
printArray(reverse);
}
//打印数组方法
public static void printArray(int[] arrays){
for (int i = 0; i < arrays.length; i++) {
System.out.print(arrays[i]+" ");
}
}
//反转数组(借助辅助数组)
public static int[] reverse(int[] arrays){
int[] result = new int[arrays.length];
for(int i = 0,j = result.length-1; i < arrays.length; i++,j--){
result[j] = arrays[i];
}
return result;
}
//反转数组(原地反转)
public static int[] reverseNow(int[] arrays){
for(int i = 0,j = arrays.length-1; i<j; i++,j--){
int temp;
temp = arrays[i];
arrays[i] = arrays[j];
arrays[j] = temp;
}
return arrays;
}
}
结果
6 5 4 3 2 1
Process finished with exit code 0
6.二维数组
- 二维数组逻辑图
-
定义及一些操作代码
package com.kong.array; public class Tow_ArrayDomo01 { public static void main(String[] args) { //[4][2] 4行两列 /* 1,2 array[0] 2,3 array[1] 3,4 array[2] 4,5 array[3] */ int[][] array = {{1,2},{2,3},{3,4},{4,5}}; printArray(array[0]); System.out.println(); System.out.println(array[0][1]); System.out.println(array[2][1]); System.out.println("=============="); System.out.println(array.length); System.out.println(array[0].length); } //打印数组方法 public static void printArray(int[] arrays){ for (int i = 0; i < arrays.length; i++) { System.out.print(arrays[i]+" "); } } }
结果
1 2 2 4 ============== 4 2 Process finished with exit code 0
-
打印二维数组
package com.kong.array; public class Tow_ArrayDomo02 { public static void main(String[] args) { //打印二维数组 //[4][2] 4行两列 /* 1,2 array[0] 2,3 array[1] 3,4 array[2] 4,5 array[3] */ int[][] array = {{1,2},{2,3},{3,4},{4,5}}; for(int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { System.out.print(array[i][j]+" "); } System.out.println(); } } }
结果
1 2 2 3 3 4 4 5 Process finished with exit code 0
7.关于Array的各种函数调用
package com.kong.array;
import java.util.Arrays;
public class ArrayDomo03 {
public static void main(String[] args) {
int[] a = {1,4,2,6,3,9};
//打印数组
System.out.println(a);//[I@1540e19d (这是一个hashCode)
//打印数组元素
System.out.println(Arrays.toString(a));//调用系统的Array函数库中toString方法打印数组;
System.out.println("========\n打印数组");
printArray(a); //自己造的打印方法
//数组排序
System.out.println("\n==========\n数组排序");
Arrays.sort(a);
System.out.println(Arrays.toString(a));
//fill方法 填充数组元素
System.out.println("=======\n在2和4之间填充0,Note:区间左闭右开");
Arrays.fill(a,2,4,0);//在2和4元素之间填充0 左闭右开区间
System.out.println(Arrays.toString(a));
}
//重复造轮子
public static void printArray(int[] a){
for (int i = 0; i < a.length; i++) {
if(i == 0){
System.out.print("[");
}
if(i == a.length-1){
System.out.print(a[i]+"]");}
else System.out.print(a[i]+", ");
}
}
}
结果
[I@1540e19d
[1, 4, 2, 6, 3, 9]
========
打印数组
[1, 4, 2, 6, 3, 9]
==========
数组排序
[1, 2, 3, 4, 6, 9]
=======
在2和4之间填充0,Note:区间左闭右开
[1, 2, 0, 0, 6, 9]
Process finished with exit code 0
8.冒泡排序
时间复杂度O(n^2)
package com.kong.array;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
//冒泡排序
int[] a = {1,9,2,5,3,0,6};
System.out.println(Arrays.toString(BubbleSort(a)));
}
//冒泡排序方法BubbleSort
public static int[] BubbleSort(int[] array){
int flag = 1;
int temp = 0;
for (int i = array.length-1; i >= 1 && flag == 1; i--) {
flag = 0;
for (int j = 0; j < i; j++) {
if(array[j] > array[j+1]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
flag = 1;
}
}
}
return array;
}
}
结果
[0, 1, 2, 3, 5, 6, 9]
Process finished with exit code 0
9.稀疏数组 压缩存储和解压
-
方法:三元组存储(行/列/值)
-
练习 存储棋盘 (棋局:11*11; 0:没有棋子; 1:黑棋; 2:白棋)
package com.kong.array; public class CompressArray { public static void main(String[] args) { //创建一个二维数组 11*11 0:没有棋子, 1:黑棋, 2:白棋 int[][] array1 = new int[11][11]; array1[1][2] = 1; array1[2][3] = 2; //输出原始数组 for (int[] a:array1) { for (int b:a) { System.out.print(b + "\t"); } System.out.println(); } //1.转化为稀疏数组保存 //获取有效值个数 int sum = 0; for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if(array1[i][j] != 0){ sum++; } } } System.out.println("有效值个数为:"+sum); //2.创建一个稀疏数组 int[][] array2 = new int[sum+1][3]; array2[0][0] = 11; array2[0][1] = 11; array2[0][2] = sum; //遍历二维数组,将非零值存入稀疏数组中 int count = 0; for (int i = 0; i < array1.length; i++) { for (int j = 0; j < array1[i].length; j++) { if(array1[i][j] != 0){ count++; array2[count][0] = i; array2[count][1] = j; array2[count][2] = array1[i][j]; } } } //打印稀疏数组 System.out.println("=============\n打印稀疏数组"); for (int[] a:array2) { for (int b:a) { System.out.print(b + "\t"); } System.out.println(); } //3.还原稀疏数组 //读取稀疏数组的值 int[][] array3 = new int[array2[0][0]][array2[0][1]]; //给其中的元素还原它的值 for (int i = 1; i < array2.length; i++) { array3[array2[i][0]][array2[i][1]] = array2[i][2]; } //打印还原的数组 System.out.println("==================\n还原的数组:"); for (int[] a:array3) { for (int b:a) { System.out.print(b + "\t"); } System.out.println(); } } }
结果
com.kong.array.CompressArray 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 有效值个数为:2 ============= 打印稀疏数组 11 11 2 1 2 1 2 3 2 ================== 还原的数组: 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Process finished with exit code 0