由浅到深认识Java语言(8):数组&二维数组

该文章Github地址:https://github.com/AntonyCheng/java-notes【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】

在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】& CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!

上一章:由浅到深认识Java语言(7):方法(函数)

15.数组

定义:数组 == 容器

  • 组就是指多个的意思,在之前我们的代码中使用的数据类型都是单个的,为了将多个相同类型的数据存储在一起,这时候就引出了组的概念;
  • 数组是存储同一种数据类型多个元素的集合,也可以看成是一个容器;
  • 数组可以存储基本数据类型,也可以存储引用将数据类型;
  • 数组是 Java 中的唯一底层存储容器;

创建数组

基本格式一:

int[] arr = new int[10];
数据类型[] 数组名 = new 数据类型[容量值];

基本格式二:

int arr[] = new int[10];

容量值:

创建一个存放多个元素的容器(内存要开辟这样的空间来存放多个元素,关键在于内存开辟多大的空间给你?)

例如:

int a = 10;  				32位
int[] arr = new int[4];		32*4位

示例:创建一个存放五个 double 的数据;

double[] arr = new double[5];

数组底层的存储模样:

数组在底层是一个连续的空间;

内存中任何任何一个空间都会有自己的地址,那么将连续的第一位的地址称为首地址,在使用时通过首地址来找到这篇空间;

数组名中将会存放 jvm 开辟的这篇空间的首地址;

使用数组

Q : Q: Q: 如何指定数组连续空间中具体的某一个元素?

A : A: A: 通过数组的下标:是从 0 开始的一个数; arr[0] 指定的是数组的第一个元素;

下标的使用规范:

下标从 0 开始,最多到 数组长度 - 1

数组的长度:

任何一个数组,都有一个 length 属性,用于标识数组的长度: arr.length

import java.util.*;
class demo{
    public static void main(String[] args){
        int arr[] = new int[100];
        System.out.println(arr.length);
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数组的遍历:

import java.util.*;
class demo{
    public static void main(String[] args){
        int arr[] = new int[10]; //数组的创立
        for(int i=1; i<11; i++){
            arr[i-1] = i;
        }  //数组的赋值
        for(int j=0; j<arr.length; j++){
            System.out.print(arr[j] + " ");
        }  //数组的遍历
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实例演示

实例一:

键盘输入15个学生的年龄,查找固定年龄的学生的位置;

import java.util.*;
class demo{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入十五个学生的年龄:");
        int age[] = new int[15];
        for (int i = 0; i < age.length; i++){
            age[i] = scanner.nextInt();
        }
        System.out.println("请指定要查询的年龄:");
        int staticAge = scanner.nextInt();
        for (int j = 1; j < age.length+1; j++){
            if(age[j-1] == staticAge){
                System.out.println("第"+j+"位");
            }
        }
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实例二:

键盘输入 10 个数,并且求出最大值;

import java.util.*;
class demo{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int arr[] = Arr();
        System.out.println("你输入的数组是:");
        for (int i=0; i<arr.length; i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        System.out.println("请问你要比较的是这个数组么?(是/否 = 1/0)");
        int agree = scanner.nextInt();
        if (agree == 1){
            int max = arr[0];
            for(int j=0; j<arr.length; j++){
                if (max <= arr[j]){
                    max = arr[j];
                }
            }
            System.out.println(max);
        }else if (agree == 0){
            System.out.println("请重新运行程序!");
        }else{
            System.out.println("输入错误,请重新运行程序!");
        }
    }
    public static int[] Arr(){
        Scanner scanner = new Scanner(System.in);
        int arr[] = new int[10];
        System.out.println("请输入十个整数(用空格隔开):");
        for(int i=0; i<arr.length; i++){
            arr[i] = scanner.nextInt(); 
        }
        return arr;
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实例三:

用空方法的方式实现两值互换,要求方法中不能有打印动作;

该实例解释在 数组的参数传递 一节;

错误示范:

import java.util.*;
class demo{
    public static void main(String[] args){
        int a = 1;
        int b = 2;
        changeNumb(a,b);
        System.out.println(a+" "+b);
    }
    public static void changeNumb(int a,int b){
        int t = a;
        a = b;
        b = t;
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正确示范:

import java.util.*;
class demo{
    public static void main(String[] args){
        int a = 1;
        int b = 2;
        int arr[] = new int[] {a,b};
        changeNumb(arr);
        for(int i = 0; i < arr.length; i++){
            System.out.print(arr[i]+" ");
        }
    }
    public static void changeNumb(int[] a){
        int t = a[0];
        a[0] = a[1];
        a[1] = t;
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实例四:

用空方法的方式实现求最大值,要求方法中不能有打印动作;

import java.util.*;
class demo{
    public static void main(String[] args){
        int[] arr = new int[10];
        setNum(arr);
        maxNum(arr);
    }
    public static void setNum(int[] arr){
        Random rand = new Random(); //随机获得一个随机对象
        for(int i=0; i<arr.length; i++){
            arr[i]= rand.nextInt(1000); //rand.nextInt(1000)会产生0-999随机数
        }
    }
    public static void maxNum(int[] arr){
        int t = arr[0];
        for(int i=0; i<arr.length; i++){
            if(t<=arr[i]){
                t = arr[i];
            }
        }
        System.out.println(t);
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实例五:

数组内容反转;

import java.util.*;
class demo{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入您要操作的数字个数:");
        int num = scanner.nextInt();
        int arr[] = new int[num];
        System.out.println("请输入所要操作的"+num+"位整数:");
        for (int i = 0; i < arr.length; i++){
            arr[i] = scanner.nextInt();
        }
        System.out.println("你的数组是:");
        for (int i = 0; i < arr.length; i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        System.out.println("反转后:");
        for (int i = 0; i< arr.length; i++){
            if(arr.length%2==0){
                if(i<(arr.length/2)){
                    int t = arr[i];
                    arr[i] = arr[arr.length - 1 - i];
                    arr[arr.length - 1 - i] = t; 
                }else{
                    break;
                }
            }else if(arr.length%2!=0){
                if(i<((arr.length-1)/2)){
                    int t = arr[i];
                    arr[i] = arr[arr.length - 1 - i];
                    arr[arr.length - 1 - i] = t; 
                }else{
                    break;
                }
            }
        }
        for (int i = 0; i< arr.length; i++){
            System.out.print(arr[i]+" ");
        }
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实例六:

求俩数的最大公约数和最小公倍数;

import java.util.*;

public class demo {
	public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入两个数,求他们的最大公约数和最小公倍数!");
        System.out.println("输入两数中第一个数:");
        int m = scanner.nextInt();
        System.out.println("输入两数中第二个数:");
        int n = scanner.nextInt();
        if(m>n){
            int arr[] = new int[m]; 
            for(int i=1;i<(m+1);i++){
                if(m%i==0&&n%i==0){
                    arr[i] = i;
                }
            }
            Arrays.sort(arr);
            int max = arr[m-1];
            System.out.println("最大公约数是"+max);
            int min = (m*n)/max;
            System.out.println("最小公倍数是"+min);
        }else if(m<n){
            int arr[] = new int[n]; 
            for(int i=1;i<(n+1);i++){
                if(m%i==0&&n%i==0){
                    arr[i] = i;
                }
            }
            Arrays.sort(arr);
            int max = arr[n-1];
            System.out.println("最大公约数是"+max);
            int min = (m*n)/max;
            System.out.println("最小公倍数是"+min);
        }else{
            System.out.println("最大公约数是"+n);
        }
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结

  • 数组是一片连续的内存空间,用来存放多个元素;
  • 数组的创建需要考虑两个方面:数据类型,长度;
  • 数组通过下标(索引)来定位到这个连续空间中的某一个具体的空间;
  • 下标从 0 开始,最多到 数组的长度 - 1
  • 任何数组都有一个 length 属性,方便我们在循环中使用;

其他细节

数组的初始化

  1. 动态初始化

    先开辟好空间,里面元素是默认值,并没有填入我们要填的值,等使用时再填入,这是一个动态的过程;

    int arr[] = new int[10];
    
  2. 静态初始化

    在创建数组时,直接给数组里的每一个空间的赋值;

    //方法一
    int arr[] = new int[]{1,2,3,4,5};
    //注意中括号里面没有数字(长度);
    
    //方法二
    int arr[] = {1,2,3,4,5};
    
    //方法三
    int arr[];
    arr = new int[]{1,2,3,4,5}
    //注意以下这样不行:
    int[] arr;
    arr = {1,2,3,4,5};
    

数组中数据类型的默认值

byte short int long 的默认值都为 0

float double 的默认值都为 0.0

char 的默认值为 ' '(空格字符)

boolean 的默认值为 false

String 的默认值为 null

数组的参数传递

当方法中的参数是传递数组时,传递的是地址值,就是数组指向的那一块内存空间的首地址;

基本数据类型在方法中进行参数传递时,传的是具体的值;

Arrays工具类

Arrays.toString();

打印数组;

此处的Arrays.toString()方法是Arrays类的静态方法;

import java.util.Arrays;
public class Test {
    public static void main(String args[]) {
        int[] a = { 1, 2 };
        System.out.println(a); // 打印数组引用的值;
        System.out.println(Arrays.toString(a)); // 打印数组元素的值;
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Arrays.equals(int[] a, int[] a2);

比较两个数组是否相同;

import java.util.*;
class demo{
    public static void main(String[] args){
        int [] arrA={23,34,345,234};
        int [] arrB={23,34,345,234};
        //两个数组以相同的顺序包含相同的元素
        System.out.println(Arrays.equals(arrA, arrB));//true
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Arrays.copyOf(int[] original, int newLength);

复制指定的数组—效率低,会重新开辟新的数组空间original - 要复制的数组;newLength - 要返回的副本的长度;

import java.util.*;
class demo{
    public static void main(String[] args){
        int [] arrA={23,34,345,234};
        int [] arrB=new int[5];//默认值0
        System.out.println("拷贝前:"+arrB);
        System.out.println(Arrays.toString(arrA));
        arrB=Arrays.copyOf(arrA, 5);  //重新开辟空间
        System.out.println("拷贝后:"+arrB);
        System.out.println(Arrays.toString(arrB));
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Arrays.fill(int[] a, int val)/Arrays.fill(int[] a, int fromIndex, int toIndex, int val);

填充数组;

import java.util.*;
class demo{
    public static void main(String[] args){
        int[] a= {1,2,323,23,543,12,59};
        System.out.println(Arrays.toString(a));
        Arrays.fill(a, 2, 4, 100);  //将2到4索引的元素替换为100;前闭后开
        System.out.println(Arrays.toString(a));
        Arrays.fill(a, 55);
        System.out.println(Arrays.toString(a));
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Arrays.sort(int[] a);

对数组进行升序排序;

import java.util.*;
class demo{
    public static void main(String[] args){
        int[] a = {1,2,323,23,543,12,59};
        System.out.println(Arrays.toString(a));
        Arrays.sort(a);
        System.out.println(Arrays.toString(a));
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Arrays.binarySearch(int[] a, int key);

二分法查找;

import java.util.*;
class demo{
    public static void main(String[] args){
        int[] a = {1,2,323,23,543,12,59};
        System.out.println(Arrays.toString(a));
        Arrays.sort(a);   //使用二分法查找,必须先对数组进行排序;
        System.out.println(Arrays.toString(a));
        //返回排序后新的索引位置,若未找到返回负数。
        System.out.println("该元素的索引:"+Arrays.binarySearch(a, 12)); 
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可变参数

在定义方法时,允许实参的个数是任意的,但是数据类型是固定的,那么这时就可以使用可变参数;

基本格式:

public static void m1(int...args){

}

在调用方法时,无论多少个参数,都会传给 args 数组,也就是说, args 数组里存放了所有的实参;

注意:在定义方法时,可变参数要写在所有方法之后;

示例如下:

import java.util.*;
class demo{
    public static void main(String[] args){
        m1(1,2,3,4,5,6,7,8,9);
    }
    public static void m1(int a,int b,int c,int... args){
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(args);
        System.out.println(Arrays.toString(args));
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

16.二维数组

创建数组

基本格式:

//方法一:
int[][] arr = new int[4][3];

//方法二:
int arr[][] = new int[4][3];

//方法三:
int arr[][] = new int[4][];
arr[0] = new int[3]
arr[1] = new int[3]    
arr[2] = new int[3]    
arr[3] = new int[3]    

使用数组

调用二维数组中的某一空间:使用双下标确定数据位置arr[3][1]

下标是从 0 开始,最多是 数组的长度 - 1

数组的长度

  1. 一维数组是 arr.length
  2. 二维数组是 arr[1].length

二维数组的遍历

多用双层循环进行遍历,外层循环行数,内层循环列数;

示例如下:

全班一共有4个小组,每个小组有3个人;

import java.util.*;
class demo{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String[][] students = new String[4][3];
        // 元素的堆放
        System.out.println("请输入每一组学生的具体名称:");
        for(int i = 0; i < students.length; i++){
            System.out.println("第"+(i+1)+"组:");
            for(int j = 0; j < students[1].length; j++){
                students[i][j] = scanner.next();
            }
        }
        // 元素的遍历
        System.out.println("您的班级成员如下:");
        for(int k = 0; k < students.length; k++){
            for (int l = 0; l < students[k].length; l++){
                System.out.print(students[k][l]+"   ");
            }
            System.out.println();
        }
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

动态初始化

//方法一
int[][] arr = new int[3][5];

//方法二
int[][] arr = new int[3][]; 
//此时内存只开辟了一维数组,这个一维数组里面的每个元素是用来存放另一个数组的地址;
//目前第二维数组还没创建,因此里面存放的是 null;

//方法三
int arr[][] = new int[3][5];

//方法四
int arr[][] = new int[3][];

“方法二”实例:

import java.util.*;
class demo{
    public static void main(String[] args){
        int[][] arr = new int[3][];
        arr[0] = new int[3];
        arr[1] = new int[5];
        arr[2] = new int[7];
        for(int i=0; i<arr.length; i++){
            System.out.println(Arrays.toString(arr[i]));
        }
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实例:

一个班级有35名同学,
第一组有5名,位置分别为 A1 , A2 , A3 , A4 , A5;
第二组有6名,位置分别为 B1 , B2 , B3 , B4 , B5 , B6;
第三组有7名,位置分别是 C1 , C2 , C3 , C4 , C5 , C6 , C7;
第四组有8名,位置分别是 D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8;
第五组有9名,位置分别是 E1 , E2 , E3 , E4 , E5 , E6 , E7 , E8 , E9 ;
设计一个随机点名程序,学号均为 20010+组数+位置 的形式;

import java.util.*;
class demo{
    public static void main(String[] args){
        String[][] arr = new String[5][];
        arr[0] = new String[]{"A1" , "A2" , "A3" , "A4" , "A5"};
        arr[1] = new String[]{"B1" , "B2" , "B3" , "B4" , "B5" , "B6"};
        arr[2] = new String[]{"C1" , "C2" , "C3" , "C4" , "C5" , "C6" , "C7"};
        arr[3] = new String[]{"D1" , "D2" , "D3" , "D4" , "D5" , "D6" , "D7" , "D8"};
        arr[4] = new String[]{"E1" , "E2" , "E3" , "E4" , "E5" , "E6" , "E7" , "E8" , "E9"};
        System.out.println("您现在的班级成员如下:");
        for (int i = 0; i < arr.length; i++){
            System.out.print("第" +(i+1)+ "组:");
            for (int j = 0; j < arr[i].length; j++){
                System.out.print(arr[i][j]+"  ");
            }
            System.out.println();
        }
        System.out.println("下面开始随机点名!学号是:");
        Random rand = new Random();
        int Arr = rand.nextInt(4);
        int a = rand.nextInt(4);
        int b = rand.nextInt(5);
        int c = rand.nextInt(6);
        int d = rand.nextInt(7);
        int e = rand.nextInt(8);
        if (Arr == 0){
            System.out.println("20010"+(Arr+1)+arr[Arr][a]);
        }else if(Arr == 1){
            System.out.println("20010"+(Arr+1)+arr[Arr][b]);
        }else if(Arr == 2){
            System.out.println("20010"+(Arr+1)+arr[Arr][c]);
        }else if(Arr == 3){
            System.out.println("20010"+(Arr+1)+arr[Arr][d]);
        }else{
            System.out.println("20010"+(Arr+1)+arr[Arr][e]);
        }
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

静态初始化

基本格式:

//方法一:
int[][] arr = new int[][]{{1,2,3,4},{5,6,7},{8,9}};
//方法二:
int[][] arr = {{1,2,3,4},{5,6,7},{8,9}};

实例:

以点名程序为例,更改代码,再次执行;

import java.util.*;
class demo{
    public static void main(String[] args){
        String arr[][] = {{"A1" , "A2" , "A3" , "A4" , "A5"},{"B1" , "B2" , "B3" , "B4" , "B5" , "B6"},{"C1" , "C2" , "C3" , "C4" , "C5" , "C6" , "C7"},{"D1" , "D2" , "D3" , "D4" , "D5" , "D6" , "D7" , "D8"},{"E1" , "E2" , "E3" , "E4" , "E5" , "E6" , "E7" , "E8" , "E9"}};
        System.out.println("您现在的班级成员如下:");
        for (int i = 0; i < arr.length; i++){
            System.out.print("第" +(i+1)+ "组:");
            for (int j = 0; j < arr[i].length; j++){
                System.out.print(arr[i][j]+"  ");
            }
            System.out.println();
        }
        System.out.println("下面开始随机点名!学号是:");
        Random rand = new Random();
        int Arr = rand.nextInt(4);
        int a = rand.nextInt(4);
        int b = rand.nextInt(5);
        int c = rand.nextInt(6);
        int d = rand.nextInt(7);
        int e = rand.nextInt(8);
        if (Arr == 0){
            System.out.println("20010"+(Arr+1)+arr[Arr][a]);
        }else if(Arr == 1){
            System.out.println("20010"+(Arr+1)+arr[Arr][b]);
        }else if(Arr == 2){
            System.out.println("20010"+(Arr+1)+arr[Arr][c]);
        }else if(Arr == 3){
            System.out.println("20010"+(Arr+1)+arr[Arr][d]);
        }else{
            System.out.println("20010"+(Arr+1)+arr[Arr][e]);
        }
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下一章:由浅到深认识Java语言(9):Eclipse IDE简介

  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值