深入探究:Java SE中的数组高级用法

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在Java开发中,数组是开发者经常使用的一种数据结构。我们都知道数组可以存储同一类型的多个元素,但是Java中数组的高级用法却不为人所熟知。本文将深入探究Java SE中数组的高级用法,包括数组的创建、初始化方式、多维数组、枚举类型等。

摘要

  本文将从源代码解析、应用场景案例、优缺点分析、类代码方法介绍、测试用例等方面深入探究Java SE中数组的高级用法。我们会通过各种案例让大家更好地理解数组的高级用法,同时分析其优缺点,以供读者在实际开发中做出更好的选择。

正文

简介

数组的创建

Java中数组的创建非常简单,可以通过以下两种方式:

  • 使用数组的静态初始化
  • 使用数组的动态初始化

静态初始化数组的方式如下:

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

动态初始化数组的方式如下:

int[] nums = new int[5];

多维数组

  Java中的多维数组就是由一维数组嵌套而成的。如下是一个二维数组的创建方式:

int[][] nums = {{1, 2}, {3, 4}};

同样,我们也可以使用动态初始化的方式创建一个二维数组:

int[][] nums = new int[2][2];

枚举类型

枚举类型在Java中的定义方式如下:

enum Color {RED, GREEN, BLUE;
}

创建枚举类型的方式如下:

Color red = Color.RED;

源代码解析

1. 数组的静态初始化

在Java中,我们可以使用静态初始化的方式来创建数组。静态数组的初始化就是在定义和创建数组的同时赋初始值。如下是一个例子:

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

这种方式是最常用的一种方式,也是最简单的一种方式。我们可以在一行代码中完成数组的定义和初始化。

2. 数组的动态初始化

除了静态数组之外,Java中还有一种动态数组。动态数组需要由开发者自己给定数组的长度,并且需要使用new关键字去创建数组。如下是一个例子:

int[] nums = new int[5];

这种方式需要开发者自己定义数组的长度,但是不需要为数组赋初值。我们也可以再后面的代码中再对数组进行初始化。

3. 多维数组

Java中的多维数组可以看作是一维数组在另一个一维数组中的嵌套,所以我们可以通过一维数组来创建和初始化多维数组。如下是一个二维数组的创建方式:

int[][] nums = {{1, 2}, {3, 4}};

这个二维数组由两个一维数组嵌套而成。我们也可以使用动态初始化的方式创建一个二维数组:

int[][] nums = new int[2][2];

4. 枚举类型

Java中使用枚举类型时需要先定义一个枚举类型。枚举类型的定义方式如下:

enum Color {RED, GREEN, BLUE;
}

这个定义了一个颜色的枚举类型,其中包括三个不同的值:RED、GREEN和BLUE。开发者可以通过以下方式来创建枚举类型的变量:

Color red = Color.RED;

应用场景案例

1. 数组的静态初始化

静态初始化数组的方式可以用在程序中需要使用固定的数据结构的情况下,比如一些常量或者配置数据。例如:

private static final String[] URLS = {"https://www.baidu.com/","https://www.google.com/","https://github.com/"
};

这个代码定义了一个包含三个元素的字符串数组URLS,其中包括百度、谷歌和GitHub的URL。

代码分析:

  这是一个 Java 类中的一个字符串数组,命名为 URLS,其中包含了三个不同的 URL 字符串。这些字符串表示三个不同的网站,分别为百度、谷歌和 GitHub 的主页。

  其中 private static final 表示这个数组是一个私有的、静态的和不可变的成员变量,也就是说,在这个类中,这个数组只能被访问和修改一次,并且不能被外部的类所修改。

  这个数组可以在其他方法内使用,例如可以用于网络请求或者测试。

2. 数组的动态初始化

动态初始化数组的方式可以用在程序中需要对数组进行扩容的情况下。例如:

public void add(String element) {if (size >= capacity) {// 扩容数组T[] tmp = (T[]) new Object[capacity * 2];System.arraycopy(elements, 0, tmp, 0, size);elements = tmp;capacity *= 2;}elements[size++] = element;
}

这个代码是一个动态数组的实现,其中当数组已经满了时,会对数组进行扩容。

代码分析:

  这是一个泛型方法,其目的是将给定的元素添加到数组中。如果当前数组已满,则会自动扩容数组,使其容量翻倍。

  具体来说,如果数组中当前元素个数size已经达到了数组容量capacity的上限,就会执行扩容操作。扩容操作的实现方式是创建一个新的数组tmp,其容量是原数组的两倍。然后使用System.arraycopy()方法将原数组中的元素复制到新数组中。最后,将原数组的引用指向新数组,并将容量capacity更新为新数组的容量。最后,将新元素添加到数组的尾部,并将size自增1。

  需要注意的是,由于Java中的泛型不支持直接创建泛型数组,所以这里使用了类型转换的方式来创建新数组。具体来说,先创建一个Object数组,然后再将其转换成泛型类型T的数组。这样有一个缺点就是会出现未经检查的警告,因为编译器无法确保转换后的数组类型与泛型类型T相同。

3. 多维数组

多维数组可以用在程序中需要处理矩阵和图像数据的情况下。例如:

int[][] matrix = new int[3][3];
matrix[0][0] = 1;
matrix[0][1] = 2;
matrix[0][2] = 3;
matrix[1][0] = 4;
matrix[1][1] = 5;
matrix[1][2] = 6;
matrix[2][0] = 7;
matrix[2][1] = 8;
matrix[2][2] = 9;

这个代码创建了一个3x3的矩阵,并且赋值。

代码分析:

  这段代码创建了一个3x3的二维整型数组matrix,并且给数组中的每个元素赋值。可以将这个数组看作一个矩阵,其中第一行的元素为1、2、3,第二行的元素为4、5、6,第三行的元素为7、8、9。可以通过访问matrix[i][j]来获取第i行第j列的元素值。

4. 枚举类型

枚举类型可以用在程序中需要限定某个值在一定范围内的情况下。例如:

public enum Gender {MALE, FEMALE;
}public class User {private String name;private Gender gender;public User(String name, Gender gender) {this.name = name;this.gender = gender;}
}

这个代码使用枚举类型限定了用户的性别只能为MALE或者FEMALE。

代码分析:

  这段代码定义了一个枚举类型 Gender,包括 MALEFEMALE 两个取值。它还定义了一个 User 类,包含了用户的名字和性别。User 类有一个构造函数,需要传入用户名和性别。

  这个代码模型也可以通过增加其他的属性和方法来进一步完善,例如通过添加用户年龄、地址等属性,或者增加方法来获取和设置这些属性。

优缺点分析

1. 数组的静态初始化

静态初始化数组的方式可以显著提高程序的可读性和可维护性,因为开发者可以在定义和初始化数组的同时完成这个任务。但是,这种方式只能用于固定的数据结构,而且当静态数组需要改变时,开发者就需要修改代码中的赋值。

2. 数组的动态初始化

动态初始化数组的方式可以在程序中对数组进行动态扩容,有助于提升程序的扩展性。但是,这种方式需要对数组进行重复的内存分配和复制,会增加程序的开销,也容易出现内存溢出等问题。

3. 多维数组

多维数组可以用于矩阵和图像数据的处理,但是数组嵌套过多会导致程序的可读性降低,也容易出现数组访问越界等问题。

4. 枚举类型

枚举类型可以限定某个值在一定范围内,提高程序的可读性和安全性。但是,枚举类型不能继承,也不支持多态,不够灵活。

类代码方法介绍

1. 数组的静态初始化

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

  这个代码使用静态初始化的方式创建了一个包含五个元素的整型数组nums,并且赋了初值。

2. 数组的动态初始化

int[] nums = new int[5];

  这个代码使用动态初始化的方式创建了一个包含五个元素的整型数组nums,并且没有对其进行赋初值。需要注意的是,动态数组需要开发者自己定义数组的长度。

3. 多维数组

int[][] nums = {{1, 2}, {3, 4}};

  这个代码创建了一个二维数组nums,其中包括两个一维数组,每个一维数组包括两个元素。

int[][] nums = new int[2][2];

  这个代码使用动态初始化的方式创建了一个二维数组nums,其中包括两个一维数组,每个一维数组包括两个元素。

4. 枚举类型

enum Color {RED, GREEN, BLUE;
}

这个代码定义了一个颜色的枚举类型Color,其中包括三个不同的值:RED、GREEN和BLUE。

Color red = Color.RED;

这个代码创建了一个颜色类型的变量red,其值为枚举类型Color中的RED。

小结

  本文介绍了Java SE中数组的高级用法,包括数组的创建、初始化方式、多维数组、枚举类型等。通过各种案例让读者更好地理解数组的高级用法,并分析其优缺点,以供读者在实际开发中做出更好的选择。数组具有简单易用、高效灵活等特点,是Java开发中常用的数据结构之一。学会数组的高级用法,对于提高Java开发效率和编写高质量代码都有帮助。

总结

  本文深入探究了Java SE中数组的高级用法,包括数组的创建、初始化方式、多维数组、枚举类型等。其中,静态初始化数组的方式可以提高程序的可读性和可维护性,但只适用于固定的数据结构;动态初始化数组的方式可以在程序中对数组进行动态扩容,但会增加程序的开销;多维数组可以用于矩阵和图像数据的处理,但需要注意数组嵌套过多会降低程序的可读性;枚举类型可以限定某个值在一定范围内,提高程序的可读性和安全性,但不够灵活。本文通过实例和优缺点分析,让读者更深入地了解数组的高级用法,在实际开发中做出更好的选择。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rewrite the Stars

文章目录 摘要1、引言2、相关工作3、重写星操作3.1、单层中的星操作3.2、扩展到多层3.3、特殊情况3.4、实证研究3.4.1、星操作的实证优越性3.4.2、决策边界对比3.4.3、扩展到无激活函数的网络 3.5、开放讨论与更广泛的影响 4、概念验证:StarNet4.1、StarNet架构4.2、…

《Windows API每日一练》4.4 绘制填充区域

本节讲述如何填充由线条构建的封闭区域。当我们初始化一个窗口类时,往往已经指定了窗口的背景色画刷(WHITE_BRUSH),即默认的填充封闭区域背景的画刷。如果我们想更换背景颜色,需要选入其他系统预定义的画刷&#xff08…

Serializable 序列化详解

文章目录 一、什么是序列化二、Serializable 简介三、Serializable 序列化测试四、serialVersionUID 的作用五、serialVersionUID 默认 1L 和 64 位的哈希字段有什么区别?六、static 和 transient 字段 一、什么是序列化 序列化就是将对象属性转变为二进制数据。用…

LLVM 中 的 pass 及其管理机制

概述 LLVM 编译器框架的核心概念是任务调用和执行 编译器开发者将IR分解为不同的处理对象,并将其处理过程实现为单独的pass类型。在编译器初始化,pass被实例化,并被添加到pass管理中 pass 管理器(pass manager) 以流水线的方式将各个独立的…

DOM 总结

DOM 总结 1. 引言 文档对象模型(DOM,Document Object Model)是一种跨平台和语言独立的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。DOM 是万维网联盟(W3C)的标准,被广泛应用于网页设计和开发中。本文将总结 DOM 的基本概念、核心功能和实际应用。 …

【安装笔记-20240616-Linux-为 OpenWrt 自动挂载 Windows 主机共享目录】

安装笔记-系列文章目录 安装笔记-20240616-Linux-为 OpenWrt 自动挂载 Windows 主机共享目录 文章目录 安装笔记-系列文章目录安装笔记-20240616-Linux-为 OpenWrt 自动挂载 Windows 主机共享目录 前言一、软件介绍名称:cifsutils主页官方介绍特点 二、安装步骤测试…

华为校招机试 - 排列组合的回文字符串(20230515)

题目描述 如果一个字符串和它反转后的字符串相同,我们称这个字符串为回文字符串。 如:"aba"是一个回文字符串,"abb"不是一个回文字符串(长度为 1 的字符串也是回文字符串)。 要给定一个字符串,其长度范围为:[1, 1000),返回其通过重新排列组合后…

exit和_exit函数和atexit函数

相对于return函数,exit和_exit是用于专门退出进程的函数,而return不是用于专门退出进程的,只是执行mian函数时,return可以退出进程。(return退出当前函数执行的栈空间,并返回当前函数执行的结果&#xff09…

基于JSP技术的个人网站系统

开头语: 你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:Java 数据库:MySQL 技术:JSP JavaBeans Servlet 工具:Eclipse、MySQL Workbench、…

.net8 blazor auto模式很爽(五)读取sqlite并显示(2)

在BlazorApp1增加文件夹data&#xff0c;里面增加类dbcont using SharedLibrary.Models; using System.Collections.Generic; using Microsoft.EntityFrameworkCore;namespace BlazorApp1.data {public class dbcont : DbContext{public dbcont(DbContextOptions<dbcont>…

Java高频面试题整理(几万字)

&#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我不迷路 ❤️《java面试核心知识》突击系列&#xff0c;持续更新… &#x1f490; 面试必知必会学习路线&#xff1a;Java技术栈面试系列SpringCloud项目实战学习路线 &#x1f4dd;再小的收获x365天…

卷积网络热图显示

【卷积神经网络可视化】之热度图可视化_visualizing heatmaps of class activation in an ima-CSDN博客

Java中的Stream API及其应用

Java中的Stream API及其应用 Java 8引入了Stream API,这是对集合进行复杂操作的强大工具。Stream API支持函数式编程风格,能够简洁、清晰地处理集合数据。本文将详细介绍Java中的Stream API及其实际应用场景。 一、Stream API简介 Stream是元素的序列,这些元素支持顺序和…

ctfshow-web入门-命令执行(web43-web52)关于黑洞“ >/dev/null 2>1“的处理与绕过

目录 1、web43 2、web44 3、web45 4、web46 5、web47 6、web48 7、web49 8、web50 9、web51 10、web52 1、web43 在上一题 ‘黑洞’ 的基础上新增过滤&#xff1a; preg_match("/\;|cat/i", $c) 问题不大&#xff0c;我们不用分号和 cat 就行&#xff1a;…

YoloV8改进策略:卷积篇|Kan行天下之GRAM,KAN遇见Gram多项式

GRAM的灵感来自于Kolmogorov-Arnold网络&#xff08;KAN&#xff09;的替代品&#xff0c;如TorchKAN和ChebyKAN。GRAM引入了一种KAN模型的简化版本&#xff0c;但利用了Gram多项式变换的简洁性。它与其他替代品的不同之处在于其独特的离散性特征。与其他在连续区间上定义的多项…

串口触摸屏的键盘控制

&#xff08;text 属性txt_maxl 800&#xff09; ①变量loadpageid.val&#xff1a;调用页的页面ID。 ②变量loadcmpid.val&#xff1a;调用页的控件ID。 ③定时器tm0&#xff1a;让输入框有个光标不断闪烁&#xff0c;如果不需要&#xff0c;控件属性en0即可。 ④变量inputlen…

Redis Cluster 为什么不支持传统的事务模型

Redis Cluster 采用了分布式的架构&#xff0c;其设计目标主要是为了提供高可用性和可伸缩性。Redis Cluster 的数据分片存储在不同的节点上&#xff0c;每个节点负责一部分数据。传统的 Redis 单节点事务是通过 MULTI/EXEC 命令实现的&#xff0c;但 Redis Cluster 不支持跨节…

【python操作Excel的方法】

当然&#xff0c;除了openpyxl和pandas之外&#xff0c;还有其他几种方法可以用来操作Excel文件。以下是一些常见的操作Excel的方法&#xff0c;并附带了相关的数字和信息&#xff08;基于提供的参考文章&#xff09;&#xff1a; 1. 使用Excel本身的宏和VBA 优势&#xff1a…

centos意外断电的情况下linux挂载磁盘报错(已解决)

问题描述 centos意外断电的情况下linux挂载磁盘报错&#xff0c;这大致是意外断电硬盘相关meta信息还未落盘之类的导致磁盘信息对不上 通过命令 kubectl describe pod minio-5b9765594b-g4bwt得到错误信息 Warning FailedMount 47m (x5 over 47m) kubelet MountVolume.Mount…

切片(slicing)(Python)

文章目录 前言一、基本语法二、基本操作1、字符串2、列表 前言 切片&#xff08;Slicing&#xff09;是Python中对于序列类型&#xff08;如字符串、列表、字节、元组等&#xff09;的一种操作&#xff0c;用于获取序列的子部分。 一、基本语法 sequence[start:stop:step]参数…