一维数组
声明方式:
- 数据类型[] 数组名称 = new 数据类型[数组的长度];
- .length:可以获取数组长度
- 可以通过下标的方式访问数组中的每一个元素。需要注意的是:数组的下标从0开始,对于长度为n的数组,下标的范围是0~n-1。
初始化方式:
- 数据类型[] 数组名称 = {初始值1, 初始值2, ...};
- 基本类型的数组创建后,其元素的初始值:byte、short、char、int、long为0;float和double为0.0;boolean为false。
内存结构:
栈区:用于存放程序运行过程当中所有的局部变量。
堆区:用于存储使用new关键字创建的数组和对象。
数组的优缺点:
- 长度一旦确定,就不能更改
- 通过下标访问元素,很快
- 要求所有元素类型相同
- 增删改查需要移动大量元素
练习1:数组的声明与使用
public static void main(String[] args){
//实现一维数组的声明和使用
//int arr[] = new int[2]; 两种写法结果是一样的,在java中不推荐第一种方式
int[] arr = new int[2]; //更容易与变量声明区分
System.out.println("数组的长度是:" + arr.length);
System.out.println("下标为0的是:" + arr[0]);
System.out.println("下标为1的是:" + arr[1]);
//System.out.println("下标为2的是:" + arr[2]);//运行错误,数组下标越界异常
System.out.println("-------------------------------------");
//使用for循环打印,更方便
for(int i =0; i < arr.length; i++){
System.out.println("下标为" + i + "的是:" + arr[i]);//0
}
System.out.println("-------------------------------------");
double[] arr2 = new double[3];
for(int i =0; i < arr2.length; i++){
System.out.println("下标为" + i + "的是:" + arr2[i]);//0.0
}
System.out.println("-------------------------------------");
char[] arr3 = {'a','b','d'};//静态方式的简化版
for(int i =0; i < arr3.length; i++){
System.out.println("下标为" + i + "的是:" + arr3[i]);//0.0
}
System.out.println("-------------------------------------");
boolean[] arr4 = new boolean[]{true, true,false};//静态写法
for(int i =0; i < arr4.length; i++){
System.out.println("下标为" + i + "的是:" + arr4[i]);//0.0
}
练习2:数组的增删改查
//赋值11 22 33 44 0
for(int i=0; i < arr.length-1; i++){
arr[i]=(i+1)*11;
}
for(int i =0; i < arr.length; i++){
System.out.print( arr[i] + " " );//11 22 33 44 0
}
System.out.println();
System.out.println("-------------------------------------");
//将数据55插入下标为0的位置,原有数值后移
for(int i = arr.length-1; i > 0; i--){
arr[i]=arr[i-1];
}
arr[0]=55;
for(int i =0; i < arr.length; i++){
System.out.print( arr[i] + " " );//55 11 22 33 44
}
System.out.println();
System.out.println("-------------------------------------");
//将数据55删除,原有数值前移
for(int i =0; i < arr.length-1; i++){
arr[i]=arr[i+1];
}
arr[4]=0;
for(int i =0; i < arr.length; i++){
System.out.print( arr[i] + " " );//11 22 33 44 0
}
System.out.println();
System.out.println("-------------------------------------");
//将数据22找到并改为220
for(int i =0; i < arr.length; i++){
if(22==arr[i]){
arr[i]=220;
}
}
for(int i =0; i < arr.length; i++){
System.out.print( arr[i] + " " );//11 220 33 44 0
}
System.out.println(); */
//实现一维数组的拷贝
int arr[]={11,22,33,44,55};
for(int i =0; i < arr.length; i++){
System.out.print( arr[i] + " " );//0
}
System.out.println();
System.out.println("-------------------------------------");
int brr[]=new int[3];
for(int i =0; i < brr.length; i++){
System.out.print( brr[i] + " " );//0
}
System.out.println();
System.out.println("-------------------------------------");
//brr[0] = arr[1];
//brr[1] = arr[2];
//brr[2] = arr[3];
//for(int i=0;i< brr.length; i++){
//brr[i]=arr[i+1];
//}
//将数组arr从下标1开始的3个元素拷贝到数组brr中下标0开始的位置
System.arraycopy( arr,1,brr,0,3 );
for(int i =0; i < brr.length; i++){
System.out.print( brr[i] + " " );//0
}
System.out.println();
练习3:数组工具类的使用
static String toString(int[] a)
|
输出数组中的内容
|
static void fill(int[] a, int val)
|
将参数指定元素赋值给数组中所有元素
|
static boolean equals(boolean[] a, boolean[] a2)
|
判断两个数组元素内容和次序是否相同
|
static void sort(int[] a)
|
对数组中的元素进行从小到大排序
|
static int binarySearch(int[] a, int key)
|
从数组中查找参数指定元素所在的位置
|
//声明一个长度为5的数组并初始化
int []arr2=new int[5];
Arrays.fill(arr2,10);//填充数组的每个元素
System.out.println(Arrays.toString(arr2));//10,10,10,10,10
int []arr3=new int[5];
Arrays.fill(arr3,20);//填充数组的每个元素
System.out.println(Arrays.toString(arr3));//20,20,20,20,20
//判断arr2是否等于arr3
System.out.println(Arrays.equals(arr2,arr3));//false
//使用数组来记录学生的考试成绩并打印
//1、提示用户输入学生的人数并使用变量记录
System.out.println("请学生人数:");
Scanner sc =new Scanner(System.in);
int num =sc.nextInt();
//2、根据学生的人数来声明对应长度的数组负责记录学生的考试成绩
//变长数组:变量作为数组长度,但长度依然不可变
int[] arr=new int[num];
//3、提示用户输入每个学生的考试成绩并记录一堆数组中
for(int i =0; i < num; i++){
System.out.println("请输入第" + (i+1) +"个学生的考试成绩:" );
arr[i]=sc.nextInt();//读取
}
//4、打印所有学生的考试成绩
System.out.println( "学生考试成绩分别为:" );
for(int i =0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
//5、计算所有学生的总分以及平均分
int sum=0;
for(int i =0; i < arr.length; i++){
sum+=arr[i];
}
double svg=sum*1.0/num;//布尔类型并*1.0,为了保留小数点后的数值
System.out.println("总分:" + sum +" 平均分:" + svg );
System.out.println("-------------------------------------");
//1、查找本班所有学生考试成绩中的最低分和最高分并打印出来
System.out.println("原始考试成绩是:" + Arrays.toString(arr));
//调试工具类中的排序方法对所有考试成绩从小到大排序
Arrays.sort(arr);
System.out.println("排序后成绩是:" + Arrays.toString(arr));
System.out.println("最低分是:" + arr[0] + ",最高分是:" + arr[num-1]);
System.out.println("-------------------------------------");
//从数组中查找指定元素所在的下标位置
System.out.println("59分在数组下标位置是:" + Arrays.binarySearch(arr,59));
System.out.println("60分在数组下标位置是:" + Arrays.binarySearch(arr,60));
二维数组
- 由多个一维数组组成。
- 数据类型[][] 数组名称 = new 数据类型[行数][列数];
- 数据类型[][] 数组名称 = {{元素1, 元素2,...}, ...};
//使用二维数组打印杨辉三角
//1、提示用户输入行数
System.out.println("请输入一个行数:");
Scanner.s =new Scanner(System.in);
int num =SC.nextInt();
//2、根据用户输入行数来声明对应分二维数组
int[][] arr =new int [num][];
//3、针对二维数组中的每个元素进行初始化
//使用外层for循环控制二维数组的行下标
for(int i = 0;i<num; i++){
//针对二维数组中的每一行进行内层空间申请
arr[i]=new int[i+1];
//使用内层循环控制列下标
for(int j = 0; j<=i; j++){
//当下标为0或者列下标等于行下标,都为
if(0==j || i==j){
arr[i][j] =1;
}else{
//否则对应位置就是上一行当前列+上一行前一列的和
arr[i][j]=arr[i-1][j]+arr[i-1][j-1];
}
}
}
//4、打印
for(int i=0;i<arr.length;i++){
//使用内层循环控制列数
for(int j=0;j<arr[i].length;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}