Java 笔记 15:Java 数组相关内容补充,多维数组,Arrays 类的常见用法,以及冒泡排序

一、前言

记录时间 [2024-05-05]

系列文章简摘:
Java 笔记 01:Java 概述,MarkDown 常用语法整理
Java 笔记 02:Java 开发环境的搭建,IDEA / Notepad++ / JDK 安装及环境配置,编写第一个 Java 程序
Java 笔记 13:Java 数组内容,数组的声明、创建、初始化、赋值等,以及内存分析
Java 笔记 14:Java 数组内容,数组的基本特点、数组边界,以及一些数组使用案例

更多 Java 相关文章,请参考上面专栏哦。

本文是对 Java 数组相关内容的补充,主要为多维数组概述,以及 Arrays 类的常见用法。同时,文章详细介绍了冒泡排序的相关使用,并进行简单的算法优化。


二、多维数组

1. 概述

在 Java 中,可以创建多维数组来表示多维数据结构,比如矩阵、立方体等。

多维数组是数组的数组,也就是说,数组的元素也可以是数组

例如,二维数组是一个特殊的一维数组,它的每一个元素都是一个一维数组。

我们对不同维度的数组进行类比:

// 创建一个包含 3 个元素的一维数组
int[] array = {1,2,3};

// 创建一个 3x3 的二维数组
int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

// 创建一个 3x3x2 的三维数组
int[][][] array3D = {
    { {1, 2}, {3, 4}, {5, 6} },
    { {7, 8}, {9, 10}, {11, 12} },
    { {13, 14}, {15, 16}, {17, 18} }
};

简而言之,就是数组多一个维度,就是在原来单纯放元素的地方,放一个数组。


2. 定义

在之后 Java 编程中,比较常用的也是二维数组,这里以二维数组举例。

如图所示,我们定义了一个二维数组 arr[3][2],它是 3 行 2 列的。其中,第一个维度控制行数为 3 行,第二个维度控制列数为 2 列。

两个维度的下标索引都是从 0 开始的。可以根据下标确定每个元素的位置。比如,arr[0][1] 表示第 1 行第 2 个数据元素。

在这里插入图片描述


3. 使用

打印二维数组元素

要打印 Java 中的二维数组元素,可以使用嵌套的循环来遍历数组,并逐个打印每个元素。

以下是一个简单的示例代码:

public class Main {
    public static void main(String[] args) {
        
        // 定义一个 3 行 3 列的二维数组
        int[][] array = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        
        // 遍历行 array.length 确定行数
        for (int i = 0; i < array.length; i++) {
            
            // 遍历列 array[i].length 确定列数
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + " ");
            }
            // 换行
            System.out.println();
        }
    }
}

这段代码将打印出以下内容:

1 2 3 
4 5 6 
7 8 9 

三、Arrays 类

1. 概述

数学工具类 java.util.Arrays 提供了许多有用的方法来处理数组。这些方法包括排序、搜索、比较等等。具体可以查看官方文档。

如图所示,Arrays 类中的方法都是静态方法,可以直接使用类名调用这些方法,而不需要创建 Arrays 类的实例。

例如,可以直接通过 Arrays.sort(array) 调用 sort 方法来对数组进行排序,而不需要先创建一个 Arrays 对象。这样的语法简洁明了,适合处理数组的情况。

在这里插入图片描述


2. 常用方法

java.util.Arrays 类提供了许多有用的方法来处理数组,以下是一些常用的方法:

  • toString(array):将数组转换为字符串形式。
  • sort(array):对数组进行排序。
  • binarySearch(array, key):在排序后的数组中使用二分搜索来查找指定的元素。
  • equals(array1, array2):比较两个数组是否相等。
  • fill(array, value):将数组的所有元素设置为指定的值。
  • copyOf(array, length):复制数组的一部分到一个新数组。
  • asList(array):将数组转换为列表。

打印数组元素

可以使用 Arrays.toString() 方法将数组转换为字符串,然后打印这个字符串。

这个方法非常适合于快速查看数组的内容。

import java.util.Arrays;

int[] array = {1, 2, 3, 4, 5};
System.out.println(Arrays.toString(array));

// 这样会输出
[1, 2, 3, 4, 5]

查看一些 toString 方法都干了写什么。

看看它是怎么实现打印数组这个功能的。

public static String toString(int[] a) {
        if (a == null)
            return "null";
        int iMax = a.length - 1;
        if (iMax == -1)
            return "[]";

        StringBuilder b = new StringBuilder();
        b.append('[');
        for (int i = 0; ; i++) {
            b.append(a[i]);
            if (i == iMax)
                return b.append(']').toString();
            b.append(", ");
        }
}

数组排序

要对数组进行排序,可以使用 Arrays 类中的 sort() 方法。

以下是一个简单的示例,演示了如何使用 Arrays.sort() 方法对整型数组进行排序:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] array = {5, 2, 9, 1, 7};
        
        // 对数组进行排序
        Arrays.sort(array);
        
        // 打印排序后的数组
        System.out.println("Sorted array: " + Arrays.toString(array));
    }
}

这段代码会输出:

Sorted array: [1, 2, 5, 7, 9]

Arrays.sort() 方法会按照升序对数组进行排序。

如果需要按照降序排序,可以先使用 Arrays.sort() 方法排序数组,然后反转数组中的元素,或者自定义一个 Comparator 对象来实现降序排序。


填充数组

要将数组的所有元素设置为指定的值,可以使用 Arrays 类中的 fill() 方法。

这个方法会将指定数组的所有元素都设置为指定的值。

以下是一个示例代码,演示了如何使用 Arrays.fill() 方法将数组的所有元素设置为指定的值:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        
        // 创建一个长度为 5 的整型数组
        int[] array = new int[5]; 
        
        // 将数组的所有元素设置为指定值
        int value = 10;
        Arrays.fill(array, value);
        
        // 打印数组的内容
        System.out.println("Array after filling: " + Arrays.toString(array));
    }
}

这段代码会输出:

Array after filling: [10, 10, 10, 10, 10]

在这个例子中,我们创建了一个长度为 5 的整型数组,并将数组的所有元素都设置为值为 10。


如果想要设置数组中的特定范围为指定值,可以直接调用 Arrays.fill() 方法并传入相应的参数。

以下是使用 Arrays.fill() 方法来实现的示例:

将数组的索引 2(包括)到索引 4(不包括)之间的元素设置为 1。

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        // 创建一个长度为 5 的整型数组
        int[] array = new int[5]; 
        
        // 将索引为 2(包括)到索引为 4(不包括)之间的元素设置为 1
        Arrays.fill(array, 2, 4, 1);
        
        // 打印数组的内容
        System.out.println("Array after setting values: " + Arrays.toString(array));
    }
}

这段代码会输出:

# 将索引为 2(包括)到索引为 4(不包括)之间的元素设置为 1
Array after setting values: [0, 0, 1, 1, 0]

四、冒泡排序

冒泡排序是一种简单的排序算法:

  • 比较数组中,两个相邻的元素,如果第 1 个数比第 2 个数大,就交换它们的位置;
  • 每一次比较,都会产生出一个最大,或者最小的数字;
  • 下一轮可以少一次排序;
  • 依次循环,直到结束。

1. 交换数组元素位置

要交换数组中的两个元素的位置,可以使用一个临时变量来暂存一个元素的值,然后将其中一个元素的值赋给另一个元素,最后将暂存的值赋给另一个元素。

就好比有两杯水,想要交换它们的位置,需要借助第三个杯子来临时存放其中一杯水,然后将另一杯水倒入第一个杯子,再将第三个杯子中的水倒入第二个杯子。这样就完成了两杯水的位置交换。

以下是一个模拟这个过程的示例:

public class Main {
    public static void main(String[] args) {
        // 假设有两杯水,分别用整数表示
        int cup1 = 1;
        int cup2 = 2;
        
        System.out.println("交换前: Cup 1: " + cup1 + ", Cup 2: " + cup2);
        
        // 交换水杯位置
        int temp = cup1; 	// 临时变量用于存放 cup1 的内容
        cup1 = cup2; 		// 将 cup2 的内容倒入 cup1
        cup2 = temp; 		// 将临时变量中的内容倒入 cup2
        
        System.out.println("交换后: Cup 1: " + cup1 + ", Cup 2: " + cup2);
    }
}

2. 实现冒泡排序

以下是冒泡排序的实现示例:

首先定义了一个 bubbleSort 方法来执行冒泡排序。然后创建一个示例数组,调用 bubbleSort 方法对其进行排序,并输出排序后的数组。

public class BubbleSort {
    
    // 冒泡排序方法体
    public static void bubbleSort(int[] array) {
        
        // 确定数组长度
        int n = array.length;
        
        // 外层循环,判断一共要比较 n-1 轮
        for (int i = 0; i < n - 1; i++) {
            
            // 内层循环,比较判断两个数,如果第 1 个数比第 2 个数大,则交换位置
            for (int j = 0; j < n - i - 1; j++) {
                
                if (array[j] > array[j + 1]) {
                    // 交换 array[j] 和 array[j+1]
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] array = {64, 34, 25, 12, 22, 11, 90};
        System.out.println("Original array: " + Arrays.toString(array));

        bubbleSort(array);

        System.out.println("Sorted array: " + Arrays.toString(array));
    }
}

3. 算法优化

冒泡排序的平均时间复杂度为:
O ( n 2 ) O(n^2) O(n2)
可见,冒泡排序虽然简单易懂,但效率较低,尤其是在处理大规模数据集时。

如何优化:加入标志位

在每次遍历过程中,如果某一次遍历没有发生元素交换,说明数组已经有序,可以提前结束排序过程。

以下是一个优化后的冒泡排序的示例代码:

public class BubbleSort {
    public static void bubbleSort(int[] array) {
        int n = array.length;
        
        // 标志位,表示是否进行了元素交换
        boolean swapped; 
        
        for (int i = 0; i < n - 1; i++) {
            
            swapped = false;
            
            for (int j = 0; j < n - i - 1; j++) {
                
                if (array[j] > array[j + 1]) {
                    // 交换 array[j] 和 array[j+1]
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    
                    // 标志位设为 true,表示进行了元素交换
                    swapped = true; 
                }
            }
            
            // 如果本次遍历没有进行元素交换,说明数组已经有序,提前结束排序
            if (!swapped) {
                break;
            }
        }
    }

    public static void main(String[] args) {
        int[] array = {64, 34, 25, 12, 22, 11, 90};
        System.out.println("Original array: " + Arrays.toString(array));

        bubbleSort(array);

        System.out.println("Sorted array: " + Arrays.toString(array));
    }
}

五、总结

本文是对 Java 数组相关内容的补充,主要为多维数组概述,以及 Arrays 类的常见用法。同时,文章详细介绍了冒泡排序的相关使用,并进行简单的算法优化。


一些参考资料

狂神说 Java 零基础:https://www.bilibili.com/video/BV12J41137hu/
TIOBE 编程语言走势: https://www.tiobe.com/tiobe-index/
Typora 官网:https://www.typoraio.cn/
Oracle 官网:https://www.oracle.com/
Notepad++ 下载地址:https://notepad-plus.en.softonic.com/
IDEA 官网:https://www.jetbrains.com.cn/idea/
Java 开发手册:https://developer.aliyun.com/ebook/394
Java 8 帮助文档:https://docs.oracle.com/javase/8/docs/api/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/593400.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【在线OJ】Vue在线OJ项目

一、主页 二、题库 三、在线编译器 四、比赛 五、搜索 六、个人主页

【区块链】比特币架构

比特币架构 2009年1月&#xff0c;在比特币系统论文发表两个月之后&#xff0c;比特币系统正式运行并开放了源码&#xff0c;标志着比特币网络的正式诞生。通过其构建的一个公开透明、去中心化、防篡改的账本系统&#xff0c;比特币开展了一场规模空前的加密数字货币体验。在区…

vue3(实现上下无限来往滚动)

一、问题描述 一般在大屏项目中&#xff0c;很常见的效果&#xff0c;就是容器中的内容缓慢地向下移动&#xff0c;直到底部停止&#xff0c;然后快速滚动回顶部&#xff0c;然后接着缓慢滚动到底部。并且在特定的情况下&#xff0c;还需要进行一些小交互&#xff0c;那就还得让…

RabbitMQ之生产批量发送

为什么要用生产批量发送&#xff1f; 批量发送消息&#xff0c;可以提高MQ发送性能。但是 RabbitMQ 并没有提供了批量发送消息的 API 接口,使用 spring-amqp 的 BatchingRabbitTemplate 实现批量能力。 SimpleBatchingStrategy 发送策略满足以下规则会进行发送&#xff1a; ba…

FreeRTOS低功耗模式(1-19)

低功耗模式简介(了解) 很多应用场合对于功耗的要求很严格&#xff0c;比如可穿戴低功耗产品、物联网低功耗产品等 一般MCU都有相应的低功耗模式,裸机开发时可以使用MCU的低功耗模式。 FreeRTOS也提供了一个叫Tickless的低功耗模式,方便带FreeRTOS操作系统的应用开发 stm32的低…

C#创建obj三维模型文件

介绍 使用开源库创建obj三维模型文件。 开源库地址&#xff1a;https://github.com/JeremyAnsel/JeremyAnsel.Media.WavefrontObj 相关API地址&#xff1a;https://jeremyansel.github.io/JeremyAnsel.Media.WavefrontObj/api/JeremyAnsel.Media.WavefrontObj.ObjFile.html …

docker desktop实战部署oracle篇

1、前言 oracle数据库官方已提供现成的镜像&#xff0c;可以直接拿来部署了。 由于项目中需要使用oracle数据库的分表功能&#xff0c;之前安装的是standard版本&#xff0c;无奈只能重新安装。网上查了一番&#xff0c;使用的方法都比较传统老旧&#xff1a;下载安装包手动安…

多线程局部存储技术

问题 多线程上下文中&#xff0c;每个线程需要使用一个专属的全局变量&#xff0c;该如何实现&#xff1f; 代码示例 一种可能的解决方案 test1.c #define _GNU_SOURCE /* To get pthread_getattr_np() declaration */ #define _XOPEN_SOURCE > 500 || _POSIX_C_SOURC…

谷歌上架,为什么会触发填表单,可以避免吗?怎么填表单可以提高通过率?

在谷歌上架过程中&#xff0c;相信大部分开发者都有收到过谷歌发来表单填写的邮件通知&#xff0c;要求开发者们在14天内根据表单要求回复关于应用部分情况。邮件如图&#xff1a; 根据触发填表单的开发者分享的经验来看&#xff0c;填完表之后出现的情况不尽相同&#xff0c;且…

【华为】路由综合实验(OSPF+BGP基础)

【华为】路由综合实验 实验需求拓扑配置AR1AR2AR3AR4AR5PC1PC2 查看通信OSPF邻居OSPF路由表 BGPBGP邻居BGP 路由表 配置文档 实验需求 ① 自行规划IP地址 ② 在区域1里面 启用OSPF ③ 在区域1和区域2 启用BGP&#xff0c;使AR4和AR3成为eBGP&#xff0c;AR4和AR5成为iBGP对等体…

【JVM】class文件格式,JVM加载class文件流程,JVM运行时内存区域,对象分配内存流程

这篇文章本来只是想讲一下class文件格式&#xff0c;讲着讲着越讲越多。JVM这一块吧&#xff0c;知识比较散比较多&#xff0c;如果深研究下去如死扣《深入理解Java虚拟机》&#xff0c;这本书很深很细&#xff0c;全记住是不可能的&#xff0c;其实也没必要。趁这个机会直接把…

RK3568平台(基础篇)linux错误码

一.概述 linux应用程序开发过程中&#xff0c;经常会遇到一些错误信息的返回&#xff0c;存在的可能性有&#xff0c;参数有误、非法访问、系统资源限制、设备/文件不存在、访问权限限制等等。对于这类错误&#xff0c;可以通过perror函数输出具体描述&#xff0c;或者通过str…

nacos-server-1.2.1启动

1、双击startup.cmd 2、启动日志 3、访问http://192.168.26.210:8848/nacos/index.html 4、登录 用户名&#xff1a;nacos 密码&#xff1a;nacos

掌握JavaScript面向对象编程核心密码:深入解析JavaScript面向对象机制对象概念、原型模式与继承策略全面指南,高效创建高质量、可维护代码

ECMAScript&#xff08;简称ES&#xff0c;是JavaScript的标准规范&#xff09;支持面向对象编程&#xff0c;通过构造函数模拟类&#xff0c;原型链实现继承&#xff0c;以及ES6引入的class语法糖简化面向对象开发。对象可通过构造函数创建&#xff0c;使用原型链共享方法和属…

【云原生】Docker 的网络通信

Docker 的网络通信 1.Docker 容器网络通信的基本原理1.1 查看 Docker 容器网络1.2 宿主机与 Docker 容器建立网络通信的过程 2.使用命令查看 Docker 的网络配置信息3.Docker 的 4 种网络通信模式3.1 bridge 模式3.2 host 模式3.3 container 模式3.4 none 模式 4.容器间的通信4.…

小白如何搭建git

1、安装git 在Windows上安装git&#xff1a; 关注微信公众号“机器人学”回复 “搭建git” 利用百度云网盘下载安装包&#xff0c;建议下载如下版本的否则可能会出现错误。 安装完成后&#xff0c;在开始菜单里Git->git bash&#xff0c;弹出命令窗说明git安装成功。 鼠标右…

【Python项目】基于DJANGO的【基于语音识别的智能垃圾分类系统】

技术简介&#xff1a;使用Python技术、DJANGO框架、MYSQL数据库等实现。 系统简介&#xff1a;用户们可以在系统上面录入自己的个人信息&#xff0c;录入后还可以对信息进行修改&#xff0c;网站可以对用户上传的音频文件进行识别&#xff0c;然后进行垃圾分类。 背景&#xf…

【学习AI-相关路程-工具使用-自我学习-NVIDIA-cuda-工具安装 (1)】

【学习AI-相关路程-工具使用-自我学习-NVIDIA-cuda &#xff08;1&#xff09;】 1、前言2、环境配置1、对于jetson orin nx 的cuda环境2、对于Ubuntu 20.04下cuda环境 3、自我总结-安装流程1、在ubuntu下&#xff0c;如果想使用cuda平台&#xff0c;应该注意什么 和 都安装什么…

BGE向量模型架构和训练细节

模型论文&#xff1a;https://arxiv.org/pdf/2309.07597 模型数据&#xff1a;https://data.baai.ac.cn/details/BAAI-MTP 训练数据 由无标签数据和有标签数据组成。 无标签数据使用了悟道等数据集&#xff0c;有标签数据使用了dureader等数据集。 都是文本对&#xff0c;对于…

rust使用Atomic创建全局变量和使用

Mutex用起来简单&#xff0c;但是无法并发读&#xff0c;RwLock可以并发读&#xff0c;但是使用场景较为受限且性能不够&#xff0c;那么有没有一种全能性选手呢&#xff1f; 欢迎我们的Atomic闪亮登场。 从 Rust1.34 版本后&#xff0c;就正式支持原子类型。原子指的是一系列…