专栏首页Java 学习【Java】04 数组

【Java】04 数组

数组是编程语言中最常见的一种数据结构,可用于存储多个数据,每个数组元素存放一个数据,通常可通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值。

一、一维数组

1.1 定义数组

初始化:   静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。   动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。

语法:

// 只定义数组长度
数据类型[] 数组名 = new 数据类型[数组长度];	// int[] arr = new int[5];

// 定义时直接给出数组元素
数据类型[] 数组名 = new 数据类型[] {元素1, 元素2, ··· , 元素n};		// int[] arr = new int[] {1, 2, 3, 4, 5};
数据类型[] 数组名 = {元素1, 元素2, ··· , 元素n};	// int[] arr = {1, 2, 3, 4, 5};

注意:   数组名中存储的是数组的地址并不是数组本身,直接打印会打印出数组的哈希地址值

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

  数组元素的数据类型决定了数组的数据类型,数组中只能存在同一种数据类型的元素

1.2 数组的赋值、取值

1.2.1 赋值

初始化赋值:

int[] arr = {1, 2, 3, 4, 5}

逐一赋值:

int[] arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;

注意:  数组的第一个元素是由 0 开始的

拓展:    一旦为数组的每个数组元素分配了内存空间,每个内存空间里存储的内容就是该数组元素的值,即使这个内存空间存储的句容是空,这个空也是一个值(null)。不管以哪种方式来初始化数组,只要为数组元素分配了内存空间,数组元素就具有了初始值。故不能只分配内存空问,不赋初始值。

1.2.2 取值

  数组的取值直接使用 数组名[index] 取值

int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr[0]);		// 1

1.3 数组的相关操作

1.3.1 数组的长度

  初始化数组时会在内存中分配内存空间,内存空间的大小决定了一维数组能够存储多少个元素,也就是数组长度。如果不知道数组的长度,可以使用数组对象自带的 length 属性获取

int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr.length);		// 5

1.3.2 数组的遍历

分析:   遍历数组需要逐一将元素从数组中取出来。

int[] arr = {1, 2, 3, 4, 5};
int a = arr[0];    //index = 0; a = 1
int b = arr[1];    //index = 1; b = 2
int c = arr[2];    //index = 2; c = 3
int d = arr[3];    //index = 3; d = 4
int e = arr[4];    //index = 4; e = 5

  通过上面可以知道,将数组逐一取出只需要将 index++ 即可。   故可以通过循环来实现数组的遍历

实现:

public class Test {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

		// 数组的最小索引为 0,最大索引为 arr.length - 1
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

1.3.3 数组的最值

分析:   假设第 0 号元素是最值   将数组中其他元素注意拿出来与第 0 号元素进行比较。   若其他元素大于/小于当前最值,则覆盖当前最值。

实现:

public class Test {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int max = arr[0];       //假设 arr[0] 是最大值
        int min = arr[0];       //假设 arr[0] 是最小值

        //遍历数组
        for (int i = 0; i < arr.length; i++) {
            //若数组元素大于 max 则替换 max
            if (max < arr[i]) {
                max = arr[i];
            }
            //若数组元素小于 min 则替换 min
            if (min > arr[i]) {
                min = arr[i];
            }
        }

        System.out.println("最大值为:" + max + "最小值为:" + min);
    }
}

1.3.4 数组的反转

分析:   将第 0 号元素与第 length - 1 号元素对换。   将第 1 号元素与第 length - 2 号元素对换。   ···   将第 m 号元素与第 n 号元素对换。   直到所有元素对换完毕,即:m > length / 2 或 m > n

实现:

public class Test {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int temp;       //声明一个临时变量

        for (int i = 0; i < arr.length / 2; i++) {
            //进行交换操作
            temp = arr[i];
            arr[i] = arr[arr.length - i - 1];
            arr[arr.length - i - 1] = temp;
        }
    }
}

二、二维数组

   若将一维数组理解为一层房间,那么二维数组就可以理解为整栋楼的房间。二维数组的每一个元素都是一个一维数组。

2.1 定义二维数组

// 可以省略 列,不能省略 行
int[][] arr = new int[2][3];

// 定义时直接给出数组元素
int[][] arr = new int[][] {{1, 2}, {3, 4}, {5, 6}};
int[][] arr = {{1, 2}, {3, 4}, {5, 6}};

2.2 注意事项

  左行右列

  初始化时只给定行,不给定列时可以创建不规则数组

int[][] arr = new arr[3][];
arr[0] = {1, 2, 3};		// 第一行分配 3 个
arr[1] = {5, 6}			// 第二行分配 2 个
arr[2] = {4, 7, 8, 9}	// 第三行分配 4 个

三、初见异常

3.1 索引越界异常(IndexOutOfBoundsException)

   见名知义,就是索引超过了数组所规定的界限(即超出了数组索引的最大范围)

public class Test {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

        System.out.println(arr[5]); //当前索引最大值为 4 ,却要打印索引为 5 的元素。
    }
}

3.2 空指针异常(NullpointException)

   空指针异常就是数组名并没有指向一个地址

public class Test {
	public static void main(String[] args) {
	    int[] arr = null;   //定义一个数组,地址值为空
	
	    System.out.println(arr[0]); //当前数组名并没有指向一个数组空间,却要打印一个不存在的元素
	}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring 基于 XML 的 IOC

      依赖注入(Dependency Injection)是 Martin Fowler 在 2004 年提出的关于 “控制反转” 的解释。Martin Fowl...

    Demo_Null
  • 【Java】02 数据类型与运算符

       编写程序时给代码添加一些注释,用以说明某段代码的作用,或者说明某个类的用途、某个方法的功能,以及该方法的参数和返回值的数据类型及意义等,可以提高代码的可读...

    Demo_Null
  • 使用 Proxifier 将本机代理为服务器

      咱们并不能直接使用 Proxifier 进行代理,需要为其先创建一个隧道。就好比咋给两个世界搞一个虫洞,让小飞机可以穿过虫洞到达另外一个世界。常见的 SSH...

    Demo_Null
  • LeetCode刷题记录:剑指 Offer 10- I. 斐波那契数列

    解题思路: 根据输入的 n 声明一个数组,定义好数组的前两个元素(即第 0 项和第 1 项),从第三个元素开始遍历数组,使数组的每一个元素等于前两个元素之和。...

    英雄爱吃土豆片
  • java基础学习_基础语法(下)01_day05总结

    ============================================================================= ==...

    黑泽君
  • 寻找数组中第二小的元素

    一觉睡到小时候
  • 《Monkey Java》课程9.0之数组

    GitOPEN
  • java基础04

    待你如初见
  • 求解连续子数组和全解析-常规解法VS树状数组!

    本文将介绍几求解数组前缀和和连续子数组和的三种方法,分别是遍历法、辅助数组法、树状数组法。

    石晓文
  • [算法题] 荷兰国旗问题

    假设这样的条纹有多条,且各种颜色的数量不一,并且随机组成了一个新的图形,新的图形可能如下图所示,但是绝非只有这一种情况:

    CoderJed

扫码关注云+社区

领取腾讯云代金券