数组的定义、赋值和输出
public class Demo1 { public static void main(String[] args) { int[] nums;//首选定义 int nums2[]; nums = new int[10]; //从键盘输入十个数据 for(int i=0;i<10;i++){ System.out.println("请输入第"+(i+1)+"个数据:"); Scanner scanner = new Scanner(System.in); if(scanner.hasNextInt()){ nums[i]=scanner.nextInt(); } } //打印数组中的元素 for (int i=0;i<10;i++){ System.out.println(nums[i]); } } }
在声明时,数组并没有产生。在栈中会存放基本变量类型以及引用对象的变量(会存放这个引用在堆里面的具体地址)。在堆中会存放new的对象和数组(数组的本身就是对象),可以被所有的线程共享,不会存放别的对象引用。
public class Demo2 { public static void main(String[] args) { //静态初始化:创建+赋值 int[] array = {1,2,3,4,5}; //动态初始化:包含默认初始化 int[] array2; array2 = new int[20]; array2[5]=1; System.out.println(array2[5]); System.out.println(array2[0]);//没赋值的默认为0 Man[] men = {new Man(),new Man()};//引用类型数组,有Man类 } }
public class Demo3 { public static void main(String[] args) { int[] arrays = {1,2,3}; //增强型for循环遍历,无法获取下标 for (int array:arrays) { System.out.println(array); } printArrays(arrays); int[] reverse=reverseArrays(arrays); printArrays(reverse); } //打印数组 public static void printArrays(int[] arrays){ for(int i=0;i<arrays.length;i++){ System.out.println(arrays[i]); } } //反转数组 public static int[] reverseArrays(int[] arrays){// 返回值类型应该设置成数组类型 int[] int[] result = new int[arrays.length]; for (int i=0,j=arrays.length-1;i< arrays.length;i++,j--){ result[i]=arrays[j]; } return result; } }
注意点:
当数组作为返回值时,需要将返回值类型设置成数组类型
public class Demo4 { public static void main(String[] args) { int[] a={5,9,7,8,10,20}; System.out.println(a);//[I@1b6d3586 哈希值 //打印数组元素Arrays.toString System.out.println(Arrays.toString(a));//[5, 9, 7, 8, 10, 20] //数组排序 Arrays.sort(a); System.out.println(Arrays.toString(a)); //赋值 0~3之间的元素全为4 0包括3不包括 Arrays.fill(a,0,3,4); System.out.println(Arrays.toString(a)); } }
其它方法可以去帮助文档查看
当一个数组中大部分元素都是同一个数值时,用稀疏数组来保存该数组。
处理方式:
记录数组的行列数和不同数值的个数
把不同数值和所在的行列坐标放到另一个小规模的数组中
public class Demo6 { public static void main(String[] args) { //定义一个棋盘 12x12 1表示白棋 2表示黑棋 int[][] arrays1; arrays1 = new int[12][12]; arrays1[2][2]=1; arrays1[3][3]=2; printChessBoard(arrays1); //记录不同值的个数 int count=0; for(int i=0;i<arrays1.length;i++){ for(int j=0;j<arrays1[i].length;j++){ if(arrays1[i][j]!=0) count++; } } //声明一个稀疏数组 int[][] arrays2; arrays2 = new int[count+1][3]; arrays2[0][0]=12; arrays2[0][1]=12; arrays2[0][2]=count; //遍历棋盘找到不同值的行列值 int sum=0; for(int i=0;i<arrays1.length;i++){ for(int j=0;j<arrays1[i].length;j++){ if(arrays1[i][j]!=0){ sum++; arrays2[sum][0]=i; arrays2[sum][1]=j; arrays2[sum][2]=arrays1[i][j]; } } } printArray(arrays2); int[][] result; result = recover(arrays2); printArray(result); } //打印棋盘 public static void printChessBoard(int[][] array){ 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("\n"); } } //输出稀疏数组 public static void printArray(int[][] array){ 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("\n"); } } //根据稀疏数组还原棋盘 public static int[][] recover(int[][] array){ //建立一个数组来存放棋盘 int[][] result ; result = new int[array[0][0]][array[0][1]]; //定义一个row变量,用来给与稀疏数组中所表示非零值的行列值相同位置赋非零值 int row=1; //稀疏数组的具体行数无法得知,但是可以通过稀疏数组第一行第三个元素来判断,总行数就是不同元素个数再加1。 //稀疏数组的最后一行的行数就是给棋盘数组赋值的外循环次数,列数同理。这样可以防止在给棋盘赋值是出现数组下标越界的问题 for(int i=0;i<=array[array[0][2]][0];i++){ for(int j=0;j<=array[array[0][2]][1];j++){ if(i==array[row][0]&&j==array[row][1]){ result[i][j]=array[row][2]; row++; }else{ result[i][j]=0; } } } return result; } }