Java基础21(数组)

数组

(1)数组:
数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。
即:数(数据)组(一组)就是一组数据

引出数组:
求出农场里六只鸡的平均体重,分别是:3,5,1,3.4,2,50。

传统代码实现:

double hen1 = 3;
double hen2 = 5;
double hen3 = 1;
double hen4 = 3.4;
double hen5 = 2;
double hen6 = 50;

double totalWeight = hen1 + hen2 + hen3 + hen4 + hen5 + hen6;
double avgWeight = totalWeight / 6;
System.out.pirntln("总体重="+ totalWeight + "平均体重=" + avgWeight);

用数组实现:

//定义一个数组
//1.double[] 表示是double类型的数组,数组名 hens
//2.{3,5,1,3.4,2,50}表示数组的值/元素,依次表示数组的第几个元素
double[] hens = {3,5,1,3.4,2,50};

//遍历数组得到数组的所有元素的和 使用for循环
//1.可以通过 hens[下标]来访问数组的元素
//  下标是从 0 开始编号,比如第一个元素就是hens[0]
//  第二个元素就是hens[1],以此类推
//2.通过for循环就可以循环的访问 数组的元素/值
//3.使用一个变量 totalWeight 将各个元素累积

double totalWeight = 0;
for(int i = 0;i<6;i++){
  //System.out.println("第"+(i+1)+"个元素的值="+hens[i]);
  totalWeight + = hens[i];
}
  System.out.pirntln("总体重="+ totalWeight + "平均体重=" + avgWeight);

(2)数组的定义:
使用方式1 - 动态初始化
数据类型 数组名 [ ] = new 数据类型 [ 大小 ]
int a [] = new int [5]; // 创建了一个数组,名字a,存放5个int

数组的引用(使用/访问/获取数组元素):
数组名[下标/索引/index]
比如:你要使用a数组的第3个数 a[2],数组的下标从 0 开始。

入门案例:

//循环输入5个成绩,保存到double数组,并输出
//步骤
//1.创建一个double数组,大小 5

double scores[] = new double[5];
//2.循环输入
//scores.length 表示数组的大小/长度

Scanner scs = new Scanner(System.in);
for(int i=0;i<scores.length;i++){
   System.out.println("请输入第"+(i+1)+"个元素的值");
   scores[i] = sc.nextDouble();
}
//输出,遍历数组
System.out.println("==数组的元素/值的情况如下:==");
for(int i = 0; i<scores.length;i++){
    System.out.println("第"+(i+1)+"个元素的值="+scores[i]);
}   

使用方式2 - 动态初始化

先声明数组
语法:数据类型 数组名 [] ;也可以 数据类型 [] 数组名;
int a [] ; 或者 int [] a;

创建数组

语法:数组名 = new 数据类型 [ 大小 ];

a = new int[10];

//(1)第1种动态分配方式
//double scores[] = new double[5];
//(2)第2种动态分配方式 ,先声明数组,再new分配空间
//double scores[]; //声明数组,这时 scores是null
//scores = new double[5]; //分配内存空间,可以存放数据

使用方式3 - 静态初始化

初始化数组

语法:数据类型 数组名[] = {元素值,元素值…}

int a[] ={2,5,6,7,8,89,90,34,56},如果知道数组有多少个元素,具体值上面的用法相当于 : int a[] = new int[9];
a[0] = 2;a[1]=5;a[2]=6;a[3]=7;a[4]=8;
a[5]=89;a[6]=90;a[7]=34;a[8]=56;

入门案例【养鸡场】

double hens[] = {3,5,1,3.4,2,50};
等价
double hens[] = new double[6];
hens[0] = 3; hens[1]=5; hens[2]=1; hens[3]=3.4; hens[4]=2; hens[5]=50;

(3)注意事项:

//1.数组是多个相同类型数据的组合,实现对这些数据的统一管理

int [] arr1 = {1,2,3,60,"hello"}; //会报错,因为hello为String类型不为int类型

double[] arr2={1.1,2.2,3.3,60.6,100};//不会报错,int会自动转换成double类型

//2.数组中的元素是可以任何数据类型,包括基本数据类型和引用数据类型,但是不能混用
String[] arr3 = {"北京","jack","amdin"};

//3.数组创建后,如果没有赋值,有默认值int 0, short 0, byte 0, long 0, float 0.0, double 0.0, char \u0000, boolean false, String null 

short[] arr4 = new short[3];
System.out.println("====数组arr4====");
for(int i=0;i<arr.length;i++){
 System.out.println(arr4[i]);
} 

输出
0
0
0

//4.使用数组的步骤 
//(1).声明数组并开辟空间
//(2).给数组各个元素赋值
//(3)使用数组

//5.数组的下标是从0开始的。

//6.数组下标必须在指定范围内使用,否则会报:下标越界异常。 比如: int [] arr = new int[5];,则有效下标为0-4
//即数组的下标/索引 最小:0 最大:数组长度-1(4)

//7.数组属于引用类型,数组型数据是对象(object)

(4)数组应用案例:
1)创建一个char类型的26个元素的数组,分别放置 ‘A’ - ‘Z’。使用for循环访问所有元素并打印出来。提示:char类型数据运算 ‘A’+1->‘B’

思路分析:

1.定义一个数组 char arr[] = new char[26];
2.因为 'A' + 1 = 'B' 类推,所以老师使用for来赋值
3.使用for循环访问所有元素

代码实现:

public static void main(String[] args) {
		//创建一个char类型的26个元素的数组,
		//分别放置      'A' - 'Z'。使用for循环访问所有元素并打印出来。
		//提示:char类型数据运算 'A'+1->'B'
		char arr[]=new char[26];
		for(int i=0;i<=arr.length-1;i++){
			//chars是 char[]
			//chars[i]是char
			arr[i]=(char) ('A'+i); //'A' + i 是int,需要强制转换
			System.out.print(arr[i]+" ");
		}
	}

2)请求出一个数组 int [] 的最大值 {4,-1,9,10,23,56,999},并得到对应的下标。

思路分析:

1.定义一个int数组 int [] arr ={4,-1,9,10,23,56,999};
2.假定arr[0]是最大值,maxIndex=0;
3.从下标1开始遍历数组arr,如果max<当前元素,说明max不是真正的最大值,max=当前元素;maxIndex=当前元素下标
3.遍历这个数组arr后,max就是真正的最大值,maxIndex最大值对应的下标

代码实现:

//解法一:
public static void main(String[] args) {
		//请求出一个数组 int [] 的最大值 {4,-1,9,10,23,56,999},并得到对应的下标。
		int arr[] = {4,-1,9,10,23,56,999};
		int max=arr[0]; //假定第一个元素就是最大值
		int maxIndex = 0;
		
		for(int i=1;i<arr.length;i++){
			if(max<arr[i]){ //如果max<当前元素
				max=arr[i]; //把max 设置成当前元素
				maxIndex = i;
			}
		}
		//遍历数组arr,max就是真正的最大值,maxIndex最大值下标
		System.out.println("max="+max+"maxIndex="+maxIndex);
	}


//解法二:
public static void main(String[] args) {
		//请求出一个数组 int [] 的最大值 {4,-1,9,10,23,56,999},并得到对应的下标。
		int arr[] = {4,-1,9,10,23,56,999};
		int max=0;
		int num=0;
		for(int i=0;i<=arr.length-1;i++){
			if(max<arr[i]){
				max=arr[i];
				num=i;
			}
		}
		System.out.println("数组最大值为:"+max+",下标为:"+num);
	}

(5)数组赋值机制
1.基本数据类型赋值,这个值就是具体的数据,而且相互不影响。

2.数组在默认情况下是引用传递,赋的值是地址。

//基本数据类型赋值,赋值方式为值拷贝
//n2的变化,不会影响到n1的值
int n1=10;
int n2=n1;

n2=80;
System.out.println("n1=" + n1);//10
System.out.println("n1=" + n1);//80

//数组在默认情况下是引用传递,赋的值是地址,赋值方式为引用赋值
//是一个地址,arr2,变化会影响到arr1
int [] arr1 = {1,2,3];
int [] arr2 = arr1; //把arr1赋给arr2
arr2[0]=10;

//输出arr1的值
System.out.println("===arr1的元素===");
for(int i =0;i<arr.length;i++){
   System.out.println(arr1[i]);
}

//输出的值为:
//10
//2
//3   

图例:
在这里插入图片描述
(6)数组拷贝
将int [] arr = {10,20,30};拷贝到arr2数组,要求数据空间式独立的。

public static void main(String[] args) {	
		int arr1[] ={10,20,30};		
		//创建一个新的数组arr2,开辟新的数据空间
		//大小为arr1.length;
		int arr2[] =new int[arr1.length];
		//遍历arr1,把每个元素拷贝到arr2对应的元素位置
		for(int i=0;i<=2;i++){
			arr2[i]=arr1[i];
		}
		//修改arr2
		arr2[0]=200;
		
		//输出arr1
		for(int i=0;i<arr1.length;i++){
			System.out.println(arr1[i]);  //10,20,30
		}
		
		//输出arr2
		for(int j=0;j<=2;j++){
			System.out.println(arr2[j]);
		}
	}

(7)数组反转
要求:把数组的元素内容反转
arr{11,22,33,44,55,66} => {66,55,44,33,22,11}

解法一:

public static void main(String[] args) {
		//arr{11,22,33,44,55,66} => {66,55,44,33,22,11}
		//定义数组
		int arr[]={11,22,33,44,55,66};
		//思路分析:
		
		//规律
		//1.把arr[0]和arr[5] 进行交换 {66,22,33,44,55,11};
		//2.把arr[1]和arr[4] 进行交换 {66,55,33,44,22,11};
		//3.把arr[2]和arr[3] 进行交换 {66,55,44,33,22,11};
		//4.一共要交换3 次 = arr.length /2
		//5.每次交换时,对应的下标是arr[i]和arr[arr.length-1-i]
		
		//代码
		int temp=0;
		for(int i=0;i<arr.length/2;i++){
			    temp=arr[arr.length-1-i];
			    arr[arr.length-1-i]=arr[i];
				arr[i]=temp;
		}
		for(int i=0;i<arr.length;i++){
			System.out.println(arr[i]);
		}
		
	}

解法二:逆序赋值

public static void main(String[] args) {
		//arr{11,22,33,44,55,66} => {66,55,44,33,22,11}
		//定义数组
		int arr[]={11,22,33,44,55,66};
		//使用逆序赋值方法
		//思路分析:
		//1.先创建一个新的数组arr2,大小 arr.length
		//2.逆序遍历arr ,将 每个元素拷贝到arr2的元素中(顺序拷贝)
		//加一个循环变量j->0 ->5
		
		//代码
		int arr2[] = new int[arr.length];
		for(int i=arr.length-1,j=0;i>=0;i--,j++){//逆序遍历arr
			arr2[j]=arr[i];
		}
		
		//4.当for循环结束,arr2就是一个逆序的数组{66,55,44,33,22,11}
		//5.让arr指向arr2数据空间,此时arr原来的数据空间就没有变量引用
		//会被当做垃圾销毁
		arr = arr2;
		
		//6.输出arr
		for(int i=0;i<arr.length;i++){
			System.out.println(arr[i]+"\t");
		}
	}

(8)数组添加
要求:实现动态的给数组添加元素效果,实现对数组扩容。
1)原始数组使用静态分配 int [] arr={1,2,3}
2)增加的元素,直接放在数组的最后 arr={1,2,3,4}
arrNew = {1,2,3,4}
3)用户可以通过如下方法来决定是否继续添加,添加成功,是否继续 y/n

第1步与第2步:代码实现与思路分析

public static void main(String[] args) {
		//1)原始数组使用静态分配 int [] arr={1,2,3}
		//2)增加的元素,直接放在数组的最后 arr={1,2,3,4}
		// arrNew = {1,2,3,4}
		//3)用户可以通过如下方法来决定是否继续添加,添加成功,是否继续 y/n

		//思路分析
		//1.定义初始数组 int[] arr ={1,2,3}
		//2.定义一个新的数组 int[] arrNew = new int[arr.length+1];
		//3.遍历arr数组,依次将arr的元素拷贝到arrNew数组
		//4.将 4 赋值给arrNew[arr.length-1] = 4; 把4赋给arrNew最后一个元素
		//5.让arr 指向 arrNew arr = arrNEew;那么arr数组就被销毁
		
		
		
		int arr[] ={1,2,3};
		int[] arrNew = new int[arr.length+1];
		for(int i=0;i<arr.length;i++){
			arrNew[i] = arr[i];
		}	
		//把4赋给arrNew最后一个元素
		arrNew[arrNew.length-1] = 4;
		//让arr指向 arrNew
		arr = arrNew;		
		//输出arr
		for(int i=0;i<arr.length;i++){
			System.out.println(arr[i]+" ");
		}		
	}

添加第三步是否需要继续添加:

	public static void main(String[] args) {
		//1)原始数组使用静态分配 int [] arr={1,2,3}
		//2)增加的元素,直接放在数组的最后 arr={1,2,3,4}
		// arrNew = {1,2,3,4}
		//3)用户可以通过如下方法来决定是否继续添加,添加成功,是否继续 y/n

		//思路分析
		//1.定义初始数组 int[] arr ={1,2,3}
		//2.定义一个新的数组 int[] arrNew = new int[arr.length+1];
		//3.遍历arr数组,依次将arr的元素拷贝到arrNew数组
		//4.将 4 赋值给arrNew[arr.length-1] = 4; 把4赋给arrNew最后一个元素
		//5.让arr 指向 arrNew arr = arrNEew;那么arr数组就被销毁
		//6.创建一个Scanner可以接收用户输入
        //7.因为用户什么时候退出,不能确定,所以使用do-while + break来控制
		
		Scanner sc = new Scanner(System.in);
		//初始化数组
		int arr[] ={1,2,3};
		do{
	    int[] arrNew = new int[arr.length+1];
		for(int i=0;i<arr.length;i++){
			arrNew[i] = arr[i];
		}
		System.out.println("请输入要添加的元素:");
		int addNum = sc.nextInt();
		//把addNum赋给arrNew最后一个元素
		arrNew[arrNew.length-1] =addNum;
		//让arr指向 arrNew
		arr = arrNew;
		//输出arr
		for(int i=0;i<arr.length;i++){
			System.out.println(arr[i]+" ");
		}
		//问用户是否继续
		System.out.println("是否继续添加 y/n");
		char key =sc.next().charAt(0);
		if(key == 'n'){  //如果输入n,就结束
			break;
		}
		}while(true);
	}

(9)数组缩减:
有一个数组{1,2,3,4,5},可以将该数组进行缩减,提示用户是否继续缩减,每次缩减最后哪个元素。当只剩下最后一个元素,提示,不能再缩减。

代码实现与思路:

public static void main(String[] args) {
    //有一个数组{1,2,3,4,5},可以将该数组进行缩减,提示用户是否继续缩减
    //,每次缩减最后那个元素。当只剩下最后一个元素,提示,不能再缩减。
		
		int arr[] ={1,2,3,4,5};
		Scanner sc = new Scanner(System.in);
		
		
		do{
		System.out.println("是否要删减第"+arr.length+"个元素?y/n");
		char shan = sc.next().charAt(0);
		
		//判断用户输入的是否为n,是则结束删除
		if(shan=='n'){
			System.out.println("删除结束");
			break;
		}
		//创建新数组arrNew
		int arrNew[] =new int[arr.length-1];

		//把arr数组中的每个元素赋给arrNew数组,并且删掉最后一个元素
		for(int i=0;i<arrNew.length;i++){
			arrNew[i]=arr[i];
		}
		
		//把arrNew拷贝给arr
		arr = arrNew;
		
		//输出数组arr
		for(int i=0;i<arr.length;i++){
			System.out.println(arr[i]+" ");
		}
		
		//当数组只剩最后一个元素,则不能再缩减
		if(arr.length==1){
			System.out.println("数组只剩最后一个元素,不能再缩减");
			break;
		}
		}while(true);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值