首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java基础-数组

Java基础-数组

原创
作者头像
reload
修改于 2024-01-19 00:08:05
修改于 2024-01-19 00:08:05
2850
举报
文章被收录于专栏:Java后端Java后端

前两篇介绍了Java的数据类型和流程控制,现在来讲一下Java的数组,作为一种引用类型,也是非常常见和常用的。这次的知识框架如下所示。

一、声明

Java在创建变量前必须先声明变量,而数组作为一种引用类型的变量,在创建数组变量前也必须要先声明数组变量,才能在程序中使用数组。声明格式如下。

代码语言:java
AI代码解释
复制
int[] arr; // 数组元素类型[] 数组名; // 推荐
int arr[]; // 数组元素类型 数组名[]; // 不推荐

二、创建(初始化)

数组的初始化可以分为静态初始化和动态初始化两种。

1、静态初始化

静态初始化即在数组创建的同时为数组赋好值。

1)写法1:在堆空间开辟(new)一块内存区域来存储数组的元素,并将该内存区域的地址值赋值给该数组的引用变量 arr(引用)

代码语言:java
AI代码解释
复制
// 数组元素类型[] 数组名 = new 数组元素类型[] {元素 1, 元素 2, ...};
int[] arr = new int[] {1, 2, 3};

2)写法2:简洁,必须声明的同时作初始化。

代码语言:java
AI代码解释
复制
// 数组元素类型[] 数组名 = {元素 1, 元素 2, ...};
int[] arr = {1, 2, 3};

2、动态初始化

动态初始化分配给定空间的数组大小(数组长度确定)。

代码语言:java
AI代码解释
复制
// 数组元素类型[] 数组名 = new 数组元素类型[length];
int[] arr = new int[3]; // [0, 0, 0]

3、几点注意

1)数组是定长的:一旦初始化完成,数组的长度就固定了,不能更改,除非重新做初始化。 2)数组是引用数据类型,可以赋值为 null,表示没有引用任何内存空间。 3)new 关键字:在堆空间开辟一块内存区域,用来存储数据。

操作数组常见异常:

1)NullPointerException:空指针异常(没有引用地址值)。 2)ArrayIndexOutOfBoundsException:数组的索引越界异常。

三、相关操作

1、访问

访问数组元素非常简单,重新赋值也可以实现更改数组元素。还有一个是 length属性可以求得数组长度。eg:

代码语言:java
AI代码解释
复制
public class Test {
    public static void main(String[] args) {
        int[] arr = {4, 2, 3}; // 静态初始化
        int len = arr.length;  // 数组长度,索引范围 [0, arr.length - 1]
        int num = arr[0];      // 访问
        arr[0] = 1;            // 修改 
        System.out.println(num);    // 4
        System.out.println(arr[0]); // 1
        System.out.println(len);    // 3
    }
}

2、遍历

数组的遍历即逐个输出数组元素的过程。

2.1 普通 for 循环

可以直接使用 for循环输出数组元素。如下:

代码语言:java
AI代码解释
复制
public class Test {
    public static void main(String[] args) {
        int[] arr = {4, 2, 3}; // 静态初始化
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}
2.2 for-each(增强 for循环)

for-each 是 JDK 1.5 引进了一种新的循环类型,可以在不使用索引(下标)的情况下遍历数组。

eg:以下列举3类数组元素类型,注意 for里面要加上对应的元素类型,ele任意命名(相当于 for循环里面的 i),冒号后面跟的是数组名

1)数组元素为整数类型

代码语言:java
AI代码解释
复制
public class Test {
    public static void main(String[] args) {
        int[] arr = {4, 2, 3}; // 静态初始化
        for (int ele : arr) {
            System.out.println(ele);
        }
    }
}

2)数组元素为字符类型

代码语言:java
AI代码解释
复制
public class Test {
    public static void main(String[] args) {
        char[] arr = {'a', 'b', 'c'}; // 静态初始化
        for (char ele : arr) {
            System.out.println(ele);
        }
    }
}

3)数组元素为String类型

代码语言:java
AI代码解释
复制
public class Test {
    public static void main(String[] args) {
        String[] name = {"zhangsan", "lishi", "wangwu"}; // 静态初始化
        for (String n : name) {
            System.out.println(n);
        }
    }
}

虽然 for-each循环比较好用,但也要注意以下几点:

1)只能访问数组元素,不能赋值,在不关心数组的索引时使用(因为它不需要使用索引) 2)当数组元素是引用类型(数组类型)时,不建议使用(需要先知道值不为 null 的元素个数)。

3、常见数组算法

这里列举几个与数组相关的算法,包括两个排序和一个查找。

3.1 冒泡排序

1)基本原理

冒泡排序(Bubble Sort)通过重复地走访过要排序的数列,一次比较两个元素,若顺序(从小到大/从大到小)错误就把他们交换过来,直到不需要交换为止(排序完成)。顾名思义,该算法名字的由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序的平均时间复杂度 O(n^2),空间复杂度 O(1)。关键字相同的元素在排序之后相对位置不变,所以是稳定的(自行验证)。

2)过程演示

对未排序的各元素从头到尾依次比较相邻的两个元素 arri、arri + 1,共要进行 arr.length -1 轮比较。

3)代码实现

代码语言:java
AI代码解释
复制
import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] nums = {5,8,4,3,6,1};
        bubbleSort(nums);
        System.out.println("冒泡排序完的数组:"+ Arrays.toString(nums));

    }
    static void bubbleSort(int[] arr) {
        for (int times = 1; times <= arr.length - 1; times++) {
            for (int i = 0; i <= arr.length - times - 1; i++) {
                if (arr[i] > arr[i + 1]) {
                    // 交换
                    arr[i] = arr[i] ^ arr[i + 1];
                    arr[i + 1] = arr[i] ^ arr[i + 1];
                    arr[i] = arr[i] ^ arr[i + 1];
                }
            }
            System.out.println("第"+times+"趟:"+Arrays.toString(arr));
        }
    }
}

Arrays.toString()方法:用于将数组转换成一个字符串,括在方括号("[]")中,相邻元素用字符 ", "(逗号加空格)分隔。

3.2 选择排序

1)基本原理

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。重复第二步,直到所有元素均排序完毕。

选择排序平均时间复杂度 O(n^2),空间复杂度 O(1),不稳定。

2)过程演示

3)代码实现

代码语言:java
AI代码解释
复制
import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] nums = {5,8,4,3,6,1};
        selectionSort(nums);
        System.out.println("选择排序完的数组:"+ Arrays.toString(nums));

    }
    static void selectionSort(int[] arr) {  // 选择排序
        for (int i = 0; i <= arr.length - 2; i++) {
            for (int j = i + 1; j <= arr.length - 1; j++) {
                if (arr[i] > arr[j]) {
                    // 交换
                    arr[i] = arr[i] ^ arr[j];
                    arr[j] = arr[i] ^ arr[j];
                    arr[i] = arr[i] ^ arr[j];
                }
            }
            System.out.println("第"+(i+1)+"趟:"+Arrays.toString(arr));
        }
    }
}
3.3 二分查找(折半查找)

1)基本原理

二分查找,也称折半查找,是一种在有序数组中查找目标元素的算法。它的原理是不断将查找范围减半,直到找到目标元素或确定目标元素不存在。

pass:二分查找的前提是数组已经排好序

2)代码实现

代码语言:java
AI代码解释
复制
import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] nums = {5,8,4,3,6,1};
        int target = 5; // 查找目标元素
        Arrays.sort(nums);  // 二分查找的前提是数组必须有序
        System.out.println("排序后的数组为:" + Arrays.toString(nums));
        System.out.println("目标元素" + target + "的下标为:" + binarySearch(nums,target));

    }
    static int binarySearch(int[] arr, int key) {   // 二分查找
        int low = 0;
        int high = arr.length - 1;
        while (low <= high) {
            int mid = (low + high) >> 1;
            if (arr[mid] < key) {
                low = mid + 1;
            } else if (arr[mid] > key) {
                high = mid - 1;
            } else {
                while (mid - 1 >= 0 && arr[mid -1] == key) {
                    mid--;
                }
                return mid;
            }
        }
        return -1;
    }
}

4、Arrays工具类(重点)

java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。

4.1 常用方法汇总

1、 String toString(Object[] arr):将 a 数组转换成一个字符串,括在方括号("[]")中,相邻元素用字符 ", "(逗号加空格)分隔。

2、 void sort(Object[] a):根据元素的自然顺序对指定对象数组按升序进行排序,数组中的所有元素都必须实现 Comparable 接口。

3、 void parallelSort(Object[] a):以并发的方式对 a 数组的数组元素进行排序。

4、 type binarySearch(Object[] a, type key):使用二分法査询 key 元素值在 a 数组中出现的索引,如果 a 数组不包含 key 元素值,则返回 -(low + 1)(调用该方法时要求数组中元素已经按升序排列)。

5、 boolean equals(Object[] a, Object[] a2):如果 a 数组和 a2 数组的长度相等,且 a 数组和 a2 数组的数组元素也对应相同,该方法将返回 true。

6、void fill(int[] a, int val):将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。

7、 Object[] copyOf(Object[] original, int newLength):复制 original 数组,截取或用 0(数值类型)、false(布尔类型)或者 null(引用类型)填充,以使新数组的长度为 newLength。

4.2 以上方法对应的代码实现
代码语言:java
AI代码解释
复制
import java.util.Arrays;

public class Test {
    public static void main(String[] args){
        int[] arr1={1,3,6,7,9};
        int[] arr2={3,6,1,7,9};
        System.out.println(Arrays.toString(arr1));  //1.数组与字符串的相互转换 [1, 3, 6, 7, 9]
        Arrays.sort(arr2);  //2.排序后arr2为: 1,3,6,7,9
        System.out.println(Arrays.equals(arr1,arr2)); //3.数组比较,true

        Arrays.fill(arr1,9);    //4.fill方法给数组赋值
        for (int i:arr1){   // 遍历查看赋值结果
            System.out.println(i);  // 5个9
        }
        System.out.println("-------");
        int[] newarr=Arrays.copyOf(arr1,4); //5.数组复制,截取指定长度
        for(int i:newarr){
            System.out.println(i);  // 4个9
        }
        System.out.println("-------");
        Arrays.sort(arr2);  //查找时先排序,排序后arr2为:1,3,6,7,9
        int index=Arrays.binarySearch(arr2,6); //6.查找元素6在arr2的位置
        System.out.println(index);  //2
    }
}

注:使用前要先导入java.util.Arrays工具类,才能调用类中的方法。调用格式为:Arrays.要用的方法。 pass:Arrays工具类里面的方法还有很多,但较为常用的就是这些,其他的方法有兴趣的可以自行去了解。

四、二维数组

本质还是一维数组, 只不过数组元素是引用类型( 数组类型), 数组元素里保存的引用指向一维数组。

1、初始化

1.1 静态初始化
代码语言:java
AI代码解释
复制
int[][] arr = new int[][] { {1, 2, 3}, {4, 5}, {6} };
int[][] arr = { {1, 2, 3}, {4, 5}, {6} };
1.2 动态初始化
代码语言:java
AI代码解释
复制
int[][] arr = new int[3][]; // 即 int[][] arr = {null, null, null};
int[][] arr = new int[3][4];
1.3 关于数组长度

arr.length 为外层数组的长度,arri.length 为内层数组的长度。

2、遍历

依葫芦画瓢,注意与一维的区别。

2.1 普通 for循环
代码语言:java
AI代码解释
复制
public class Test {
    public static void main(String[] args){
        int[][] arr = { {1, 2, 3}, {4, 5}, {6} };
        for (int i = 0; i < arr.length; i++) {  // arr.length,外层数组的长度
            for (int j = 0; j < arr[i].length; j++) {   // arr[i].length,内层数组的长度
                System.out.println(arr[i][j]);
            }
        }
    }
}
2.2 增强 for 循环(for-each)
代码语言:java
AI代码解释
复制
public class Test {
    public static void main(String[] args){
        int[][] arr = { {1, 2, 3}, {4, 5}, {6} };
        for (int[] outerArr : arr) {    // 注意这里与一维的区别
            for (int oa : outerArr)
                System.out.println(oa);
        }
    }
}

最后,本节的内容到这里就结束了。

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
完整的java数组操作应用知识汇总
数组是一种非常有用和常用的数据类型,存在于每种程序语言之中,java中的数组是一种最简单的复合数据类型,刚学习java数组的小白们大多都会听到一句这样的话:java是纯面向对象的语言,它的数组也是一个对象。所以很多人就按照一个对象的方式来使用数组,后来你会发现,将数组作为一个类来使用在实现上是多么的“不自然”。下面就来全面了解一下关于java中数组的知识。
三哥
2018/08/20
1.7K0
完整的java数组操作应用知识汇总
Java基础(六):数组
java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法
Java微观世界
2025/01/21
800
Java基础(六):数组
《JavaSE-第六章》之容器数组
本章大家介绍一个存储相同数据类型的容器----数组,以及便于我们对数组操作的工具类Arrays类的使用。
用户10517932
2023/10/07
2330
《JavaSE-第六章》之容器数组
5. 数组
(2)数组的元素类型:即创建的数组容器可以存储什么数据类型的数据​。元素的类型可以是任意的Java的数据类型。例如:int、String、Student等。
捞月亮的小北
2023/12/01
2460
5. 数组
第81节:Java中的数组
本节介绍数组的基本概念,数据就是一种数据结构,可以用来存储多个数据,每个数组中可以存放相同类型的数据。比如,在学校,我们是一个班,这里的班级中每个同学都是这个班级数组中的元素,都是同样的类型为学生,对应的学号就是我们的索引,但是在现实中的学号一般都是从1开始的,而在Java中的数组索引是从0开始的。
达达前端
2019/07/03
9120
第81节:Java中的数组
No 6. 数组操作的奇技淫巧
前边已经讲过了 Java 中的 8 大基本数据类型,这篇文章主要就来讲讲引用类型中的数组。主要内容安排如下:
村雨遥
2021/05/08
5180
No 6. 数组操作的奇技淫巧
《JavaSE》---9.<基础语法(java数组的3种初始化&常规使用)>
1.数组是一段连续的内存空间,所以支持随机访问,通过下标访问快速访问数组中任意位置的元素
用户11288958
2024/09/24
1970
《JavaSE》---9.<基础语法(java数组的3种初始化&常规使用)>
从实例出发,深入探索Java SE中数组的易错点
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2024/02/04
2320
从实例出发,深入探索Java SE中数组的易错点
【Java SE】详解数组
前言:在C语言中我们已经学习过数组,接下来,我们再主要学习一下Java中的数组,在Java中,数组变得更加高效和使用。
用户11369558
2024/11/20
1310
【Java SE】详解数组
【JavaSE学习】 Day3 数组
  本次文章讲述的是JavaSE数组的使用,讲述一维数组、二维数组创建和使用、常见数组操作和使用、Arrays工具类的使用、数组的常见异常。
小小程序员
2023/02/24
2290
【JavaSE学习】 Day3 数组
【Java】——数组深度解析(从内存原理到高效应用实践)
数组是一种复合数据类型,它可以看作是一个容器,用于存储多个相同类型的变量。这些变量在内存中按顺序排列,每个变量都有一个唯一的索引,通过索引可以快速访问数组中的元素。在Java中,数组是对象,无论它存储的是基本数据类型还是引用数据类型。
User_芊芊君子
2025/04/08
1040
【Java】——数组深度解析(从内存原理到高效应用实践)
【06】JAVASE-数组讲解【从零开始学JAVA】
Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。
用户4919348
2024/05/25
1930
【06】JAVASE-数组讲解【从零开始学JAVA】
【JAVASE】数组技巧与实践:提升你的编程能力
for-each 是 for 循环的另外一种使用方式. 能够更方便的完成对数组的遍历. 可以避免循环条件和更新语句写错
小舒不服输
2024/01/30
1480
【JAVASE】数组技巧与实践:提升你的编程能力
Java的学习笔记(05)数组
dataType[] arrayRefVar; //首选方法 或 dataType arrayReVar[]; java语言使用new操作符来创建数组,语法如下:
卢衍飞
2023/02/13
2250
【趣学程序】Java中的数组
数组简介: 数组(Array)是Java 语言中内置的一种基本数据存储结构,通俗的理解,就是一组数的集合,目的是用来一次存储多个数据。数组是程序中实现很多算法的基础,可以在一定程度上简化代码的书写。 注意 数组的好处:数组里的每个元素都有编号,编号从0开始,并且依次递增,方便操作这些元素; 使用Java数组:必须先声明数组,再给该数组分配内存; 数组对应在内存中一段连续空间。 数组元素必须是相同数据类型,也可以是引用数据类型,但是同一个数组中的元素必须是同一类数据类型。 一维数组 一维数组:可以理解为一列多
趣学程序-shaofeer
2019/07/27
6070
【Java探索之旅】掌握数组操作,轻松应对编程挑战
使用了 java.util.Arrays 类中的 toString 方法。这个方法接收一个数组作为参数,并返回一个表示该数组的字符串。这个字符串是由数组元素的字符串表示形式组成,并使用逗号和空格分隔,并且整个字符串被方括号 [] 包围
屿小夏
2024/04/18
1120
【Java探索之旅】掌握数组操作,轻松应对编程挑战
知识改变命运 第七集(下):Java中数组的定义与使用
使用这个方法后续打印数组就更方便一些. Java 中提供了 java.util.Arrays 包, 其中包含了一些操作数组的常用方法
用户11319080
2024/10/17
1080
知识改变命运 第七集(下):Java中数组的定义与使用
【 JavaSE 】 深入数组
目录 前言 一维数组 创建一维数组 一维数组的使用 数组作参数 认识 JVM 内存区域划分 数组做参数基本用法 理解引用类型 认识 null 数组作为方法的返回值 二维数组 二维数组的长度 二维数组的遍历 数组练习 ---- 前言 ---- 本章主要讲解: 一维数组的定义和使用 数组在内存的基本存储知识 二维数组的定义和使用 数组练习 一维数组 ---- 什么是数组: 数组本质上就是让我们能 "批量" 创建相同类型的变量(相同的类型) 注:特别是表示大量的数据,用数组非常便捷 创建一维数组 基本
用户9645905
2022/11/30
4270
【 JavaSE 】 深入数组
数组的初始化及其基本属性
第一种:数据类型[] 数组名 = new 数据类型[数据长度];(动态初始化过程) int[] arr = new int [5]; 第二种:数据类型 数组名[] = {数据1,数据2,数据3……};(静态初始化过程) int arr[] = {1,2,3,4,5}; 动态初始化:我们自己指定了数组长度,系统会自动开辟相应的内存空间,并且给所有位置分配一个默认值。 静态初始化:我们在初始化开始就给定了数组值,系统会根据值的数量,开辟内存空,所以不需要我们指定数组长度。 静态对象还可以用在匿名对象上(参考面向对象的匿名对象)
全栈程序员站长
2022/09/07
5290
java中数组遍历的三种方式
通常遍历数组都是使用for循环来实现。遍历一维数组很简单,遍历二维数组需要使用双层for循环,通过数组的length属性可获得数组的长度。
全栈程序员站长
2022/09/05
1.6K0
相关推荐
完整的java数组操作应用知识汇总
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档