数据结构第04节:数组

线性数据结构 - 数组

线性数据结构中的数组是一种基础且广泛使用的数据存储方式,它存储一系列相同类型的元素,这些元素在内存中连续存放。数组可以是静态的或动态的。

静态数组(Static Arrays)

静态数组在声明时需要指定大小,并且一旦声明,其大小就不能改变。

Demo1

想象一下超市里的货架,每个货架上都有一定数量的格子,每个格子可以放置一个商品。如果货架已经放满了,你就不能在这个货架上再添加更多的商品了,除非你更换一个更大的货架,这类似于Java中的静态数组。

Java源代码
public class StaticArrayExample {public static void main(String[] args) {// 声明并初始化一个静态数组int[] scores = {85, 92, 76, 88, 91};// 访问数组元素System.out.println("Score at index 2: " + scores[2]); // 输出 76// 尝试修改数组大小// scores = new int[10]; // 这将创建一个新的数组,但原始数组仍然保持不变// 打印数组中的所有元素for (int score : scores) {System.out.print(score + " ");}}
}
动态数组(Dynamic Arrays)

动态数组是一种可以自动调整大小的数组。在Java中,ArrayList是动态数组的一个实现。

Demo2

考虑一个不断增长的图书馆书架,随着新书的添加,书架可能需要扩展。这就像Java中的动态数组,随着元素的添加,数组会自动增加容量。

Java源代码
import java.util.ArrayList;public class DynamicArrayExample {public static void main(String[] args) {// 创建一个动态数组(ArrayList)ArrayList<String> books = new ArrayList<>();// 向动态数组添加元素books.add("1984");books.add("Brave New World");books.add("Fahrenheit 451");// 访问数组元素System.out.println("Book at index 1: " + books.get(1)); // 输出 Brave New World// 动态数组可以自动调整大小books.add("To Kill a Mockingbird");// 打印数组中的所有元素for (String book : books) {System.out.print(book + " ");}}
}

数组的优势和局限

  • 优势

    • 直接通过索引访问元素,访问速度快。
    • 内存空间连续,利于缓存优化。
  • 局限

    • 静态数组大小固定,不能动态扩展。
    • 动态数组虽然可以动态扩展,但每次扩展都需要创建新的数组并复制旧元素,这可能导致性能开销。

数组是许多其他数据结构的基础,如字符串、矩阵等。在实际编程中,根据需求选择使用静态数组还是动态数组是非常重要的。例如,如果你知道数据的确切大小,使用静态数组可能更合适;如果你需要一个可以动态增长的数据集合,使用动态数组(如Java中的ArrayList)可能更合适。

接下来,我们可以进一步讨论数组的更多特性和操作,包括数组的初始化、遍历、搜索、排序和多维数组的使用。

数组的初始化

在Java中,数组可以在声明时初始化,也可以先声明后初始化。

// 在声明时初始化数组
int[] staticArray = new int[] {1, 2, 3, 4, 5};// 先声明后初始化
int[] anotherStaticArray;
anotherStaticArray = new int[5]; // 初始化数组大小,但未设置具体值

数组的遍历

遍历数组是访问数组中每个元素的基本操作。

int[] numbers = {1, 2, 3, 4, 5};
for (int i = 0; i < numbers.length; i++) {System.out.println(numbers[i]);
}

数组的搜索

在数组中搜索特定元素是常见的操作,可以通过遍历数组来实现。

boolean contains = false;
for (int num : numbers) {if (num == 3) {contains = true;break;}
}
System.out.println("Contains 3: " + contains);

数组的排序

Java提供了多种排序算法,如Arrays.sort(),可以对数组进行排序。

import java.util.Arrays;int[] numbersToSort = {5, 3, 8, 1, 2};
Arrays.sort(numbersToSort);
System.out.println("Sorted array: " + Arrays.toString(numbersToSort));

多维数组

Java支持多维数组,最常见的是二维数组,类似于矩阵。

// 声明并初始化二维数组
int[][] matrix = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
};// 访问二维数组的元素
System.out.println("Element at [1][2]: " + matrix[1][2]); // 输出 6// 遍历二维数组
for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length; j++) {System.out.print(matrix[i][j] + " ");}System.out.println();
}

数组的复制

Java提供了System.arraycopy()方法来复制数组。

int[] original = {1, 2, 3, 4, 5};
int[] copy = new int[original.length];
System.arraycopy(original, 0, copy, 0, original.length);// 验证复制
System.out.println("Original array: " + Arrays.toString(original));
System.out.println("Copied array: " + Arrays.toString(copy));

数组的内存视图

Java的数组是对象,可以通过equals()方法比较数组的内容,但通常使用Arrays.equals()来比较数组是否相等。

int[] array1 = {1, 2, 3};
int[] array2 = {1, 2, 3};
boolean areEqual = Arrays.equals(array1, array2); // true
System.out.println("Are the arrays equal? " + areEqual);

数组是Java中非常重要的数据结构,它们提供了快速访问元素的能力,但同时也需要注意它们的局限性,如固定大小和内存连续性。通过上述代码示例,我们可以看到如何在Java中操作数组,包括初始化、遍历、搜索、排序、复制和比较。这些操作是处理数组时的基础,也是理解更复杂数据结构的基础。

让我们通过Java代码来进一步探讨数组的使用,包括数组的逆序、数组的旋转以及数组的动态扩展。

数组的逆序

逆序数组是一个常见的任务,可以通过循环来实现。

public void reverseArray(int[] array) {int temp;for (int i = 0; i < array.length / 2; i++) {temp = array[i];array[i] = array[array.length - 1 - i];array[array.length - 1 - i] = temp;}
}

使用示例

int[] myArray = {1, 2, 3, 4, 5};
reverseArray(myArray);
System.out.println("Reversed array: " + Arrays.toString(myArray));

数组的旋转

数组的旋转是将数组的元素向右或向左移动指定的步数。

public void rotateArray(int[] array, int steps) {reverseArray(array, 0, array.length - 1);reverseArray(array, 0, steps - 1);reverseArray(array, steps, array.length - 1);
}private void reverseArray(int[] array, int start, int end) {while (start < end) {int temp = array[start];array[start] = array[end];array[end] = temp;start++;end--;}
}

使用示例

int[] myRotatedArray = {1, 2, 3, 4, 5, 6, 7};
rotateArray(myRotatedArray, 3);
System.out.println("Rotated array: " + Arrays.toString(myRotatedArray));

数组的动态扩展

虽然Java的数组本身不支持动态扩展,但我们可以通过创建一个新的数组并将旧数组的内容复制到新数组中来实现。

public int[] expandArray(int[] original, int newSize) {int[] expanded = new int[newSize];for (int i = 0; i < original.length && i < newSize; i++) {expanded[i] = original[i];}return expanded;
}

使用示例

int[] originalArray = {1, 2, 3};
int[] expandedArray = expandArray(originalArray, 5);
System.out.println("Expanded array: " + Arrays.toString(expandedArray));

寻找数组中的最值

在数组中查找最大或最小元素是另一个常见的任务。

public int findMax(int[] array) {int max = array[0];for (int i = 1; i < array.length; i++) {if (array[i] > max) {max = array[i];}}return max;
}public int findMin(int[] array) {int min = array[0];for (int i = 1; i < array.length; i++) {if (array[i] < min) {min = array[i];}}return min;
}

使用示例

int[] numbers = {10, 20, 5, 40, 15};
System.out.println("Max value: " + findMax(numbers));
System.out.println("Min value: " + findMin(numbers));

通过这些示例,我们可以看到数组在Java中的多种操作方式,包括逆序、旋转、动态扩展和查找最值。这些操作不仅展示了数组的灵活性,也体现了Java语言在处理数组方面的功能。在实际应用中,根据具体需求选择合适的数组操作是非常重要的。

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

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

相关文章

如何度量信息的大小

信息这个词让我们感到熟悉而又陌生。熟悉是因为我们所处在一个信息时代&#xff0c;与生活密切相关的就有大量的各种信息&#xff0c;比如书籍、手机、电脑等。而陌生是因为很难精确说明信息是什么并且如何量化信息&#xff0c;比如“地球是圆的”一句话包含了多少信息呢&#…

Java:多态

文章目录 一、概念二、使用前提三、实例四、优缺点4.1 优点4.2 缺点 五、动态绑定和静态绑定5.1 动态绑定5.2 静态绑定 一、概念 多态是指类的多种形态&#xff0c;同一个接口&#xff0c;使用不同的实例而执行不同操作。 二、使用前提 有继承/实现关系有父类引用指向子类对象…

centos7部署mysql8.0

1.安装MySQL的话会和MariaDB的文件冲突&#xff0c;所以需要先卸载掉MariaDB。查看是否安装mariadb rpm -qa | grep mariadb 2. 卸载mariadb rpm -e --nodeps 查看到的文件名 3.下载MySQL安装包 MySQL官网下载地址: MySQL :: Download MySQL Community Serverhttps://dev.mys…

19.JWT

1►JWT博客推荐 阮老师讲得很好了&#xff0c;网址如下&#xff1a; http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html 2►ry是怎么践行JWT的呢&#xff1f; 问题一&#xff1a;不登录的时候有token吗&#xff1f; 答&#xff1a;没有&#xff0c;所…

[概念]探索AI与AIGC:从定义到应用场景

一、什么是人工智能&#xff08;AI&#xff09;&#xff1f; 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;正成为科技革命和产业变革的核心推动力。AI是研究、开发用于模拟、延伸和扩展人类智能的理论、方法、技术及应用系统的新兴技术科学&#xf…

Uniapp的简要开发流程指南

Uniapp开发指南 简介 Uniapp 是由DCloud推出的一款基于Vue.js的多端开发框架&#xff0c;支持编译到iOS、Android、H5、以及各大小程序平台&#xff08;如微信小程序、支付宝小程序、百度小程序等&#xff09;。它使开发者可以通过一次编码&#xff0c;实现跨平台的应用发布&…

blender 纹理绘制-贴花方式

贴画绘制-1分钟blender_哔哩哔哩_bilibili小鸡老师的【Blender风格化角色入门教程】偏重雕刻建模https://www.cctalk.com/m/group/90420100小鸡老师最新的【风格化角色全流程进阶教程】偏重绑定。早鸟价进行中&#xff01;欢迎试听https://www.cctalk.com/m/group/90698829, 视…

[C++][CMake][嵌套的CMake]详细讲解

目录 0.前言 & 准备1.节点关系2.添加子目录3.解决问题1.根目录2.calc目录3.sort目录4.calc_test目录5.sort_test 4.注意 0.前言 & 准备 如果项目很大&#xff0c;或者项目中有很多的源码目录&#xff0c;在通过CMake管理项目的时候如果只使用一个CMakeLists.txt&#…

Splunk Enterprise 中的严重漏洞允许远程执行代码

Splunk 是搜索、监控和分析机器生成大数据的软件领先提供商&#xff0c;为其旗舰产品 Splunk Enterprise 发布了紧急安全更新。 这些更新解决了几个构成重大安全风险的关键漏洞&#xff0c;包括远程代码执行 (RCE) 的可能性。 受影响的版本包括 * 9.0.x、9.1.x 和 9.2.x&…

ARM架构和Intel x86架构

文章目录 1. 处理器架构 2. ARM架构 3. Intel x86架构 4. 架构对比 1. 处理器架构 处理器架构是指计算机处理器的设计和组织方式&#xff0c;它决定了处理器的性能、功耗和功能特性。处理器架构影响着从计算机系统的硬件设计到软件开发的各个方面。在现代计算技术中&#…

论如何搭建属于自己的服务器?

在现如今的数字化时代中&#xff0c;为了能够搭建网站和运行应用程序&#xff0c;很多人选择搭建属于自己的服务器&#xff0c;下面我们就来了解一下如何搭建服务器吧&#xff01; 搭建服务器我们首先需要选择适合自身需求的硬件设备&#xff0c;其中包含内存、CPU和存储等配置…

计算机组成原理学习笔记(一)

计算机组成原理 [类型:: [[计算机基础课程]] ] [来源:: [[B站]] ] [主讲人:: [[咸鱼学长]] ] [评价:: ] [知识点:: [[系统软件]] & [[应用软件]] ] [简单解释:: 管理计算机系统的软件&#xff1b; 按照任务需要编写的程序 ] [问题:: ] [知识点:: [[机器字长]] ] [简单…

广告联盟小游戏app开发搭建看广告收益项目

以下是关于广告联盟小游戏 APP 开发搭建看广告收益项目的一般步骤和要点&#xff1a; 项目规划 明确游戏的类型、玩法和目标受众。确定通过广告获取收益的模式和策略。 技术选型 选择适合的开发框架和技术栈&#xff0c;如移动开发框架&#xff08;如 React Native、Flutter 等…

第6篇 共识机制深度解析:PoW、PoS、DPoS和PBFT

在区块链的世界里,有一个非常重要的概念叫做“共识机制”。它就像是区块链的心脏,保证大家在这条链上的信息是可靠的、不可篡改的。今天,我们就来通俗易懂地聊聊区块链里的四大共识机制:工作量证明(PoW)、权益证明(PoS)、委托权益证明(DPoS)和拜占庭容错(PBFT)。为…

绝区壹--LLM的构建模块

前言 语言是人类交流的本质&#xff0c;大型语言模型 (LLM) 凭借其出色的理解和生成类似人类的文本的能力&#xff0c;彻底改变了我们与语言互动和利用语言的方式。深入研究 LLM 的构建块&#xff08;向量、标记和嵌入&#xff09;&#xff0c;揭示了使这些模型能够以前所未有…

辣子简报芬芳喜事特辑

【辣子简报芬芳喜事特辑】&#x1f389;在这个季节的尾声&#xff0c;当一缕阳光温柔地洒在打包好的行囊上&#xff0c;我们不约而同地停下了忙碌的脚步&#xff0c;回望那段共同编织的璀璨时光——79天的并肩作战&#xff0c;如同一段精彩绝伦的旅程&#xff0c;如今已缓缓驶向…

3D地图是智慧城市可视化项目绕不开的技术!来我帮你解决

**3D地图&#xff1a;智慧城市可视化项目绕不开的技术&#xff01;来我帮你解决** 智慧城市已成为未来城市发展的必然趋势。而3D地图作为智慧城市可视化项目的核心技术之一&#xff0c;其重要性不言而喻。本文将深入探讨3D地图在智慧城市建设中的应用及其优势&#xff0c;为您…

Android - SIP 协议

SIP 代表(会话发起协议)。 它是一种协议&#xff0c;可让应用程序轻松设置呼出和呼入语音呼叫&#xff0c;而无需直接管理会话、传输级通信或音频记录或回放。 SIP 应用程序 SIP 的一些常见应用是。 视频会议即时消息 开发要求 以下是开发 SIP 应用程序的要求 − Android 操作系…

2-5 softmax 回归的简洁实现

我们发现通过深度学习框架的高级API能够使实现线性回归变得更加容易。 同样&#xff0c;通过深度学习框架的高级API也能更方便地实现softmax回归模型。 本节如在上节中一样&#xff0c; 继续使用Fashion-MNIST数据集&#xff0c;并保持批量大小为256。 import torch from torc…

黑马的ES课程中的不足

在我自己做项目使用ES的时候&#xff0c;发现了黑马没教的方法&#xff0c;以及一些它项目的小问题 搜索时的匹配方法 这个boolQuery().should 我的项目是通过文章的标题title和内容content来进行搜索 但是黑马它的项目只用了must 如果我们的title和content都用must&#x…