【Java数据结构】—— 一维数组

一维数组

在计算机语言中数组是非常重要的集合类型,大部分计算机语言中数组具有如下三个基本特性:

  1. 一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。
  2. 有序性:数组中的元素是有序的,通过下标访问。
  3. 不可变性:数组一旦初始化,则长度(数组中元素的个数)不可变。

Java 中数组的下标是从零开始的,很多计算机语言的数组下标从零开始的。

当数组中每个元素都只带有一个下标时,这种 数组 就是“ 一维数组 。 数组是引用数据类型,引用数据类型在使用之前一定要做两件事情:声明和初始化。

声明与初始化

声明数组

要声明一个数组,你需要指定数组的类型,然后在类型后面加上方括号[],最后是数组的名称。

int[] numbers; // 声明一个整型数组
String[] names; // 声明一个字符串数组
初始化数组

数组在创建后需要被初始化才能使用。使用花括号进行初始化。初始化可以包括分配内存并为数组元素赋予初始值。

  • 静态初始化:直接在声明时为数组元素赋值。
int[] numbers = {1, 2, 3, 4, 5};
String[] names = {"Alice", "Bob", "Charlie"};
  • 动态初始化:只指定数组长度,由系统默认初始化(例如,数字默认为0,对象引用默认为null),之后可以单独为每个元素赋值。

    注意:数组的长度是固定的,一旦创建,不能更改。

int[] numbers = new int[5]; // 创建一个长度为5的整型数组
numbers[0] = 1; // 分别赋值

读取和修改数组元素

通过下标索引来访问数组中的元素,切记索引从0开始。

System.out.println(names[0]); // 输出 "Alice"
names[0] = "Ali"   //修改下标为0的元素的内容

查询数组内容

假如我们对数组中包含哪些元素并不了解,只是想知道其中是否含有元素"Alice",应该如何查找这个元素呢?

与读取元素类似,只需从数组开头逐步向后查找就可以了。如果数组中的某个元素为目标元素,则停止查找;否则继续搜索直到到达数组的末尾。

for (int i = 0; i < array.length; i++) {if (array[i] == "Alice"){System.out.println(i);}
}

插入元素

在Java中,由于数组的长度是固定的,直接在数组中间插入数据会导致后续元素的索引发生变化,这在编译时是不允许的,同样也是不建议的,但你可以通过以下几种方式间接实现数组中的插入操作:

1. 创建新数组并复制

最常见的方式是创建一个新的、长度更大的数组,然后将原数组中的数据复制过去,再在指定位置插入新数据。示例代码如下:

public static int[] insertIntoArray(int[] original, int index, int element) {// 创建一个新数组,长度为原数组长度加1int[] newArray = new int[original.length + 1];// 将原数组中的元素复制到新数组中,直到插入位置System.arraycopy(original, 0, newArray, 0, index);// 在指定位置插入新元素newArray[index] = element;// 把原数组剩余的部分复制到新数组System.arraycopy(original, index, newArray, index + 1, original.length - index);return newArray;
}
2. 手动管理数据移动

如果你确实需要直接操作原数组,并且知道插入不会超出数组容量限制,也可以手动调整数组元素的位置,但这通常较为繁琐且容易出错。

注意
  • 上述示例展示了如何在数组的某个位置插入数据,但请记住,每次插入操作都可能需要创建一个新的数组,因此如果频繁插入,可能会导致性能问题。

我们发现,如果需要频繁地对数组元素进行插入操作,不仅操作繁琐,且会造成时间的浪费。事实上,另一种数据结构,即链表可以有效解决这个问题,我将在后续的文章中为你介绍。

删除数组元素和插入元素同理,都是不建议进行的操作。

数组长度

使用.length属性获取数组的长度。

System.out.println(numbers.length); // 输出 5

数组遍历

可以使用for循环或者增强型for循环(foreach)遍历数组。

// 使用传统for循环
for(int i = 0; i < numbers.length; i++) {System.out.println(numbers[i]);
}// 使用增强型for循环
for(String name : names) {System.out.println(name);
}

注意事项

  • 访问不存在的索引(如负数或超过数组长度)会导致ArrayIndexOutOfBoundsException异常。
  • 数组是Java中最基本的数据结构之一,但功能有限,对于更复杂的操作,通常推荐使用集合框架(如ArrayList, LinkedList等)。

算法题目练习

题目来自力扣:数组和字符串 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台

【练习一】给你一个整数数组 nums ,请计算数组的中心下标 。

数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

如果数组有多个中心下标,应该返回最靠近左边的那一个。如果数组不存在中心下标,返回 -1 。

示例 1:

输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。

示例 2:

输入:nums = [1, 2, 3]
输出:-1
解释:
数组中不存在满足此条件的中心下标

示例 3:

输入:nums = [2, 1, -1]
输出:0
解释:
中心下标是 0 。
左侧数之和 sum = 0 ,(下标 0 左侧不存在元素),
右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0 。
public static int pivotIndex(int[] nums) {for (int i = 0; i < nums.length; i++) {  //遍历数组int sum1 = 0; //记录左边的和int sum2 = 0; //记录右边的和for (int j = 0; j < i; j++) { //计算左边的和sum1 += nums[j];}for (int j = i+1; j < nums.length; j++) {  //计算右边的和sum2 += nums[j];}if (sum1 == sum2){  // 判断左右之和是否相等return i;}}return -1;
}

【练习二】给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

提示 : nums 为无重复元素的升序排列数组

public int searchInsert(int[] nums, int target) {for(int i=0;i<nums.length;i++){if(nums[i]>=target) return i;}return nums.length;}

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

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

相关文章

Python中的函数式编程概念

Python中的函数式编程&#xff08;Functional Programming&#xff09;是一种编程范式&#xff0c;它强调使用函数作为主要的编程构建块&#xff0c;并且避免改变状态&#xff08;即避免使用可变的数据结构和变量&#xff09;和可变数据。虽然Python本身是一种多范式编程语言&a…

计算机网络 ——网络层(IPv4地址)

计算机网络 ——网络层&#xff08;IPv4地址&#xff09; 什么是IPv4地址IP地址的分类特殊的IP地址 查看自己的IPv4地址 我们今天来看IPv4地址&#xff1a; 什么是IPv4地址 IPv4&#xff08;Internet Protocol version 4&#xff09;是第四版互联网协议&#xff0c;是第一个被…

使用CodeGen进行程序综合推理

Program Synthesis with CodeGen — ROCm Blogs (amd.com) CodeGen是基于标准Transformer的自回归语言模型家族&#xff0c;用于程序合成&#xff0c;正如作者所定义的&#xff0c;它是一种利用输入-输出示例或自然语言描述生成解决指定问题的计算机程序的方法。 我们将测试的…

mqtt-emqx:paho.mqttv5的简单例子

# 安装emqx 请参考【https://blog.csdn.net/chenhz2284/article/details/139551293?spm1001.2014.3001.5502】 # 下面是示例代码 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</…

[office] excel做曲线图的方法步骤详解 #经验分享#知识分享#其他

excel做曲线图的方法步骤详解 Excel是当今社会最流行用的办公软件之一&#xff0c;Excel可以用于数据的整理、分析、对比。可以更直观的看到数据的变化情况&#xff0c;而有很多时候需要制作曲线图表进行数据比较&#xff0c;因此&#xff0c;下面是小编整理的如何用excel做曲线…

spark-3.5.1+Hadoop 3.4.0+Hive4.0 分布式集群 安装配置

Hadoop安装参考: Hadoop 3.4.0HBase2.5.8ZooKeeper3.8.4Hive4.0Sqoop 分布式高可用集群部署安装 大数据系列二-CSDN博客 一 下载:Downloads | Apache Spark 1 下载Maven – Welcome to Apache Maven # maven安装及配置教程 wget https://dlcdn.apache.org/maven/maven-3/3.8…

二叉树的右视图-力扣

这道题目是二叉树的层序遍历的扩展&#xff0c;对二叉树进行层序遍历&#xff0c;判断节点是否为该层的最后一个节点&#xff0c;如果是&#xff0c;则将其的数值添加到返回数组中。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode…

mqtt-emqx:简单安装emqx

安装依赖 yum install -y epel-release libatomic下载 cd /chz/install/emqx wget https://www.emqx.com/en/downloads/broker/5.7.0/emqx-5.7.0-el7-amd64.tar.gz解压 mkdir -p emqx && tar -zxvf emqx-5.7.0-el7-amd64.tar.gz -C emqx后台运行 cd /chz/install/e…

10、有条件提前退出关键字Return From Keyword If【robot framework】

在 Robot Framework 中&#xff0c;Return From Keyword If 是一个有用的关键字&#xff0c;它允许你在特定条件下从关键字中返回。这在需要在满足某个条件时提前退出关键字的情况下特别有用。 以下是 Return From Keyword If 的语法和使用示例&#xff1a; 语法 Return From…

分布式事务Seata中XA和AT模式介绍

Seata中XA和AT模式介绍 分布式事务介绍分布式解决方案解决分布式事务的思路Seata的架构Seata中的XA模式Seata的XA模型流程XA模式优缺点实现XA模式 Seata中的AT模式Seata中的AT模式流程实现AT模式AT模式优缺点 AT模式与XA模式的区别 分布式事务介绍 分布式事务&#xff0c;就是…

Hbase中Rowkey的设计方法

Hbase中Rowkey的设计方法 过去对于Rowkey设计方法缺乏理解&#xff0c;最近结合多篇博主的文章&#xff0c;进行了学习。有不少心得体会。总结下来供后续学习和回顾。 ##一、设计Rowkey的三个原则 1.长度原则&#xff1a;长度不能太长&#xff0c;小于100个字节。可以偏端一…

TypeScript是前端语言吗:一场深入而复杂的探讨

TypeScript是前端语言吗&#xff1a;一场深入而复杂的探讨 在编程的世界里&#xff0c;TypeScript是否属于前端语言&#xff0c;似乎是一个简单而又复杂的问题。它似乎简单得可以直接回答“是”或“否”&#xff0c;然而&#xff0c;深入其背后&#xff0c;我们却会发现这个问…

代码随想录算法训练营第36期DAY50

DAY50 如果写累了就去写套磁信吧。 198打家劫舍 class Solution {public: int rob(vector<int>& nums) { vector<int> dp(nums.size()); dp[0]nums[0]; if(nums.size()1) return nums[0]; dp[1]max(nums[0],nums[1]); …

【中颖】SH79F9202 串口通信

头文件 uart.h #ifndef UART_H #define UART_H#include "SH79F9202.h" #include "LCD.h" #include "timer2.h" #include "timer5.h" #include "cpu.h" #include "key.h" #include "io.h" #include &qu…

Meta Llama 3 RMSNorm(Root Mean Square Layer Normalization)

Meta Llama 3 RMSNorm&#xff08;Root Mean Square Layer Normalization&#xff09; flyfish 目录 Meta Llama 3 RMSNorm&#xff08;Root Mean Square Layer Normalization&#xff09;先看LayerNorm和BatchNorm举个例子计算 LayerNormRMSNorm 的整个计算过程实际代码实现结…

OpenCV的核心数据结构

Mat类 Mat类是OpenCV中最重要的数据结构之一&#xff0c;用于表示图像和矩阵数据。Mat类封装了多维数组&#xff0c;并提供了多种操作图像数据的方法和函数。 Mat类的主要属性和方法 构造函数&#xff1a; Mat()&#xff1a;创建一个空的Mat对象。Mat(int rows, int cols, int…

Linux内核epoll

Linux网络IO模型 同步和异步&#xff0c;阻塞和非阻塞 Linux下的五种IO模型 同步和异步&#xff0c;阻塞和非阻塞 Linux 下的五种I/O模型&#xff1a; 阻塞IO&#xff08;Blocking IO&#xff09; BIO 非阻塞IO&#xff08;No Blocking IO&#xff09; IO复用&#xff08;se…

Linux系统管理磁盘管理004

本章主要讲述详细lvm扩容。 操作系统&#xff1a; CentOS Stream 9 扩容目标&#xff1a; jianglv扩容到600MB 扩容前 [rootlocalhost ~]# lvdisplay lgb--- Logical volume ---LV Path /dev/lgb/nginx_lvmLV Name nginx_lvmVG Name …

DEJA_VU3D - Cesium功能集 之 121-底图机制

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,工作原因可能无法像以前那样周更2-3篇,但是闲下来还是会不定期的更新,Cesium不…

手把手教你实现条纹结构光三维重建(1)——多频条纹生成

关于条纹结构光三维重建的多频相移、格雷码、格雷码相移、互补格雷码等等编码方法&#xff0c;我们在大多数平台上&#xff0c;包括现在使用语言大模型提问&#xff0c;都可以搜到相关的理论&#xff0c;本人重点是想教会你怎么快速用代码实现。 首先说下硬件要求&#xff0c;…