当前位置: 首页 > news >正文

Java数组详解 -- 基础知识与常用操作

文章目录

  • 前言
  • 一、初识数组
    • 1. 数组的定义
    • 2. 数组的特点
    • 3. 声明和初始化数组
    • 4. 默认初始化值
  • 二、访问和操作数组元素
    • 1. 数组的索引和范围
    • 2. 通过索引访问数组元素
    • 3. 修改数组元素的值
  • 三、数组的长度和属性
    • 1. 数组的长度计算
    • 2. 数组的长度属性
    • 3. 数组越界的错误
  • 四、数组的遍历
    • 1. for循环遍历数组
    • 2. 增强for循环遍历数组
    • 3. 遍历多维数组
  • 五、多维数组
    • 1. 二维数组的定义和初始化
    • 2. 访问和操作二维数组元素
  • 六、数组的注意事项和扩展
    • 1. 数组长度的不可变性
    • 2. 数组的复制和排序
    • 3. 数组的查找
    • 4. 动态数组的实现:ArrayList
  • 总结


前言

为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
(博客的参考源码以及可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

一、初识数组

数组是一种可以容纳多个相同类型数据元素的数据结构。它是Java编程中常用的数据类型,用于存储和操作一组数据。数组提供了一个连续的内存空间来存储多个元素,并通过索引来访问和操作其中的每个元素。

1. 数组的定义

在Java中,可以使用以下语法来定义一个数组:

  dataType[] arrayName;

其中,dataType表示数组中元素的数据类型,arrayName是数组的名称。

2. 数组的特点

1. 数组具有以下特点:

  • 数组长度固定:一旦数组被创建,其长度就是固定的,无法动态改变
  • .存储相同类型的数据:数组中的元素必须是相同类型的数据
  • 连续的内存空间:数组中的元素在内存中是连续存储的,可以通过索引快速访问

在这里插入图片描述

  • 正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。例如删除下标为3的元素,如图所示:

在这里插入图片描述

  • 数组的元素是不能删除的,只能覆盖

3. 声明和初始化数组

1. 声明数组的语法

要声明一个数组,可以使用以下语句:

  dataType[] arrayName;

其中,dataType是数组中元素的数据类型,arrayName是数组的名称。

2. 静态初始化和动态初始化

在声明数组的同时,可以进行初始化操作。数组的初始化可以分为静态初始化和动态初始化两种方式。

  • 静态初始化

静态初始化是指在声明数组的同时,为数组元素赋初值。可以使用以下语法进行静态初始化:

  dataType[] arrayName = {element1, element2, ...};

其中,dataType是数组中元素的数据类型,arrayName是数组的名称,element1, element2, …是要赋给数组元素的值。

  • 动态初始化

动态初始化是指在声明数组后,再为数组分配内存空间,并为数组元素赋初值。可以使用以下语法进行动态初始化:

  dataType[] arrayName = new dataType[arrayLength];

其中,dataType是数组中元素的数据类型,arrayName是数组的名称,arrayLength是数组的长度,表示可以存储的元素个数。

4. 默认初始化值

在Java中,如果没有为数组中的元素赋初值,那么数组会自动进行默认初始化,根据数据类型不同采用不同的默认值。下面是一些常见数据类型的默认初始化值:

  • int类型的数组,默认元素值为 0
  • double类型的数组,默认元素值为 0.0
  • boolean类型的数组,默认元素值为 false
  • char类型的数组,默认元素值为空字符 \u0000

二、访问和操作数组元素

1. 数组的索引和范围

数组中的每个元素都通过一个非负整数索引来访问。索引从 0 开始,依次递增。例如,第一个元素的索引为 0,第二个元素的索引为 1,以此类推。数组的长度为 n,则有效索引范围为 0 到 n - 1

2. 通过索引访问数组元素

要访问数组中的元素,可以使用以下语法:

  arrayName[index]

其中,arrayName是数组的名称,index是要访问的元素的索引。通过该语法可以获取数组中指定索引位置的元素值。

3. 修改数组元素的值

通过索引访问数组元素后,还可以对该元素进行赋值操作,从而修改元素的值。使用以下语法来修改数组元素的值:

  arrayName[index] = newValue;

其中,arrayName是数组的名称,index是要修改的元素的索引,newValue是要赋给该元素的新值。

三、数组的长度和属性

1. 数组的长度计算

通过使用 length 属性,可以获取数组的长度。长度表示数组中元素的个数,而非数组占用的内存空间大小。要获取数组的长度,可以使用以下语法:

  int length = arrayName.length;

其中,arrayName是数组的名称,length是用于存储数组长度的变量。

2. 数组的长度属性

数组的长度是在创建数组时指定的,一旦创建后,长度就是固定的。使用length属性可以获取数组的长度值,常用于遍历数组或检查数组是否越界。

3. 数组越界的错误

在访问数组元素时,需要确保所使用的索引在有效范围内,否则会发生数组越界的错误。如果索引小于0或大于等于数组长度,都会导致数组越界错误。在编写代码时,应格外注意数组索引的范围

四、数组的遍历

数组的遍历是指依次访问数组中的每个元素。遍历数组可以通过循环结构实现,常见的有for循环和增强for循环

1. for循环遍历数组

for (int i = 0; i < arrayName.length; i++) {// 访问数组元素:arrayName[i]// 执行其他操作
}

在for循环中,使用一个循环变量i来作为索引,从 0 开始逐渐增加,直到达到数组长度减 1 为止。该方法适用于需要根据索引进行操作的情况。

2. 增强for循环遍历数组

for (dataType element : arrayName) {// 访问数组元素:element// 执行其他操作
}

增强 for 循环是Java 5中引入的一种遍历数组的简化方法。它可以直接遍历数组中的每个元素,不需要使用索引变量。该方法适用于只需要访问数组元素而不需要索引的情况。

3. 遍历多维数组

遍历多维数组可以嵌套使用多个循环,每层循环负责遍历一维数组的元素。

for (int i = 0; i < arrayName.length; i++) {for (int j = 0; j < arrayName[i].length; j++) {// 访问数组元素:arrayName[i][j]// 执行其他操作}
}

通过嵌套的循环,可以依次遍历每个二维数组的元素。

五、多维数组

多维数组是指包含多个一维数组的数组。例如,二维数组是一种常见的多维数组,它包含多个一维数组作为其元素。

1. 二维数组的定义和初始化

在Java中,可以使用以下语法来定义二维数组:

  dataType[][] arrayName = new dataType[rowLength][columnLength];

其中,dataType是二维数组中元素的数据类型,arrayName是二维数组的名称,rowLength表示二维数组的行数,columnLength表示二维数组的列数。

二维数组的初始化可以通过静态初始化和动态初始化两种方式,与一维数组类似。

2. 访问和操作二维数组元素

要访问二维数组中的元素,可以使用以下语法:

  arrayName[rowIndex][columnIndex]

其中,arrayName是二维数组的名称,rowIndex是要访问的元素所在行的索引,columnIndex是要访问的元素所在列的索引。

可以通过修改二维数组元素的值,来操作二维数组。与一维数组类似,使用以下语法来修改二维数组的元素值:

  arrayName[rowIndex][columnIndex] = newValue;

六、数组的注意事项和扩展

1. 数组长度的不可变性

数组一旦创建后,其长度就是固定的,无法动态改变。如果需要存储更多的元素,可以考虑使用动态数组或集合类。

2. 数组的复制和排序

  • 可以使用 System.arraycopy() 方法或 Arrays.copyOf() 方法来复制数组

使用 System.arraycopy() 方法:

int[] sourceArray = {1, 2, 3, 4, 5};
int[] targetArray = new int[sourceArray.length];System.arraycopy(sourceArray, 0, targetArray, 0, sourceArray.length);

使用 Arrays.copyOf() 方法:

int[] sourceArray = {1, 2, 3, 4, 5};
int[] targetArray = Arrays.copyOf(sourceArray, sourceArray.length);
  • 可利用Arrays.sort() 方法对数组进行 排序
 // 使用 Arrays.sort() 方法对数组进行排序Arrays.sort(numbers);
}

3. 数组的查找

通过 binarySearch 方法能对排序好的数组进行二分查找法操作

import java.util.Arrays;public class BinarySearchExample {public static void main(String[] args) {// 示例数组,必须为已排序的数组int[] array = {10, 20, 30, 40, 50, 60, 70};int key = 40;int index = Arrays.binarySearch(array, key);
}

4. 动态数组的实现:ArrayList

在Java中,除了使用数组外,还可以使用 ArrayLis t类来实现动态数组。ArrayList 可以自动调整长度,并提供了丰富的方法来操作和管理元素。(详情请到个人主页查看关于ArrayList的入门博客)

总结

欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

相关文章:

Java数组详解 -- 基础知识与常用操作

文章目录 前言一、初识数组1. 数组的定义2. 数组的特点3. 声明和初始化数组4. 默认初始化值 二、访问和操作数组元素1. 数组的索引和范围2. 通过索引访问数组元素3. 修改数组元素的值 三、数组的长度和属性1. 数组的长度计算2. 数组的长度属性3. 数组越界的错误 四、数组的遍历…...

(统计学习方法|李航)第五章 决策树——一二三节:决策树模型与学习,特征选择,决策树的生成,

目录 一,决策树模型与学习 1.决策数模型 2.决策树与if-then规则 3.决策树与条件概率分布 4.决策树学习 二,特征选择 1.特征选择问题 2.信息增益 3.信息增益比 三,决策树的生成 1.ID3算法 2.C4.5的生成算法 一,决策树模型…...

qt lamda表达式及捕获变量列表符号说明及示例

问题描述: 最近发现很多人都喜欢用Lamda表达式了,至于他们到底知不知道自己用的是什么意思,那就另说了。 虽然我个人并不太喜欢,因为很多地方没法像以前信号和槽那样清晰了,而且很多生成UML的软件估计也不支持解析转成对应的序列图啥的。 但是这个lamda写法确实挺方便的…...

第十六章、【Linux】程序管理与SELinux初探

16.1 什么是程序 (process) 在Linux 系统当中:“触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系&#xff…...

ElasticSearch索引生命周期管理--DELETE

概要 ElasticSearch中的索引生命周期管理,也就是ilm(Manage the index lifecycle),是指定了索引在不同周期下的处理策略。ilm 的对象是索引而不是索引中的数据。ilm 包括四个阶段:hot 、warm、cold和delete。hot、warm和cold表示…...

sentinel简单使用

核心demo&#xff1a; 1 引入依赖: <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.0</version> </dependency>2 核心代码&#xff1a; 3 限流保护代码&#xff1a;…...

C#小轮子:自动连续Ping网络地址

文章目录 前言Ping代码异步问题 前言 工作中&#xff0c;我们经常用到Ping这个指令&#xff0c;有时候我们需要Ping整个网段来查看这个网段上面有什么设备&#xff0c;哪些Ip地址是通的&#xff0c;这个时候就需要Ping指令 Ping 代码 我这个是批量Ping的代码&#xff0c;而…...

react入门笔记

什么是React? React是一个用于创建用户界面的开源前端javaScript库。它是声明式的、高效的和灵活的&#xff0c;并且他坚持基于组件的方法&#xff0c;这使得我们能够创建可重用的UI组件。 React是一个开源的前端javaScript库&#xff0c;用于构建用户界面或者UI组件。它是由…...

记录--前端重新部署如何通知用户

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 1. 场景 前端构建完上线&#xff0c;用户还停留还在老页面&#xff0c;用户不知道网页重新部署了&#xff0c;跳转页面的时候有时候js连接hash变了导致报错跳不过去&#xff0c;并且用户体验不到新功能…...

WPS的excel表格单元格拖动数字日期等 不自增原因

对着表格中的每个单元格右下角,在变成下图,黑十字后,拖动这个十字.就会在右侧出现一个小窗口. 里面菜单中可以选择按序数增加 但是,如果拖动,发现小窗口菜单不出现.说明这一栏开启了筛选功能.清空筛选条件后,即可恢复自增功能....

2308C++简单异步懒

Lazy Lazy由C20无栈协程实现.一个Lazy闭包一个懒求值的计算任务. 使用Lazy 想用Lazy,需要先#inlude<async_simple/coro/Lazy.h>,再实现返回类型为Lazy<T>的协程函数即可.如: # 包含<简单异步/协程/懒.h>懒<整>任务1(整 x){协中 x;//带有协中的函数…...

Linux常规操作命令

日升时奋斗&#xff0c;日落时自省 目录 1、vim 1.1、工作模式 1.2、末行模式操作相关命令 1.2.1、保存退出操作 1.2.2、查找替换 1.3、输入模式操作相关命令 1.3.1、移动相关命令 1.3.2、删除和剪切命令 1.3.3、复制操作 1.3.4、撤销 2、head 3、tail 4、ps 5、…...

日期切换

组件&#xff1a;<template><div class"time-picker"><el-radio-group size"small" v-model"timeType" change"changePickerType"><el-radio-button label"hour" v-if"isShow">时</el…...

怎么裁剪视频大小尺寸?简单的裁剪方法分享

怎么裁剪视频的画面大小尺寸呢&#xff1f;有时当我们下载下来一段视频&#xff0c;由于视频的画面大小比例不同&#xff0c;会有很多的黑边&#xff0c;我们不管是观看还是进行二次编辑都非常影响体验&#xff0c;而调整视频画面比例以适应观众的设备或平台&#xff0c;比如将…...

智慧工地源码,Spring Cloud+ Vue+UniApp开发,微服务架构

智慧工地源码&#xff0c;智慧工地云平台源码 智慧工地APP源码 智慧工地的核心是数字化&#xff0c;它通过传感器、监控设备、智能终端等技术手段&#xff0c;实现对工地各个环节的实时数据采集和传输&#xff0c;如环境温度、湿度、噪音等数据信息&#xff0c;将数据汇集到云…...

【Hystrix技术指南】(5)Command创建和执行实现

创建流程 构建HystrixCommand或者HystrixObservableCommand对象 *使用Hystrix的第一步是创建一个HystrixCommand或者HystrixObservableCommand对象来表示你需要发给依赖服务的请求。 若只期望依赖服务每次返回单一的回应&#xff0c;按如下方式构造一个HystrixCommand即可&a…...

学习笔记-JAVAJVM-JVM的基本结构及概念

申明&#xff1a;文章内容是本人学习极客时间课程所写&#xff0c;文字和图片基本来源于课程资料&#xff0c;在某些地方会插入一点自己的理解&#xff0c;未用于商业用途&#xff0c;侵删。 原资料地址&#xff1a;课程资料 什么是JVM 原文连接&#xff1a; 原文连接 JVM是J…...

ubuntu20.04 docker 下编译 tensorflow-gpu

ubuntu20.04 安装tensorflow-gpu 配置&#xff1a; 系统 ubuntu 20.04 LTS 显卡 GTX 1060 6G 1 安装cudatoolkit &#xff08;我选 CUDA Toolkit 12.2 &#xff09; NVIDIA CUDA Installation Guide for Linux https://docs.nvidia.com/cuda/cuda-installation-guide-linux/in…...

❤ VUE3 项目路由拦截器配置(二)

❤ VUE3 项目 路由拦截器进一步 配置 路由拦截抽离为单个模块permission.ts 路由配置规则 白名单&#xff08;直接进入&#xff09; PC页面和PC子页面&#xff08;直接进入&#xff09; 后台页面&#xff08;验证token &#xff09; 没有token> 后台登录页面 有token> 后…...

Filament 如何自定义登录页面

官方的页面太简约了&#xff0c;而且可供修改的范围太少了 通过发布官方资源可以看到 resources/views/vendor/filament-panels/pages/auth/login.blade.php <x-filament-panels::page.simple>if (filament()->hasRegistration())<x-slot name"subheading&…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...