Java学习笔记——DAY4
目录1、数组2、数组的声明和创建3、内存分析4、三种初始化5、数组边界6、数组使用7、多维数组8、Arrays类9、冒泡排序10、稀疏数组1、数组数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据按照一定的先后次序排列组合而成。其中每一个数据称作一个数组元素每个数组元素可以通过一个下标来访问它们。数组的基本特点其长度是确定的。数组一旦被创建它的大小就是不可以改变的。其元素必须是相同类型不允许出现混合类型。数组中的元素可以是任何数组类型包括基础类型和引用类型。数组变量属于引用类型数组也可以看成是对象数组中的每个元素相当于该对象的成员变量。数组本身就是对象Java中的对象是在堆中的因此数组无论保存原始类型还是其他对象类型数组对象本身是在堆中的。2、数组的声明和创建首先必须声明数组变量才能在程序中使用数组。下面是声明数组变量的语法dataType[] arrayRefVar; //首选的方法 或 dataType arrayRefVar[]; //效果相同但不是首选方法Java语言使用new操作符来创建数组语法如下dataType[] arrayRefVar new dataType[arraySize];数组的元素是通过索引访问的数组索引从0开始获取数组长度arrays.lengthpublic class ArrayDemo01 { //变量的类型 变量的名字 变量的值; //数组类型 public static void main(String[] args) { int[] nums;//1、声明了一个数组 int nums2[]; nums new int[10];//2、创建了一个数组 //3、给数组元素中赋值 nums[0] 1; nums[1] 2; nums[2] 3; nums[3] 4; nums[4] 5; nums[5] 6; nums[6] 7; nums[7] 8; nums[8] 9; nums[9] 10; System.out.println(nums[0]);//默认值是0 //计算所有元素的和 int sum 0; for(int i 0;i nums.length ; i){ sum nums[i]; } System.out.println(所有元素的和为 sum); } }一般来讲声明和创建会放一块int[] nums new int[10];3、内存分析Java内存堆1、存放new的对象和数组 2、可以被所有的线程共享不会存放别的对象引用栈1、存放基本的变量类型会包括这个基本类型的具体数值 2、引用对象的变量会存放这个引用在堆里面的具体地址方法区1、可以被所有的线程共享 2、包含了所有的class和static变量int[] nums;//1、声明了一个数组 int nums2[]; nums new int[10];//2、创建了一个数组 //3、给数组元素中赋值 nums[0] 1; nums[1] 2; ...4、三种初始化静态初始化int[] a {1,2,3}; Man[] mans {new Man(1,1),new Man(2,2)};动态初始化int[] a new int[2] a[0]1 a[1]2数组默认初始化数组是引用类型它的元素相当于类的实例变量因此数组一经分配空间其中的每个元素也被按照实例变量相同的方式被隐式初始化。public class ArrayDemo02 { public static void main(String[] args) { //静态初始化 int[] a {1,2,3,4,5,6,7,8}; System.out.println(a[0]); //动态初始化包含默认初始化 int[] b new int[10]; b[0] 10; System.out.println(b[0]); } }5、数组边界下表合法区间[0,length-1],如果越界就会报错public static void main(String[] args){ int[] a new int[2]; System.out.println(a[2]); }ArrayIndexOutOfBoundsException:数组下标越界异常6、数组使用普通的for循环public class ArrayDemo03 { public static void main(String[] args) { int[] arrays {1,2,3,4,5}; //打印所有元素 for(int i 0 ; i arrays.length ; i){ System.out.println(arrays[i]); } System.out.println(); //计算所有元素的和 int sum 0; for (int i 0 ; i arrays.length ; i){ sum arrays[i]; } System.out.println(总和为 sum); //查找最大的元素 int max arrays[0]; for(int i 1 ; i arrays.length ; i ){ if (max arrays[i]){ max arrays[i]; } } System.out.println(); System.out.println(最大为 max); } }For-Each循环public class ArrayDemo04 { public static void main(String[] args) { int[] arrays {1,2,3,4,5}; //JDK1.5,没有下标 for (int array : arrays) { //arrays.for System.out.println(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[] reverseArray reverseArray(arrays); printArray(reverseArray); } //打印数组元素 public static void printArray(int[] arrays){ for (int i 0; i arrays.length; i) { System.out.println(arrays[i] ); } } public static int[] reverseArray(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; } }7、多维数组多维数组可以看成是数组的数组比如二维数组就是一个特殊的一维数组其每一个元素都是一个一维数组。二维数组int a[][] new int[2][5]; //以上二维数组a可以看成一个两行五列的数组。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}}; printArray(array[0]); } public static void printArray(int[] arrays){ for (int i 0; i arrays.length; i) { for (int j 0; j arrays[i].length; j){ System.out.println(arrays[i][j]); } } } }8、Arrays类数组的工具类java.util.Arrays由于数组对象本身并没有什么方法可以供我们调用但API中提供了一个工具类Arrays供我们使用从而可以对数据对象进行一些基本的操作。Arrays类中的方法都是static修饰的静态方法在使用的过程中可以直接使用类名进行调用而”不用“使用对象来调用注意是”不用“而不是”不能“具有以下通常功能给数组赋值fill方法给数组排序sort方法升序排序比较数组equals方法比较数组中的元素值是否相等查找数组元素通过binarySearch方法能对排序好的数组进行二分查找法操作9、冒泡排序两个两个比较将较小的前移。import java.util.Arrays; public class ArrayDemo07 { public static void main(String[] args) { int[] arrays {4,5,2,6,7,3,8,1}; int[] sort sort(arrays); System.out.println(Arrays.toString(sort)); } public static int[] sort(int[] array){ int change 0; for (int i 0; i array.length-1; i) { for (int j 0; j array.length-1-i; j){ if(array[j] array[j1]){ change array[j]; array[j] array[j1]; array[j1] change; } } } return array; } }10、稀疏数组编写五子棋游戏中有存盘退出和续上盘的功能。问题因为该二维数组的很多值是默认值0因此记录了很多没有意义的数据。解决方式稀疏数组当一个数组中大部分元素为0或者为同一值的数组时可以使用稀疏数组来保存该数组。稀疏数组处理方式记录数组一共有几行几列有多少个不同值把具有不同值的元素和行列以及值记录在一个小规模的数组中从而缩小程序的规模package array; import java.util.Arrays; public class ArrayDemo08 { public static void main(String[] args) { int[][] array1 new int[11][11]; array1[1][2] 1; array1[2][3] 2; for (int[] ints : array1) { for (int anInt : ints) { System.out.print(anInt \t); } System.out.println( ); } System.out.println(); int sum 0; for (int i 0; i array1.length; i) { for (int j 0; j array1[i].length; 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(稀疏数组); 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); } } }