先声明数组变量:
用new操作创建数组:
datatype[] arrayRefVar = new datatype[arraySize];
数组的元素1通过索引访问,从0开始
获取数组长度:
arrays.length
package array; public class ArrayDemo01 { // 变量的类型 变量的名字 = 变量的值 // 数组类型 public static void main(String[] args) { int[] nums; // 声明一个数组 nums = new int[10]; // 创建一个数组,可以存放10个int类型的数字 int[] num2 = new int[10]; // 声明,创建一起 // 给数组元素赋值 for (int i = 1; i <=10 ; i++) { nums[i-1] = i; } // System.out.println(nums[9]); // 计算所有元素的和 int sum = 0; // 获取数组长度 array.length for (int i = 0; i < nums.length; i++) { sum += nums[i]; } System.out.println("和为:"+sum); } }
java内存分析:
java内存:
三种初始化
(1).静态初始化:
int [] a = {1,2,3};
Man[] mans = {new Man(1,1),new Man(2,2)};
(2).动态初始化
int[] a = new int[2];
a[0] = 1;
a[1] = 2;
(3).数组的默认初始化
数组是引用类型,它的元素相当于类的实例变量,被隐形初始化。
package array; public class ArrayDemo02 { public static void main(String[] args) { // 静态初始化 创建+赋值 int[] a = {1,2,3,4,5,6,7,8}; // Man[] mans = {new Man(),new Man()}; System.out.println(a[0]); // 动态初始化 包含默认初始化 int[] b = new int[10]; b[0] = 10; System.out.println(b[2]); } }
下标的合法区间:[0,length-1],如果越界会报错
ArrayIndexOutOfBoundException:数组下标越界异常!
package array; public class ArrayDemo04 { public static void main(String[] args) { int[] arrays = {1,2,3,4,5}; // JDK1.5,没有下标 // for (int array : arrays) { // System.out.println(array); // } // printArray(arrays); int[] reverse = reverse(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; } }
多维数组可以看做是数组的数组,二维数组是一个特殊的一维数组
二维数组:
int[][] a = int[2][5]
package array; public class ArrayDemo05 { public static void main(String[] args) { // [4][2] /* 1,2 2,3 3,4 4,5 */ int[][] array = {{1,2},{2,3},{3,4},{4,5}}; // System.out.println(array[0][0]); // System.out.println(array[1][0]); // System.out.println(array.length); // System.out.println(array[0].length); for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[0].length; j++) { System.out.println(array[i][j]); } } } }
常用功能
package array; import java.util.Arrays; public class ArrayDemo06 { public static void main(String[] args) { int[] a = {1,2,3,4,4343434,5655,67,43,21}; // System.out.println(a); // 打印数组元素Arrays.toString // System.out.println(Arrays.toString(a)); // ArrayDemo06 arrayDemo06 = new ArrayDemo06(); // arrayDemo06.printArray(a); Arrays.sort(a); Arrays.fill(a,2,4,0); // 数组填充 System.out.println(Arrays.toString(a)); } public 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]+","); } } } }
冒泡排序名声赫赫,共有八大排序
两次循环,外层冒泡轮数,内层依次比较,江湖人尽皆知
package array; import java.util.Arrays; public class ArrayDemo07 { public static void main(String[] args) { int[] a = {1,2,3,4,564,344,22,7866}; int[] sort = sort(a); // 调用自己的冒泡排序,返回一个排序后的数组 System.out.println(Arrays.toString(a)); } // 冒泡排序 // 1.比较数组中,两个相邻的元素,如果第一个比第二个大,我们就交换他们的位置 // 2.每一次比较,会出一个最大或最小的,下一轮可以少一次排序 // 3.依次循环,直到结束 public static int[] sort(int[] array){ // 临时变量 int temp = 0; // 外层循环,判断要走多少次 for (int i = 0; i < array.length-1; i++) { boolean flag = false; // 通过flag标识为减少无意义的比较 // 内层循环,比较两个数,如果第一个数比第二个数大,就交换位置 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; flag = true; } } if(flag == false){ break; } } return array; } }
需求:五子棋游戏,有存盘退出和续上盘的功能
分析问题:该二维数组零太多,无意义数据太多
解决:稀疏数组
但一个数组中大部分元素为零或同一值时,可以使用稀疏数组来保存该数组。
结构
行 列 值
x y z
package array; public class ArrayDemo08 { public static void main(String[] args) { // 1.创建一个棋盘11*11, 0:无子 1:黑棋 2:白棋 int[][] array1 = new int[11][11]; array1[1][2] = 1; array1[2][3] = 2; // 输出原始的数组 System.out.println("输出原始数组:"); for (int[] ints : array1) { for (int anInt : ints) { System.out.print(anInt+"\t"); } System.out.println(); } // 转换为稀疏数组保存 // 获取有效值的个数 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); // 创建一个稀疏数组的数组 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("稀疏数组"); for (int i = 0; i < array2.length; i++) { System.out.println(array2[i][0]+"\t" +array2[i][1]+"\t" +array2[i][2]+"\t"); } System.out.println("稀疏数组还原"); // 读取稀疏数组 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("输出还原数组:"); for (int[] ints : array3) { for (int anInt : ints) { System.out.print(anInt+"\t"); } System.out.println(); } } }