我欲与君相知,长命无绝衰
——24.1.16
一、数组的定义
1.概述:数组是一个容器,数组本身属于引用数据类型
2.作用:一次存储多个数据
3.特点:
①既可以存储基本类型的数据,也可以存储引用类型的数据
②定长(定义数组时的长度为多长,最多能存在多少个数据)
4.定义:
①动态初始化:在定义数组的时候,我们没有给具体的数据,只指定了长度
数据类型[ ] 数组名 = new 数据类型[长度]
数据类型 数组名[ ] = new 数据类型[长度]
各部分解释:
等号左边的是数据类型,规定了数组中只能存储什么类型的数据
[ ]:代表的是数组,一个[ ]一维数组,两个[ ]代表二维数组
数组名:自己取的名字(小驼峰)
new:代表的是创建数组
等号右边的数据类型,要和等号左边的数据类型保持一致
[长度]:指定数组长度,规定了数组最多能存多少个数据
②静态初始化:在定义数组的时候,我们直接给出了数据
数据类型[ ] 数组名 = new 数据类型[ ]{元素1,元素2,……} -> 不推荐使用
数据类型 数组名[ ] = new 数据类型[ ]{元素1,元素2,……} -> 不推荐使用
③简化的静态初始化:
数据类型[ ] 数组名 = {元素1,元素2,……} -> 推荐使用
5.动态初始化和静态初始化的区别:
①动态初始化:定义的时候只指定了长度,没有存具体的数据
当只知道长度,但不知道具体数据时,可以使用动态初始化
②静态初始化:定义的时候就直接知道存什么数据
public static void main(String[] args) {//动态初始化int[] arr1 = new int[3];char[] arr2 = new char[5];String[] arr3 = new String[7];//静态初始化 -> 简化int[] arr4 = {1,1,4};//只属于初始化,没有定长String[] arr5 = {"lcl","一切都会好的","万事胜意"};
}
二、数组操作
1.获取数组的长度
1.格式:
数组名.length
2.注意:
length后不要带小括号,length不是数组中的方法,而是数组中的一个属性
public static void main(String[] args) {String[] arr1 = {"迪迦奥特曼","猫和老鼠","花园宝宝","海绵宝宝","圣斗士星矢","百变小樱魔术卡","喜羊羊与灰太狼"};int len = arr1.length;System.out.println("len = " + len);}
2.索引
1.概述“元素在数组中存储的位置(编号,下标)
2.特点:
①索引唯一
②索引都是从0开始的,最大索引是数组长度 - 1
3.索引的作用:
我们将来操作元素,必须通过索引来操作
存数据,要指出索引
取数据,要指定索引
查数据,要指定索引
3.存储数据
1.格式:
数组名[索引值] = 值 -> 将等号右边的数据放在数组索引的位置上
public static void main(String[] args) {//定义一个数组int[] arr = new int[3];arr[0] = 100;arr[1] = 200;arr[2] = 300;String[] arr2 = new String[3];arr2[0] = "张三";arr2[1] = "李四";arr2[2] = "王五";}
案例1
public static void main(String[] args) {//定义数组,长度为3int[] arr = new int[3];//创建Scanner对象Scanner sc = new Scanner(System.in);//键盘录入,将数据存储在数组中
// arr[0] = sc.nextInt();
// arr[1] = sc.nextInt();
// arr[2] = sc.nextInt();for (int i = 0; i < arr.length; i++) {arr[i] = sc.nextInt();}}
案例2
public static void main(String[] args) {//定义数组,长度为3int[] arr = new int[3];//创建Random对象Random rd = new Random();//将0~9之间随机一个整数,存储到数组中
// arr[0] = rd.nextInt();
// arr[1] = rd.nextInt();
// arr[2] = rd.nextInt();for (int i = 0; i < arr.length; i++) {//random范围:左闭右开arr[i] = rd.nextInt(10);}}
4.获取数据
1.格式:
数组名[索引值]
2.细节说明
①直接输出数组名,会输出数组在内存中的地址值
②地址值:数组在内存中的一个身份证号,唯一标识,我们可以通过这个唯一标识到内存中能找到这个数组,从而操作这个数组中的数据
③如果数组中没有存数据,那么直接获取也能获取出来一些数据(元素的默认值)
整数:0
小数:0.0
字符:'\u0000' -> 对应的int值是0
布尔:false
引用:null
public static void main(String[] args) {int[] arr = new int[3];//直接输出数组名,会输出数组在内存中的地址值System.out.println(arr);//数组名[索引值],如果数组中没有存数据,那么直接获取也能获取出来一些数据(元素的默认值)System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);}
5.遍历数组
将数组中元素全部打印:
public static void main(String[] args) {int[] arr = new int[3];//存数据arr[0] = 100;arr[1] = 200;arr[2] = 300;//输出数组arr地址System.out.println(arr);//输出数组元素System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);System.out.println();//创建字符串数组String[] arr1 = new String[3];//输出数组arr1地址System.out.println(arr1);//存数据arr1[0] = "张无忌";arr1[1] = "张三丰";arr1[2] = "张翠山";System.out.println(arr1[0]);System.out.println(arr1[1]);System.out.println(arr1[2]);}
此种方式当数组元素过多时,十分复杂
1.遍历:将元素从数组中一个一个的获取出来(循环)
//遍历,数组多长,就循环多少次for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}for (int j = 0; j < arr1.length; j++) {System.out.println(arr1[j]);}
三、操作数组时两个常见的问题
1.数组索引越界异常_ArrayIndexOutOfBoundsException
①原因:
操作的索引超出了数组索引范围
public static void main(String[] args) {int[] arr = new int[3];arr[0] = 100;arr[1] = 200;arr[2] = 300;arr[3] = 400;}
public static void main(String[] args) {int[] arr = new int[3];arr[0] = 100;arr[1] = 200;arr[2] = 300;//arr[3] = 400;//超出了arr的索引范围for (int i = 0; i < 4; i++) {System.out.println(arr[i]);}}
2.空指针异常_NullPinterException
①原因:
当一个对象为null时,在调用此对象中的其他成员
public static void main(String[] args) {int[] arr = new int[3];System.out.println(arr.length);arr = null;System.out.println(arr.length);}
以上两个问题我们只需知道原因即可
四、数组练习
练习1
求出数组中的元素最大值(元素和元素之间作比较,每次都取较大值,比到最后,最大值就出来了)
步骤:
①定义一个max,接收两个元素比较之后的较大值
②遍历数组,将每一个元素获取出来进行比较
③判断,如果max小于遍历出来的元素,证明遍历出来的元素大,就将大的重新赋值给max
④直接输出max
public static void main(String[] args) {int[] arr = {5,4,6,9,8,7,3,1,2,5};//①定义一个max,接收两个元素比较之后的较大值int max = arr[0];int i;//②遍历数组,将每一个元素获取出来进行比较for (i = 0; i < arr.length; i++) {//③判断,如果max小于遍历出来的元素,证明遍历出来的元素大,就将大的重新赋值给maxif(arr[i]>max){max = arr[i];}}//④直接输出maxSystem.out.println(max);}
练习2
随机产生10个[0,100]之间的整数,统计既是3又是5的倍数的个数
步骤:
①创建Random对象,用于生成随机数
②定义一个数组,长度为10
③定义一个遍历count,用于统计符合条件的数据个数
④遍历数组,判断元素是否符合指定的条件,如果符合,count++
⑤输出count
public static void main(String[] args) {//①创建Random对象,用于生成随机数Random rd = new Random();//②定义一个数组,长度为10int arr[]=new int[10];//③定义一个遍历count,用于统计符合条件的数据个数int count = 0;//④遍历数组,判断元素是否符合指定的条件,如果符合,count++for (int i = 0; i < arr.length; i++) {arr[i]= rd.nextInt(101);if(arr[i]%3==0&&arr[i]%5==0){count++;}}//⑤输出countSystem.out.println("count = " + count);}
练习3
1.定义一个数组 int[ ] arr = {1,2,3,4}
2.遍历数组,输出元素按照[1,2,3,4]
public static void main(String[] args) {int[] arr = {1,2,3,4};System.out.print("[");for (int i = 0; i < arr.length; i++) {if(i==arr.length-1){System.out.print(arr[i]);}else {System.out.print(arr[i] + ",");}}System.out.print("]");}
练习4
随机统计50个1~100之间的整数,统计偶数个数
步骤:
①创建Random对象
②定义长度为50的数组
③随机50个存储到数组中
④定义count,用于统计
⑤遍历数组,判断,如果是偶数,count++
⑥输出count
public static void main(String[] args) {//①创建Random对象Random rd = new Random();//②定义长度为50的数组int arr[] = new int[50];//③定义count,用于统计int count =0;for (int i = 0; i < arr.length; i++) {//④随机50个存储到数组中arr[i] = rd.nextInt(100)+1;//⑤遍历数组,判断,如果是偶数,count++if(arr[i]%2==0){count++;}}//⑥输出countSystem.out.println("count = " + count);}
练习5
键盘录入一个整数,找出整数在数组中存储的索引位置
步骤:
①创建scanner对象
②定义数组,随便存几个数据
③定义一个变量,此变量用来表示数组中是否有要查找的数据
④遍历数组,在遍历的过程中判断是否和录入的数相等,如果相等,则输出索引
public static void main(String[] args) {//①创建scanner对象Scanner sc = new Scanner(System.in);System.out.println("请您输入一个数");int num = sc.nextInt();//②定义数组,随便存几个数据int[] arr = {54,36,27,18,45,63,72,81,9};//③定义一个变量,此变量用来表示数组中是否有要查找的数据int flag = 0;//④遍历数组,在遍历的过程中判断是否和录入的数相等,如果相等,则输出索引for (int i = 0; i < arr.length; i++) {if(arr[i]==num){System.out.println(i);flag = 1;break;}}if(flag == 0){System.out.println("数组中没有这个值");}}
五、数组高级使用
练习1 数组复制
1.如果arr索引值在等号右边,证明是获取值,如果在等号左边,证明是存值
arr[0] = 100;
2.arr1[i] = arr2[i] -> 先看等号右边的,相当于将arr2数组的索引上的数据,保存到arr1数组的0索引上
public static void main(String[] args) {int[] arr1 = {1,2,3,4};int[] arr2 = new int[4];for (int i = 0; i < arr1.length; i++) {arr2[i] = arr1[i];}for (int i = 0; i < arr2.length; i++) {System.out.print(arr2[i]+" ");;}}
练习2 数组扩容
数组扩容
定义一个数组:int[] arr1 = {1,2,3,4,5},将数组由原来的长度扩容到10
public static void main(String[] args) {int[] oldArr = {1,2,3,4,5};//创建新数组int[] newArr = new int[10];//将老数组中的元素赋值给新数组中for (int i = 0; i < oldArr.length; i++) {newArr[i] = oldArr[i];}//将新数组的地址值给老数组oldArr = newArr;System.out.println(oldArr.length);for (int i = 0; i < oldArr.length;i++) {System.out.print(oldArr[i]+" ");}}
练习3 数组合并
数组合并
int[] arr1 = {1,2,3}
int[] arr2 = {4,5,6}
public static void main(String[] args) {int[] arr1 = {1,2,3};int[] arr2 = {4,5,6};//创建新数组int[] arr3 = new int[arr1.length+ arr2.length];//先将arr1的元素放到arr3中for (int i = 0; i < arr1.length; i++) {arr3[i] = arr1[i];}//由于我们已经保存了arr1中的三个元素//所以我们保存arr2元素时,就不能从arr3的索引0开始了,不然从arr1中保存的元素会被arr2的元素覆盖//arr2的元素需要从arr3的索引3开始保存int j = 0;for (int i = arr1.length; i < arr3.length; i++) {arr3[i] = arr2[j];j++;}for (int i = 0; i < arr3.length; i++) {System.out.print(arr3[i]+" ");}}