0
点赞
收藏
分享

微信扫一扫

JAVA基础学习入门(三)

女侠展昭 2022-02-13 阅读 36

JAVA入门之数组(一)

至此,java的基础语法已经基本总结完毕,接下来要学习的是数组。

1.数组(Array)的概述

  • 数组,是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
  • 数组的常见概念:
    1.数组名
    2.元素
    3.角标、下标、索引
    4.数组的长度:元素的个数
  • 数组的特点:
    1.数组是有序排列的
    2.数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型
    3.创建数组对象会在内存中开辟一整块连续的空间
    4.数组的长度一旦确定,就不能修改
  • 数组的分类:
    1.按照维数:一维数组、二维数组。。。。
    2.按照数组元素的类型:基本数据类型元素的数组、引用数据类型元素的数组
  • 一维数组的使用:
    1.一维数组的声明和初始化
    2.如何调用数组的指定位置的元素
    3.如何获取数组的长度
    4.如何遍历数组
    5.数组元素的默认初始化值
    6.数组的内存解析
public class AarryTest {
     public static void main(String[] args) {
		//1. 一维数组的声明和初始化
    	int num; //声明
    	num = 10; //初始化
    	int id = 100; //声明+初始化
    	
    	int[] ids; //声明
    	//1.1静态初始化:数组的初始化和数组元素的赋值操作同时进行
    	ids = new int[]{1001,1002,1003,1004};
    	//1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行
    	String[] names = new String[5];
    	
    	//错误的写法
    	int[] arr1 = new int[];
    	int[5] arr2 = new int[5];
    	int[] arr3 = new int[3] {1,2,3};
    	//数组一旦初始化完成,其长度就确定了
    }
}
public class AarryTest {
     public static void main(String[] args) {
    	String[] names = new String[5];
		//2. 如何调用数组的指定位置的元素:通过索引的方式调用
    	//数组的索引从0开始的,到数组的长度-1结束
    	names[0] = "王八";
    	names[1] = "王二";
    	names[2] = "王三";
    	names[3] = "王四";
    	names[4] = "王五";
    	
    	//3. 如何获取数组的长度
    	//属性:length
    	System.out.println(names.length);//5
    	
    	//4. 如何遍历数组
    	for(int i = 0; i < names.length; i++) {
    		System.out.println(names[i]);
    	}
    }
}

数组元素的默认初始化值

  • 数组元素是整型:0
  • 数组元素是浮点型:0.0
  • 数组元素是char型:0或’\u0000’,而非’0’
  • 数组元素是boolean型:false
  • 数组元素是引用数据类型:null (空值,没有赋值的意思)
public class AarryTest {
     public static void main(String[] args) {
    	//5. 数组元素的默认初始化值
    	int[] arr = new int[4];
    	for(int i = 0;i < arr.length;i++) {
    		System.out.println(arr[i]);
    	}
		System.out.println("***********");
		
		short[] arr1 = new short[4];
		for(int i = 0;i < arr1.length; i++) {
			System.out.println(arr1[i]);
		}
		System.out.println("***********");
		
		float[] arr2 = new float[5];
		for(int i = 0;i < arr2.length; i++) {
			System.out.println(arr2[i]);
		}
		System.out.println("***********");
		
		char[] arr3 = new char[5];
		for(int i = 0;i < arr3.length; i++) {
			System.out.println("----"+arr3[i]+"****");
		}
		System.out.println("***********");
		
		boolean[] arr4 = new boolean[5];
		for(int i = 0;i < arr4.length; i++) {
			System.out.println(arr4[i]);	
		}
		System.out.println("***********");
		
		String[] arr5 = new String[5];
		System.out.println(arr5[0]);
		
    }
}

  • 内存结构的简单说明:
    在这里插入图片描述

2.练习:一维数组的使用

1.从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
成绩>=最高分-10 等级为“A”;
成绩>=最高分-20 等级为“B”;
成绩>=最高分-30 等级为“C”;
其余,等级为"D"。

import java.util.Scanner;

public class AarryTest {
     public static void main(String[] args) {
    	//1.使用Scanner,读取学生个数
    	Scanner scanner = new Scanner(System.in);
		System.out.println("请输入学生人数:");
		int number = scanner.nextInt();	
		//2.创建数组,存储学生成绩,动态初始化
		int[] scores = new int[number];
		//3.给数组中的元素赋值
		int maxScore = 0;
		System.out.println("请输入"+number+"个学生成绩:");
		for(int i = 0; i < scores.length; i++) {
			scores[i] = scanner.nextInt();
			//4.获取数组中的元素的最大值,即最高分
			if(maxScore < scores[i]) {
				maxScore = scores[i];
			}
		}		
		//5.根据每个学生成绩与最高分的差值,得到每个学生的等级,并输出等级和成绩
		char level;
		for(int i = 0; i < scores.length; i++) {
			if(maxScore - scores[i] <= 10) {
				level = 'A';
			}else if(maxScore - scores[i] <= 20) {
				level = 'B';
			}else if(maxScore - scores[i] <= 30) {
				level = 'C';
			}else {
				level = 'D';
			}
			System.out.println("student" + i + "score is" + scores[i] + ",grade is" + level);
		}		
    }
}

3.多维数组的使用

3.1二维数组的使用

  • 理解:
    对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在
  • 二维数组的使用:
    1.二维数组的声明和初始化
    2.如何调用数组的指定位置的元素
    3.如何获取数组的长度
    4.如何遍历数组
    5.数组元素的默认初始化值
    6.数组的内存解析
import java.util.Scanner;

public class AarryTest {
     public static void main(String[] args) {
    	//1.二维数组的声明和初始化
    	//静态初始化
    	int[][] arr1 = new int[][] {{1,2,3},{4,5},{7,8,9}};
    	//动态初始化1	
    	String[][] arr2 = new String[3][2];
    	//动态初始化2	
    	String[][] arr3 = new String[3][];
    	//2.如何调用数组的指定位置的元素
    	System.out.println(arr1[0][1]); //2
    	System.out.println(arr2[1][1]); //null
    	arr3[1] = new String[4];
    	System.out.println(arr3[1][0]);//不是很能理解为啥输出是null
    	//3.如何获取数组的长度
    	System.out.println(arr1.length); //3
    	System.out.println(arr1[0].length); //3
    	System.out.println(arr1[1].length); //2
    	//4.如何遍历数组
    	for(int i = 0; i < arr1.length; i++) {
    		for(int j = 0; j < arr1[i].length; j++){
    			System.out.print(arr1[i][j] + " ");
    		}
    		System.out.println();
    	}	
    }
}
import java.util.Scanner;

public class AarryTest {
     public static void main(String[] args) {
    	int[][] arr = new int[4][3];
    	System.out.println(arr[0]);//[I@1c4af82c
    	System.out.println(arr[0][0]);//0
    	System.out.println("**********");
    	float[][] arr1 = new float[4][3];
    	System.out.println(arr1[0]);//地址值[F@123a439b
    	System.out.println(arr1[0][0]);//0.0
    	System.out.println("**********");
    	String[][] arr2 = new String[4][2];
    	System.out.println(arr2[1]);//地址值[Ljava.lang.String;@53bd815b
    	System.out.println(arr2[1][1]);//null
    	System.out.println("**********");
    	double[][] arr3 = new double[4][];
    	System.out.println(arr3[1]);//null
    	System.out.println(arr3[1][0]);//报错   	
    }
}

3.2二维数组的练习

1.使用二维数组打印一个10行的杨辉三角
提示:
第一行有1个元素,第n行有n个元素
每一行的第一个元素和最后一个元素都是1
从第三行开始,对于非第一个元素和最后一个元素的元素。即:
yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
在这里插入图片描述

import java.util.Scanner;

public class AarryTest {
     public static void main(String[] args) {
    	//1.声明并初始化二维数组
    	 int [][] yanghui =new int[10][];//定义数组行数  .    	 
    	//2.给数组的元素赋值
    	 for(int i = 0; i < yanghui.length; i++) {
    		 yanghui[i] = new int[i+1];//定义数组每行对应的列数,即第n行就有n列
    		 //2.1给首末元素赋值
    		 yanghui[i][0] = yanghui[i][i] = 1;
    		 //2.2给每行非首末元素赋值
    		 for(int j = 1; j < yanghui[i].length-1; j++) {
    			 yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
    		 }
    	 }
    	//3.遍历二维数组
    	 for(int i = 0; i < yanghui.length; i++) {
    		 for(int j = 0; j < yanghui[i].length; j++) {
    			 System.out.print(yanghui[i][j] + " ");
    		 }
    		 System.out.println();
    	 }
    }
}

2.创建一个长度为6的int型数组,要求数组元素的值都在1-30之间,且是随机赋值。同时要求元素的值各不相同

import java.util.Scanner;

public class AarryTest {
     public static void main(String[] args) {
    	//1.声明并初始化一维数组
    	 int [] arr =new int[6];
    	//2.给数组的元素赋值:
    	 //2.1利用for循环给数组赋值[1,30]内的随机数
    	 for(int i = 0; i<arr.length; i++) {
    		 arr[i] = (int)(Math.random()*30 + 1);
    	 //2.2给首元素赋完值后,每个元素赋值后需要和其前面的每个元素进行比较看是否相等,如果一旦发现有相等就跳出比较循环,并给该元素重新赋值
    		 for(int j = 0; j < i; j++) {
    			 if(arr[i] == arr[j]) {
    				 i--;//如果该元素与前面任意元素相等就跳出循环,i减1,这样i再加上1后就相当于还得重新给这个i赋值
    			·	 break;
    			 }
    		 }
    	 }
    	 
    	//3.遍历一维数组
    	 for(int i = 0; i < arr.length; i++) {
    		 System.out.print(arr[i]+" ");
    	 }
    }
}

3.回形数
从键盘键入一个整数[1,20]。以该数字为矩阵的大小,把1,2,3,4…n*n的数字按照顺时针螺旋的形式填入其中。例如:输入数字2,则程序输出:1 2
***** ************************************************* ******************4 3

方法一:

import java.util.Scanner;

public class AarryTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个1~20的整数:");
        int n = scanner.nextInt();
        //1.声明并初始化二维数组
        int [][] arr =new int[n][n];
        int s = n*n;
        /*
        k=1:向右 k=2:向下 k=3:向左 k=4:向上
        */
        //2.给数组的元素赋值:
        int k = 1;
        int i = 0, j = 0;
        for(int m = 1; m <= s; m++) {
            if(k==1){
                if(j < n && arr[i][j]==0){
                    arr[i][j++] = m;
                }else {
                    k = 2;
                    i++;
                    j--;
                    m--;
                }
            }else if(k==2){
                if(i < n && arr[i][j]==0){
                    arr[i++][j] = m;
                }else {
                    k = 3;
                    i--;
                    j--;
                    m--;
                }
            }else if(k==3){
                if(j>=0 && arr[i][j]==0){
                    arr[i][j--] = m;
                }else {
                    k = 4;
                    i--;
                    j++;
                    m--;
                }
            }else if(k==4){
                if(i>=0 && arr[i][j]==0){
                    arr[i--][j] = m;
                }else {
                    k = 1;
                    i++;
                    j++;
                    m--;
                }
            }
        }

        //3.遍历二维数组
        for(int x = 0; x < arr.length; x++) {
            for(int y = 0; y < arr[x].length; y++) {
                System.out.print(arr[x][y]+"\t");
            }
            System.out.println();
        }
    }
}

方法二:

import java.util.Scanner;

public class AarryTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个1~20的整数:");
        int n = scanner.nextInt();
        int [][] arr = new int[n][n];
        //1.声明并初始化二维数组
        int count = 0;//要显示的数据
        int maxX = n-1;//x轴最大下标
        int maxY = n-1;//y轴最大下标
        int minX = 0;//x轴最小下标
        int minY = 0;//y轴最小下标

        while(minX <= maxX){
            for(int x = minX; x <= maxX; x++){
                arr[minY][x] = ++count;
            }
            minY++;
            for(int y = minY; y <= maxY; y++){
                arr[y][maxX] = ++count;
            }
            maxX--;
            for(int x = maxX; x >= minX; x--){
                arr[maxY][x] = ++count;
            }
            maxY--;
            for(int y = maxY; y >= minY; y--){
                arr[y][minX] = ++count;
            }
            minX++;
        }

        //3.遍历二维数组
        for(int x = 0; x < arr.length; x++) {
            for(int y = 0; y < arr[x].length; y++) {
                System.out.print(arr[x][y]+"\t");
            }
            System.out.println();
        }
    }
}

4.数组元素中的平均数等
定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值、最小值、和值。要求:所有随机数都是两位数。

import javax.jws.soap.SOAPBinding;
import java.util.Scanner;

public class AarryTest {
    public static void main(String[] args) {
        int [] arr = new int[10];
        for(int i = 0; i < arr.length; i++){
            arr[i] = (int) (Math.random()*(99-10+1)+10);
        }
        //遍历
        for(int i = 0; i < arr.length; i++){
            System.out.print(arr[i] + "\t");
        }
        System.out.println();
        //求数组元素的最大值
        int maX = arr[0];
        for(int i = 0; i < arr.length; i++){
            if(arr[i] > maX){
                maX = arr[i];
            }
        }
        System.out.println("最大值为:"+maX);
        //求数组元素的最小值
        int miN = arr[0];
        for(int i = 0; i < arr.length; i++){
            if(arr[i] < miN){
                miN = arr[i];
            }
        }
        System.out.println("最小值为:"+miN);
        //求数组元素的总和值
        int sum = 0;
        for(int i = 0; i < arr.length; i++){
            sum += arr[i];
        }
        System.out.println("总和值为:"+sum);
        //求数组元素的平均值
        int avge = 0;
        avge = sum / arr.length;
        System.out.println("平均值为:"+avge);
    }
}

5.数组的复制
使用简单数组
(1)创建一个名为ArrayTest的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数组。
(2)使用大括号{},把array1初始化为8个素数:2,3,5,7,9,11,13,17,19。
(3)显示array1的内容。
(4)赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值(如array[0]=0;array[2]=2)。打印出array1。

import javax.jws.soap.SOAPBinding;
import java.util.Scanner;

public class AarryTest {
    public static void main(String[] args) {
        int[] array1,array2;
        array1 = new int[]{2,3,5,7,9,11,13,17,19};
        //显示array1的内容
        for(int i = 0;i < array1.length; i++){
            System.out.print(array1[i]+"\t");
        }
        System.out.println();
        //赋值array2变量等于array1
        array2 = array1;//不能称做数组的复制
        //数组的复制
        array2 = new int[array1.length];
        for(int i = 0;i < array2.length; i++){
            array2[i] =array1[i];
        }
        //修改array2中的偶索引元素,使其等于索引值(如array[0]=0;array[2]=2)
        for(int i = 0; i < array2.length; i++){
            if(i%2 == 0){
                array2[i] = i;
            }
        }
        //打印array1的内容
        for(int i = 0;i < array1.length; i++){
            System.out.print(array1[i]+"\t");
        }
    }
}


在这里插入图片描述
上述例子说明:“array2 = array1;”这个操作只是把array1的地址给了array2并没有实现对array1的复制。即两个变量的地址值是一样的,但堆空间中只有一个数组,换言之,自始至终,只是new的一次。array2 和 array1地址值相同,都指向了堆空间中的唯一的一个数组实体
在这里插入图片描述
数组的复制堆解释:
在这里插入图片描述
6.数组的反转与查找

import javax.jws.soap.SOAPBinding;
import java.util.Scanner;

public class AarryTest {
    public static void main(String[] args) {
        String[] arr = new String[]{"JJ","DD","MM","BB","GG","AA"};

        //数组的复制(区别于数组变量的赋值:arr1 = arr)
        String[] arr1 = new String[arr.length];
        for(int i = 0; i < arr1.length; i++){
            arr1[i] = arr[i];
        }
        //数组的反转
        //方法一:
        for(int i = 0; i < arr.length/2; i++){
            String temp = arr[i];
            arr[i] = arr[arr.length-1-i];
            arr[arr.length-1-i] = temp;
        }
        //方法二:
        for(int i=0,j=arr.length-1; i < j; i++,j--){
            String temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        //遍历
        for(int i=0; i < arr.length; i++){
            System.out.print(arr[i]+"\t");
        }
        System.out.println();
        //查找(搜索)
        //线性查找:
        String dest = "CB";
        boolean ifFlag =true;
        for(int i = 0; i < arr.length;i++){
            if(dest.equals(arr[i])){
                System.out.println("找到了指定元素,位置为:"+i);
                ifFlag =false;
                break;
            }
        }
        if(ifFlag){
            System.out.println("很遗憾没有找到!");
        }
        //二分法查找:前提,所要查找的数组必须是有序的
        int[] arr2 = new int[]{-98,-34,2,34,54,66,79,105,210,333};
        int dest1 = -34;
        int head = 0;//初始的首索引
        int end = arr2.length - 1;//初始的末索引
        boolean ifFlag1 =true;

        while(head <= end){
            int middle = (head+end)/2;
            if(dest1 == arr2[middle]){
                System.out.println("找到了指定元素,位置为:"+middle);
                ifFlag1 =false;
                break;
            }else if(arr2[middle] > dest1){
                end = middle-1;
            }else{//arr2[middle] < dest1
                head = middle + 1;
            }
        }
        if(ifFlag1){
            System.out.println("很遗憾没有找到!");
        }

    }
}

举报

相关推荐

0 条评论