Java基础 | 数组 | 一维数组 | 二维数组 | 数组初始化 | 索引

目录

一维数组

什么是数组

数组定义格式

格式一

格式二

数组初始化

数组动态初始化

什么是动态初始化

动态初始化格式

动态初始化格式详解

等号左边

等号右边

数组静态初始化

什么是静态初始化

静态初始化格式

完整版格式

简化版格式

示例代码

数组元素访问

什么是索引

访问数组元素格式

示例代码

内存分配

内存概述

java中的内存分配

数组操作的两个常见小问题

索引越界异常

出现原因

解决方案

空指针异常

出现原因

解决方案

数组案例

数组遍历

数组最值

实现思路

代码实现

数组元素反转

实现思路

代码实现

二维数组

什么是二维数组

二维数组格式

格式一

格式解释

m表示这个二维数组有多少个一维数组

n表示每一个一维数组的元素个数

举例

格式二

格式解释

m表示这个二维数组有多少个一维数组

这一次没有直接给出一维数组的元素个数,可以动态的给出

举例

格式三

举例

二维数组遍历

案例代码


一维数组

什么是数组

数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。

总结:存放数据,长度和类型是固定的

数组定义格式

格式一

数据类型[] 数组名;

示例:

int[] arr;        
double[] arr;      
char[] arr;

格式二

数据类型 数组名[];

示例:

int arr[];
double arr[];
char arr[];

数组初始化

数组动态初始化

什么是动态初始化

数组动态初始化就是只给定数组的长度,由系统给出默认初始化值

动态初始化格式
数据类型[] 数组名 = new 数据类型[数组长度];
int[] arr = new int[3];
​
System.out.println(arr);//[I@1540e19d
​
//访问数组元素格式
System.out.println(arr[0]);//0
System.out.println(arr[1]);//0
System.out.println(arr[2]);//0
动态初始化格式详解
  • 等号左边
    • int:数组的数据类型

    • []:代表这是一个数组

    • arr:代表数组的名称

  • 等号右边
    • new:为数组开辟内存空间

    • int:数组的数据类型

    • []:代表这是一个数组

    • 3:代表数组的长度

数组静态初始化

什么是静态初始化

在创建数组时,直接将元素确定,由系统计算出数组的长度

静态初始化格式
  • 完整版格式
    数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
  • 简化版格式
    数据类型[] 数组名 = {元素1,元素2,...};
示例代码
  public class ArrayDemo {
      public static void main(String[] args) {
          //定义数组
          int[] arr = {1, 2, 3};
  
          //输出数组名
          System.out.println(arr);
  
          //输出数组中的元素
          System.out.println(arr[0]);//1
          System.out.println(arr[1]);//2
          System.out.println(arr[2]);//3
      }
  }

数组元素访问

什么是索引

每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。
这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。     

访问数组元素格式

数组名[索引];

示例代码

public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr = new int[3];
​
        //输出数组名
        System.out.println(arr); //[I@880ec60
​
        //输出数组中的元素
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}

内存分配

内存概述

内存是计算机中的重要原件,临时存储区域,作用是运行程序。
我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。
必须放进内存中才能运行,运行完毕后会清空内存。 
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。 

java中的内存分配

目前我们只需要记住两个内存,分别是:栈内存和堆内存

区域名称作用
寄存器给CPU使用,和我们开发无关。
本地方法栈JVM在使用操作系统功能的时候使用,和我们开发无关。
方法区存储可以运行的class文件。
堆内存存储对象或者数组,new来创建的,都存储在堆内存。
方法栈方法运行时使用的内存,比如main方法运行,进入方法栈中执行。

数组操作的两个常见小问题

索引越界异常
  • 出现原因
    public class ArrayDemo {
        public static void main(String[] args) {
            int[] arr = new int[3];
            System.out.println(arr[3]);
        }
    }

    数组长度为3,索引范围是0~2,但是我们却访问了一个3的索引。

    程序运行后,将会抛出ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。

  • 解决方案

    将错误的索引修改为正确的索引范围即可!

空指针异常
  • 出现原因
    public class ArrayDemo {
        public static void main(String[] args) {
            int[] arr = new int[3];
    ​
            //把null赋值给数组
            arr = null;
            System.out.println(arr[0]);
        }
    }

    arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出 NullPointerException 空指针异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。

  • 解决方案

    给数组一个真正的堆内存空间引用即可!

数组案例

数组遍历

就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。

public class ArrayTest01 {
    public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 4, 5 };
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        System.out.println(arr[3]);
        System.out.println(arr[4]);
    }
}

以上代码是可以将数组中每个元素全部遍历出来,但是如果数组元素非常多,这种写法肯定不行,因此我们需要改造成循环的写法。数组的索引是 0 到 lenght-1 ,可以作为循环的条件出现。

public class ArrayTest01 {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {11, 22, 33, 44, 55};
​
        //使用通用的遍历格式
        for(int x=0; x<arr.length; x++) {
            System.out.println(arr[x]);
        }
    }
}

数组最值

数组最值就是从数组的所有元素中找出最大值或最小值

实现思路
  • 定义变量,保存数组0索引上的元素

  • 遍历数组,获取出数组中的每个元素

  • 将遍历到的元素和保存数组0索引上值的变量进行比较

  • 如果数组元素的值大于了变量的值,变量记录住新的值

  • 数组循环遍历结束,变量保存的就是数组中的最大值

代码实现
public class ArrayTest02 {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {12, 45, 98, 73, 60};
​
        //定义一个变量,用于保存最大值
        //取数组中第一个数据作为变量的初始值
        int max = arr[0];
​
        //与数组中剩余的数据逐个比对,每次比对将最大值保存到变量中
        for(int x=1; x<arr.length; x++) {
            if(arr[x] > max) {
                max = arr[x];
            }
        }
​
        //循环结束后打印变量的值
        System.out.println("max:" + max);
​
    }
}

数组元素反转

数组中的元素颠倒顺序,例如原始数组为1,2,3,4,5,反转后的数组为5,4,3,2,1

实现思路
分析: 
把0索引和arr.length-1 交换 
把1索引和arr.length-2 交换 
把2索引和arr.length-3 交换
只要做到arr.length/2 即可 ,只做一半,不然又调回来了

代码实现
public static void main(String[] args) {
    int[] arr = {1,2,3,4,5};
    /*
        // 第一次交换
        int temp = arr[0];
        arr[0] = arr[arr.length - 1];// 把0索引和length-1 交换
        arr[arr.length - 1] = temp;// 最前面和最后面的进行交换
​
        // 第二次交换
        int temp2 = arr[1];
        arr[1] = arr[arr.length - 1 - 1];
        arr[arr.length - 1 - 1] = temp2;
​
        // 第三次交换
        int temp3 = arr[2];
        arr[2] = arr[arr.length - 1 - 2];
        arr[arr.length - 1 - 2] = temp3;
        
        //第n次交换。。。。
    */
    
        //用循环改进
        for(int x=0;x<arr.length/2;x++){
            int temp = arr[x];
            arr[x] = arr[arr.length - 1 - x];
            arr[arr.length - 1 - x] = temp;
        }
​
    // 反转后,遍历数组
    System.out.print("[");
    for(int x=0;x<arr.length;x++){
        if(x == arr.length-1){
            System.out.println(arr[x]);
        }else{
            System.out.print(arr[x]+",");
        }
    }
    System.out.println("]");
​
}

二维数组

什么是二维数组

二维数组其实就是这个二维数组中有多少个一维数组

二维数组格式

格式一

数据类型[][] 变量名 = new 数据类型[m][n];
  • 格式解释
    • m表示这个二维数组有多少个一维数组
    • n表示每一个一维数组的元素个数
  • 举例
            //格式一  静态初始值
            int[][] arr = new int[3][2];
    ​
            //这个二维数组中有 3个一维数组, 每一个一维数组有2个长度
            //拿到第一个一维数组
            System.out.println(arr[0][0]);
            System.out.println(arr[0][1]);
            System.out.println("=========第一个一维数组=========");
    ​
            arr[0][0] = 10;
            System.out.println(arr[0][0]);
            System.out.println(arr[0][1]);
            System.out.println("=================");
    ​
            //拿到第二个一维数组
            System.out.println(arr[1][0]);
            System.out.println(arr[1][1]);
    ​
            //拿到第三个一维数组
            System.out.println(arr[2][0]);
            System.out.println(arr[2][1]);
    ​

格式二

数据类型[][] 变量名 = new 数据类型[m][];
  • 格式解释
    • m表示这个二维数组有多少个一维数组
    • 这一次没有直接给出一维数组的元素个数,可以动态的给出
  • 举例
    //二维数组中有3个一维数组,但这一次并没有给出第一个一维数组的长度
    int[][] arr = new int[3][];
    ​
    // 第一个数组的元素个数为2
    arr[0] = new int[2];
    ​
    // 第二个数组的元素个数为3
    arr[1] = new int[3]
        
    // 第三个数组的元素个数为1
    arr[2] = new int[1];

格式三

标准版:
    数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};
简化版:
    数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};

  • 举例
    int[][] arr =  {{1,2,3},{4,5},{6}};

二维数组遍历

  • 案例代码

        

public class ArrayCase {
    public static void main(String[] args) {
       
        // 定义二维数组
        int[][] arr = {{22, 66, 44}, {77, 33, 88}, {25, 45, 65}};

        //遍历第一个一维数组
        for(int x =0; x<arr[0].length; x++){
            System.out.println(arr[0][x]);
        }
        System.out.println("=====================");

        //遍历第二个一维数组
        for(int x =0; x<arr[1].length; x++){
            System.out.println(arr[1][x]);
        }
        System.out.println("=====================");

        //遍历第三个一维数组
        for(int x =0; x<arr[2].length; x++){
            System.out.println(arr[2][x]);
        }
        System.out.println("=====================");

        //用户循环改进y
        for (int y = 0; y <arr.length ; y++) {
            for(int x =0; x<arr[y].length; x++){
                System.out.println(arr[y][x]);
            }
            System.out.println();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值