我欲与君相知,长命无绝衰
? ? ? ? ? ? ? ? ? ? ? ??——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.格式:
? ? ? ? 数组名.length
2.注意:
? ? ? ? length后不要带小括号,length不是数组中的方法,而是数组中的一个属性
public static void main(String[] args) {
String[] arr1 = {"迪迦奥特曼","猫和老鼠","花园宝宝","海绵宝宝","圣斗士星矢","百变小樱魔术卡","喜羊羊与灰太狼"};
int len = arr1.length;
System.out.println("len = " + len);
}
1.概述“元素在数组中存储的位置(编号,下标)
2.特点:
? ? ? ? ①索引唯一
? ? ? ? ②索引都是从0开始的,最大索引是数组长度 -?1
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] = "王五";
}
public static void main(String[] args) {
//定义数组,长度为3
int[] 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();
}
}
public static void main(String[] args) {
//定义数组,长度为3
int[] 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);
}
}
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]);
}
将数组中元素全部打印:
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]);
}
①原因:
? ? ? ? 操作的索引超出了数组索引范围
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]);
}
}
①原因:
? ? ? ? 当一个对象为null时,在调用此对象中的其他成员
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr.length);
arr = null;
System.out.println(arr.length);
}
以上两个问题我们只需知道原因即可
求出数组中的元素最大值(元素和元素之间作比较,每次都取较大值,比到最后,最大值就出来了)
步骤:
? ? ? ? ①定义一个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小于遍历出来的元素,证明遍历出来的元素大,就将大的重新赋值给max
if(arr[i]>max){
max = arr[i];
}
}
//④直接输出max
System.out.println(max);
}
随机产生10个[0,100]之间的整数,统计既是3又是5的倍数的个数
步骤:
? ? ? ? ①创建Random对象,用于生成随机数
? ? ? ? ②定义一个数组,长度为10
? ? ? ? ③定义一个遍历count,用于统计符合条件的数据个数
? ? ? ? ④遍历数组,判断元素是否符合指定的条件,如果符合,count++
? ? ? ? ⑤输出count
public static void main(String[] args) {
//①创建Random对象,用于生成随机数
Random rd = new Random();
//②定义一个数组,长度为10
int 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++;
}
}
//⑤输出count
System.out.println("count = " + count);
}
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("]");
}
随机统计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++;
}
}
//⑥输出count
System.out.println("count = " + count);
}
键盘录入一个整数,找出整数在数组中存储的索引位置
步骤:
? ? ? ? ①创建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.如果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]+" ");;
}
}
数组扩容
????????定义一个数组: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]+" ");
}
}
?
数组合并
? ? ? ? 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]+" ");
}
}