数组
1.数组的概述
-
多个相同类型的数据按照一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
-
数组相关的概念:
-
数组名
-
下标(或索引、角标)
-
元素
-
数组的长度,元素的个数
-
-
数组的特点:
-
数组是有序排列的
-
数组属于引用数据类型的变量,数组的元素可以是基本数据类型,也可以是引用数据类型
-
创建数组对象会在内存中开辟一整块连续的空间
-
数组的长度一旦确定,就不能修改
-
-
数组的分类:
-
按照维数,一维数组、二维数组......
-
按照数组元素类型,基本数据类型元素的数组、引用数据类型元素的数组
-
2.一维数组的使用
-
一维数组的声明和初始化
-
数组一旦初始化完成,其长度就确定了
-
-
如何调用数组的指定位置元素:通过角标的方式调用
-
数组的角标(或索引)从0开始,到数组的长度-1结束。
-
-
如何获取数组的长度
-
如何遍历数组
-
数组元素的默认初始化值
-
数组元素是整型:0
-
数组元素是浮点型:0.0
-
数组元素是char型:0或'\u0000',而非'0'
-
数组元素是boolean型:false
-
数组元素是引用数据类型:null
-
-
数组的内存解析
1 //一维数组的声明和初始化 2 int num;//声明 3 num=10;//初始化 4 int id=1001;//声明+初始化 5 6 int[] ids;//声明 7 //静态初始化:数组初始化和数组元素的赋值操作同时进行 8 ids=new int{1001,1002,1003}; 9 //动态初始化:数组初始化和数组元素的赋值操作分开进行 10 String[] names=new String[5];
1 //如何调用数组的指定位置元素:通过角标的方式调用 2 //数组的角标(或索引)从0开始,到数组的长度-1结束。 3 names[0]="张三"; 4 names[1]="李四"; 5 names[2]="王二"; 6 names[3]="小明"; 7 names[4]="老王";
1 //如何获取数组的长度 2 //属性:length 3 System.out.println(names.length);//5 4 System.out.println(ids.length);//3
1 //如何遍历数组 2 for(int i=0;i){ 3 System.out.println(names[i]); 4 }
1 //数组元素的默认初始化值 2 int[] arr=new int[4]; 3 for(int i=0;i){ 4 System.out.println(arr[i]); 5 } 6 7 short[] arr1=new short[4]; 8 for(int i=0;i ){ 9 System.out.println(arr1[i]); 10 } 11 12 char[] arr3=new char[4]; 13 for(int i=0;i ){ 14 System.out.println(arr3[i]); 15 } 16 17 boolean[] arr4=new boolean[4]; 18 for(int i=0;i ){ 19 System.out.println(arr4[i]); 20 } 21 22 String[] arr5=new String[4]; 23 for(int i=0;i ){ 24 System.out.println(arr5[i]); 25 }
1 //数组的内存解析
练习1:
升景坊单间短期出租4个月,5550元/月(水电煤公摊,网费35元/月),空调、卫生间、厨房齐全。屋内均是IT行业人士,喜欢安静,所以要求来租者最好是同行业年轻人,爱干净、安静。
1 int[] arr=new int{8,2,1,0,3}; 2 int[] index=new int{2,0,3,2,4,0,1,3,2,3,3}; 3 String tel=""; 4 for(int i=0;i){ 5 tel+=arr[index[i]];//18013820100 6 } 7 System.out.println("联系方式:"+tel);
练习2:
从键盘读入学生成绩,找出最高分,并输入学生成绩等级。
成绩>=最高分-10 等级为’A'
成绩>=最高分-20 等级为’B'
成绩>=最高分-30 等级为’C'
其余 等级为‘D'
1 //1.使用Scanner读取学生成绩 2 Scanner input=new Scanner(System.in); 3 System.out.println("请输入学生人数:"); 4 int number=input.nextInt(); 5 //2.创建数组,存储学生成绩,动态初始化 6 int[] scores=new int[number]; 7 //3.给数组中的元素赋值 8 System.out.println("请输入"+number+"个学生成绩:"); 9 for(int i=0;i){ 10 score[i]=input.nextInt(); 11 } 12 } 13 //4.获取数组中元素的最大值:最高分 14 int max=0; 15 for(int i=0;i ){ 16 if(max<scores[i]){ 17 max=scores[i]; 18 } 19 } 20 //5.根据每个学生成绩与最高分的差值,得到每个学生的等级,并输出等级和成绩 21 for(int i=0;i ){ 22 if(max-scores[i]<=10){ 23 lever='A'; 24 }else if(max-scores[i]<=20){ 25 lever='B'; 26 }else if(max-scores[i]<=30){ 27 lever='C'; 28 }else{ 29 lever='D'; 30 } 31 System.out.println("student"+i+"score is"+scores[i]+",grade is"+lever); 32 }
练习3:
定义数组,存放5个学生的成绩【成绩值自己设定】获得成绩之和,平均成绩,最小成绩,最大成绩。
1 import java.util.Scanner; 2 3 public class Text19 { 4 public static void main(String[] args) { 5 Scanner input=new Scanner(System.in); 6 int[] score=new int[5]; 7 int sum=0; 8 for (int i = 0; i <5 ; i++) { 9 System.out.println("请输入第"+(i+1)+"个人的成绩"); 10 score[i]=input.nextInt(); 11 sum=sum+score[i]; 12 } 13 System.out.println("总成绩为"+sum); 14 double avg=sum/5; 15 System.out.println("平均成绩为"+avg); 16 //获得最小成绩、最大成绩 17 int max=score[0]; 18 int min=score[0]; 19 for (int a:score) { 20 if (a>max){ 21 max=a; 22 } 23 if (a<min){ 24 min=a; 25 } 26 } 27 System.out.println("最小成绩为"+min); 28 System.out.println("最大成绩为"+max); 29 } 30 }
练习4:数组的复制
1)创建一个类,在main()方法中声明array1和array2两个变量,他们是int[]类型数组
2)使用大括号{ },把array1初始化为8个素数:2,3,5,7,11,13,17,19
3)显示array1内容
4)赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)。打印array1。
5)实现array2对array1数组的复制
1 int[] array1,array2; 2 array1=new int{2,3,5,7,11,13,17,19}; 3 4 //显示array1内容 5 for(int i=0;i){ 6 System.out.println(array1[i]+"\t"); 7 }//2,3,5,7,11,13,17,19 8 9 //赋值array2变量等于array1 10 array2=array1; 11 12 //修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2) 13 for(int i=0;i ){ 14 if(i%2==0){ 15 array2[i]=i; 16 } 17 } 18 19 //打印array1 20 for(int i=0;i ){ 21 System.out.println(array1[i]+"\t"); 22 }//0,3,2,7,4,13,6,19 23 24 //实现array2对array1数组的复制 25 array2=new int[array1.length]; 26 for(int i=0;i ){ 27 array2[i]=array1[i]; 28 }
练习5:数组的复制、反转、查找(线性查找、二分法查找)
1 String[] arr=new String{"JJ","DD","MM","BB","GG","AA"}; 2 //数组的复制 3 String[] arr1=new String[arr.length]; 4 for(int i=0;i){ 5 arr1[i]=arr[i]; 6 } 7 8 //数组的反转 9 //方法一: 10 for(int i=0;i ){ 11 String temp=arr[i]; 12 arr[i]=arr[arr.length-1-i]; 13 arr[arr.length-1-i]=temp; 14 } 15 //方法二: 16 for(int i=0,j=arr.length-1;i ){ 17 String temp=arr[i]; 18 arr[i]=arr[j]; 19 arr[j]=temp; 20 } 21 //遍历 22 for(int i=0;i ){ 23 System.out.println(arr[i]+"\t"); 24 } 25 26 //数组的查找 27 //线性查找 28 String dest="BB"; 29 boolean flag=true; 30 for(int i=0;i ){ 31 if(dest.equals(arr[i])){ 32 System.out.println("找到了指定元素位置为"+i); 33 flag=false; 34 break; 35 } 36 } 37 if(flag){ 38 System.out.println("很遗憾,没有找到"); 39 } 40 //二分法查找 41 //前提:所要查找的数组必须有序 42 int[] arr2=new int{-98,-34,2,34,54,66,79,105,210,333}; 43 int daes1=-34; 44 int head=0; 45 int end=arr2.length-1; 46 boolean flag1=true; 47 while(head<=end){ 48 int middle=(head+end)/2; 49 if(dest1==arr2[middle]){ 50 System.out.println("找到了指定元素位置为"+middle); 51 flag1=false; 52 break; 53 }else if(arr2[middle]>dest1){ 54 end=middle-1; 55 }else{ 56 head=middle+1; 57 } 58 } 59 if(flag1){ 60 System.out.println("很遗憾,没有找到"); 61 }
练习6:冒泡排序
1 int[] arr=new int{43,32,76,25,-98,0,64,33,-21,32,99}; 2 for(int i=0;i){ 3 for(int j=0;j ){ 4 if(arr[j]>arr[j+1]){ 5 int temp=arr[j]; 6 arr[j]=arr[j+1]; 7 arr[j+1]=temp; 8 } 9 } 10 } 11 for(int a:arr){ 12 System.out.println(a+"\t"); 13 }
练习7:快速排序
1 public class Test2 { 2 public static void main(String[] args) { 3 int[] scores={5,8,2,1,9}; 4 //排序 5 Arrays.sort(scores); 6 for (int a:scores) { 7 System.out.print(a+" "); 8 } 9 //查找 10 int i = Arrays.binarySearch(scores, 8); 11 System.out.println(i); 12 } 13 }
3.数组中常见的异常:
-
数组角标越界异常:ArraryIndexOutOfBoundsExetion
-
空指针异常:NullPointerException