typora-root-url: images
java13编程基础之数组深入
大纲
一维数组
概述
数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。
这些按序排列的同类数据元素的集合称为数组“[]”。
特点
定长
长度一旦确定不可以改变。
相同数据类型
其元素必须是 相同 类型,不允许出现混合类型。数组中的元素可以是任何数据类型,包括基本类型和引用类型。
位置有序
元素所在的位置是有序的。
数组本身属于引用类型
数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象Java 中对象是在堆中的,因此数组无论保存基本类型还是其他对象类型,数组对象本身是在堆中的。
数组中可以存储任意类型的数据
定义
数组声明格式
数据类型[]数组名称;--推荐使用
数据类型数组名称[];
double[]arr;
chararr2[];
注意 : 引用数据类型只声明不赋值存在默认值null
数组初始化
动态初始化
数组定义与为数组元素分配空间和赋值的操作分开进行
数据类型[] 数组名=new 数据类型[长度];
int[]data=newint[5];
注意:元素为引用数据类型的数组中的每一个元素都需要实例化。
Person[]people; //声明说组
people=newPerson[3]; //创建数组
people[0]=newPerson();//数组中元素实例化
people[1]=newPerson();
people[2]=newPerson();
静态初始化
在定义数组的同时就为数组元素分配空间并赋值
数据类型[] 数组名=new 数据类型[]{值1,值2...};
数据类型[] 数组名={值1,值2...}; --当面的简写方式
int[] arr=new int[]{1,3,4,6};
int[] arr2={1,2,3,4,5};
注意: 对于返回值类型为数组类型的方法来说,我们可以return new int[3];,我们也可以return new int[]{1, 2, 3};,但我们不可以return {1, 2, 3};。即简写方式,其不能脱离数组的声明,{1, 2, 3}并不能返回一个数组对象。
一维数组对象演示图
数组的默认值
数组中的元素只声明不赋值存在默认值,数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化。
一般规律为数值型数组默认值为 0,引用型数组默认值为 null:
数组类型默认初始值
byte0
short0
int0
long0
char编码为0的字符
String(引用类型)null
float0.0
double0.0
booleanfalse
使用
数组元素的界限
定义并用 new 为之分配空间之后,才可以引用数组中的每个元素,数组元素的引用方式为:
arrayName[index];
index为数组元素下标|索引,可以是整型常量或整型表达式 , 可以根据数组元素的下标操作数组中数据。如:
arr1[3] = 5; //为数组索引为0的空间位置赋值
arr2[0] = "张三"; //为数组索引为0的空间位置赋值
System.out.println(arr3[2]);//获取数组中索引为2的数据值
数组元素下标从0开始;长度为n的数组的合法下标取值范围为
0~n-1
每个数组都有一个属性length指明它的长度
a.length的值为数组a的长度(元素的个数)
数组元素遍历方式
(1)普通for循环
for(int 索引=0;索引<长度; 索引++){
数组名称[索引] = 值;
}
int[] arr={1,2,3,4};
//1.遍历数组---基本for循环
for(int i=0;i //变量i代表索引/元素的下标 System.out.println(arr[i]); } (2)增强for循环 for(元素类型 局部变量 : 数组){ 局部变量-->为数组中的每一个元素值,从左向右以此获取 } //2.遍历数组---增强for循环 for(int i : arr){ System.out.println(i); //i中存储数组的元素值,非索引 } 数组基本练习 //A:遍历int类型的数组 依次输出每个数组元素 public static void printArray(int[] arr){ //循环遍历数组下标 for(int i=0;i System.out.println("输出int类型数组的每一个元素"+arr[i]); } } //B:逆序:倒叙输出数组元素 public static void printArr(String[] arr){ for(int i=arr.length-1;i>=0;i--){ System.out.println(arr[i]); } } //C:最值:获取数组中的最大值和最小值 public static void maxMinValue(int[] arr){ //假设数组中的第一个元素当成最大值 int max=arr[0]; //假设数组中的第一个元素当成最大值 int min=arr[0]; //遍历数组 for(int i=0;i //比较数组元素与max if(max max=arr[i]; } //比较数组元素与min if(min>arr[i]){ min=arr[i]; } System.out.println("数组中最大的值为max"+max); System.out.println("数组中最小的值为min"+min); } } Arrays 该类提供了关于数组操作的API. 如何查看API Arrays中常用方法 打印数组----toString方法。 比较两个数组是否相同----equals方法。 数组排序----sort方法。 数组查找----binarySearch 方法。 数组拷贝----copyOf方法。 数组拷贝----copyOfRange方法。 String[] arr1={"hello","shsxt"}; String[] arr2={"hello","shsxt"}; System.out.println(arr1.equals(arr2)); //false //1.Arrays.equals() 先判断两个数组的length是否相等,如果相等,再比内容,如果不相等,直接返回false System.out.println(Arrays.equals(arr1, arr2)); //2.Arrays.toString 字符串形式打印数组信息 System.out.println(Arrays.toString(arr1)); //3.Arrays.sort() 升序 int[] arr3={12,7,0,6,-32}; Arrays.sort(arr3); //-32 0 6 7 12 String[] arr4={"ab","a","bc","abc"}; //根据Unicode表中的值 Arrays.sort(arr4); //a ab abc bc //4.Arrays.binarySearch( 数组, 元素) ) :二分法查找 查找元素在数组中出现的索引 //前提:先升序排序,才能二分法查找 //找到返回索引,找不到返回-(插入点)-1 Arrays.sort(arr3); System.out.println(Arrays.binarySearch( arr3, 16)); // -6 经典案例实现-点名器 运行代码,随机打印班级同学名字 //1.数组存储姓名,用String数据类型 String[] names={"杰克","戴维琼斯","伊丽莎白","爱丽丝"}; //2.遍历数组,打印出所有姓名 for(int i=0;i System.out.println(names[i]); } //3.随机出一个人名 //利用随机数,生成一个证书,作为索引,到数组中查找对应的元素 Random ran=new Random(); //随机数的范围是[0,names.length-1] int index=ran.nextInt(names.length); //括号中填写的最大数是获取不到的,因为nextInt获取的范围是左闭右开区间 System.out.println(names[index]); 二维数组 二维数组可以看成以数组为元素的数组。 其实多维数组不仅仅只有二维数组,还有三维数组,四维数组..., 但是三维以上很少见到,所以大家重点了解二维数组即可。 举例 int [][] a = {{1,2},{3,4,0,9},{5,6,7}}; 初始化 动态初始化 数组定义与为数组元素分配空间和赋值的操作分开进行 数据类型[][] 数组名 = new 数据类型[一维][二维]; 注意:这种初始化方式,每一个内层的二位数组长度相同 int[][] a=new int[3][2]; a[0][0] = 1; a[0][1] = 2; 数据类型[][] 数组名 = new 数据类型[一维][]; 内层数组需要我们自己去创建(下面可以用一维数组的创建方式) 数组名[一维数组索引值] = new 数据类型[二维]; int[][] a=new int[3][]; arr[0]=new int[2]; arr[1]=new int[]{3,4,5,6}; arr[2]=new int[]{7,8,9}; arr[0][0] = 1; arr[0][1] = 2; 静态初始化 在定义数组的同时就为数组元素分配空间并赋值 数据类型[][] 数组名 = new 数据类型[][]{{...},{...},{...}}; 数据类型[][] 数组名 = {{...},{...},{...}}; --简化写法 int[][] arr1=new int[][]{{5,4,8},{3,8},{1}}; char[][] arr2={{'a'},{'b','c'}}; 遍历方式 双重循环实现多维数组的遍历 //普通for循环嵌套增强for循环 for(int i=0;i<=arr1.length-1;i++){ for(int j:arr1[i]){ System.out.println(j); } } //增强 for循环嵌套普通for循环 for(int[] arr:arr1){ for(int i=0;i<=arr.length-1;i++){ System.out.println(arr[i]); } } //普通for嵌套普通for循环 ... //增强for嵌套增强for循环 ... Arrays中提供操作多维数组的方法: static boolean deepEquals(Object[] a1, Object[] a2) 如果两个指定的数组彼此 深度相等 ,则返回 true 。 static String deepToString(Object[] a) 返回指定数组的“深度内容”的字符串表示形式。 double[][] arr1= new double[][] {{1.0,2.0},{3.0,4.0,5.0},{6.0}}; double[][] arr2= new double[][] {{1.0,2.0},{3.0,4.0,5.0},{6.0}}; System.out.println(Arrays.deepToString(arr1)); //[[1.0, 2.0], [3.0, 4.0, 5.0], [6.0]] System.out.println(Arrays.deepEquals(arr1, arr2)); //true