【Java从入门到大牛】数组详解

news2024/9/23 7:29:19

🔥 本文由 程序喵正在路上 原创,CSDN首发!
💖 系列专栏:Java从入门到大牛
🌠 首发时间:2023年7月9日
🦋 欢迎关注🖱点赞👍收藏🌟留言🐾
🌟 一以贯之的努力 不得懈怠的人生

目录

  • 什么是数组
  • 数组的定义和访问
    • 静态初始化数组
    • 静态初始化数组在计算机中的基本原理
    • 数组的访问
    • 数组的遍历
    • 动态初始化数组
    • 静态初始化数组在计算机中的基本原理
    • 案例:评委打分
  • 数组在计算机中的执行原理
    • 数组的执行原理和Java程序的执行原理
    • 多个变量指向同一个数组的问题
  • 专项训练:数组常见案例
    • 数组求最值
    • 数组反转
    • 随机排名
  • 补充知识:Debug工具的使用

什么是数组

数组就是一个容器用来存储一批相同类型的数据

举例

int[] arr = {1, 2, 3, 4, 5};
String[] names = {"张三", "李四", "王五"};

有了变量,为什么还要用数组 ?

从上面的例子中,我们很容易就可以看出来,如果使用变量来存储一系列相同类型的数据,那么代码就会很繁琐;而使用数组代码简洁,逻辑清晰

数组的定义和访问

静态初始化数组

什么是静态初始化数组 ?

在定义数组的时候直接给数组赋值

静态初始化数组的格式

// 完整格式
数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3, ...};
int[] ages = new int[]{12, 34, 56};
double[] scores = new double[]{1.11, 2.22, 3.33};

// 简化格式
数据类型[] 数组名 = {元素1, 元素2, 元素3, ...};
int[] ages = {12, 34, 56};

适用业务场景

静态初始化适合一开始就知道要存入哪些元素值的业务场景

注意事项

  • 数据类型[] 数组名” 也可以写成 “数据类型 数组名[]
  • 什么类型的数组只能存放什么类型的数组

静态初始化数组在计算机中的基本原理

int[] ages = {12, 24, 36};

在这里插入图片描述

  • 数组变量名中存储的是数组在内存中的地址,数组是一种引用数据类型
  • 数组中存储的元素都有一个下标,从 0 开始

数组的访问

怎么访问数组 ?

数组名[索引]

举例

// 取值
System.out.println(arr[0]);

// 赋值
arr[2] = 100;
System.out.println(arr[2]);

数组有一个长度属性:length

// 获取数组的长度(就是数组中的元素个数)
System.out.println(arr.length);

数组的最大索引可以怎么表示 ?

数组名.length-1	//前提是元素个数大于0

注意事项

访问数组时,使用的索引不能超过数组的最大索引。当访问越界时,执行程序时会出 bug,会出现一个索引越界的异常提示

数组的遍历

什么是遍历 ?

遍历就是从头到尾一个一个地访问数据

为什么要遍历数组 ?

有时候,我们要对一个数组进行求和、搜索元素、找最大值或最小值的时候,就需要遍历数组

如何遍历数组 ?

int[] ages = {20, 30, 40, 50};
for (int i = 0; i < ages.length; i++) {
	System.out.println(ages[i]);
}

动态初始化数组

什么是动态初始化数组 ?

定义数组时先不存入具体的元素值,只确定数组存储的数据类型和数组的长度

动态初始化数组的格式

数据类型[] 数组名 = new 数据类型[长度];
int[] arr = new int[3];

// 后赋值
arr[0] = 10;
System.out.println(arr[0]);

适用业务场景

动态初始化适合开始不确定具体元素值,只知道元素个数的业务场景

注意事项

静态初始化和动态初始化数组的写法是独立的,不可以混用,即 int[] arr = new int[3]{30,40,50};

静态初始化数组在计算机中的基本原理

int[] arr = new int[3];

在这里插入图片描述
动态初始化数组元素默认值规则:

数据类型明细默认值
基本类型byte、short、char、int、long0
基本类型float、double0.0
基本类型booleanfalse
引用类型类、接口、数组、Stringnull

案例:评委打分

需求

某歌唱比赛,需要开发一个系统:可以录入 6 名评委的打分,录入完毕后立即输出平均分作为选手的得分

分析

  1. 6 名评委的打分是后期录入的,一开始不知道具体的分数,因此定义一个动态初始化的数组存分数
  2. 遍历数组中的每个位置,每次提示用户录入一个评委的分数,并存入到数组对应的位置
  3. 遍历数组中的每个元素进行求和,最终算出平均分打印出来即可

代码示例

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double[] scores = new double[6];
        double sumScore = 0, averScore = 0;     // 总分、平均分, 记得初始化变量

        // 录入分数
        for (int i = 0; i < scores.length; i++) {
            System.out.println("请输入一个评委的分数:");
            scores[i] = sc.nextDouble();
        }

        // 计算总分
        for (int i = 0; i < scores.length; i++) {
            sumScore += scores[i];
        }

        // 计算平均分
        averScore = sumScore / scores.length;
        System.out.println("选手的得分为:" + averScore);
    }
}

运行结果

在这里插入图片描述

数组在计算机中的执行原理

数组的执行原理和Java程序的执行原理

Java 内存分配介绍

  • 方法区
  • 本地方法栈
  • 寄存器

在这里插入图片描述

数组在计算机中的执行原理

public class ArrayDemo {
    public static void main(String[] args) {
        int a = 10;
        System.out.println(a);
        
        int[] arr = {11, 22, 33};
        System.out.println(arr);
        System.out.println(arr[1]);
        
        arr[0] = 44;
        arr[1] = 55;
        arr[2] = 66;

        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}

运行结果

在这里插入图片描述

具体原理在这里插入图片描述

总结

1、运行一个 Java 程序,主要看 JVM 中包含的哪几部分内存区域 ?
- 方法区
- 栈内存
- 堆内存

2、简单说说 int a = 20; int[] arr = new int[3]; 这两行代码的执行原理 ?

  • a 是变量,直接放在栈中, a 变量中存储的数据就是 20 这个值
  • new int[3] 是创建一个数组对象,会在堆内存中开辟区域存储 3 个整数
  • arr 是变量,在栈中,arr 中存储的是数组对象在堆内存中的地址值

多个变量指向同一个数组的问题

多个变量指向同一个数组

public class ArrayDemo2 {
    public static void main(String[] args) {
        int[] arr1 = {11, 22, 33};
        int[] arr2 = arr1;

        System.out.println(arr1);
        System.out.println(arr2);

        arr2[1] = 99;
        System.out.println(arr1[1]);
    }
}

运行结果

在这里插入图片描述

具体原理

在这里插入图片描述

使用数组时常见的一个问题

如果某个数组变量存储的地址是 null,那么该变量将不再指向任何数组对象

arr2 = null; 						//把null赋值给arr2
System.out.println(arr2);			//null
System.out.println(arr2[0]);		//会出异常
System.out.println(arr2.length);	//会出异常

在这里插入图片描述

总结

1、多个数组变量,指向同一个数组对象的原因是什么 ?需要注意什么 ?
- 多个数组变量中存储的是同一个数组对象的地址
- 多个变量修改的都是同一个数组对象中的数据

2、如果某个数组变量中存储的 null,代表什么意思 ?需要注意什么 ?
- 代表这个数组变量没有指向数组对象
- 可以输出这个变量,但是不能用这个数组变量去访问数据或者访问数组长度,会报空指针异常:NullPointerException

专项训练:数组常见案例

数组求最值

实现步骤

  • 把数据拿到程序中去,用数组装起来
  • 定义一个变量 max 用于记录最终的最大值,建议存储数组的第一个元素值来作为参照值
  • 从第二个位置开始遍历数组的数据,如果遍历的当前数据大于 max 变量存储的数据,则替换变量存储的数据为当前数据
  • 循环结束后输出 max 变量即可

代码示例

public class Test {
    public static void main(String[] args) {
        int[] scores = {34, 98, 29, 78, 0, -43};
        int max = scores[0];
        
        // 逐个比较数据
        for (int i = 1; i < scores.length; i++) {
            if (scores[i] > max) {
                max = scores[i];
            }
        }

        System.out.println("最大值为: " + max);
    }
}

数组反转

需求

某个数组有 5 个数据:10、20、30、40、50,请将这个数组中的数据进行反转

分析

数据的反转操作实际上就是:依次前后交换数据即可实现

代码示例

public class Test {
    public static void main(String[] args) {
        int[] digits = {10, 20, 30, 40, 50};

        System.out.println("反转前的数组: ");
        for (int i = 0; i < digits.length; i++) {
            System.out.print(digits[i] + " ");
        }
        System.out.println();

        for (int i = 0; i < digits.length - 1 - i; i++) {
            int j = digits.length - 1 - i;     // 右边元素的下标 
            
            // 交换左右元素
            int temp = digits[i];
            digits[i] = digits[j];
            digits[j] = temp;
        }

        System.out.println("反转后的数组: ");
        for (int i = 0; i < digits.length; i++) {
            System.out.print(digits[i] + " ");
        }
        System.out.println();
    }
}

运行结果

在这里插入图片描述

总结

1、我们是如何完成数组的反转的 ?

使用 for 循环,控制让数组的前后位置的元素,依次交换

2、数组如何实现前后元素交换 ?
- 定义一个临时变量记住前一个位置处的元素值
- 再把后一个位置处的元素值赋值给前一个位置处
- 最后把临时变量记住的前一个位置的元素值赋值给后一个位置处

随机排名

需求

某公司开发部有 5 名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。请先依次录入 5 名员工的工号,然后展示出一组随机的排名顺序

分析

  • 定义一个动态初始化的数组用于录入员工的工号
  • 遍历数组中的每个元素
  • 每遍历到一个数据,都随机生成一个索引值,然后让当前数据与随机生成的索引位置处的数据进行交换
  • 输出数组中的内容即可

代码示例

import java.util.Random;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] nums = new int[5];
		
		// 录入工号
        for (int i = 0; i < nums.length; i++) {
            System.out.print("请输入第" + (i + 1) + "个工号: ");
            nums[i] = sc.nextInt();
        }
		
		// 随机交换元素
        Random r = new Random();
        for (int i = 0; i < nums.length; i++) {
            int index = r.nextInt(nums.length);

            // 交换元素
            int temp = nums[i];
            nums[i] = nums[index];
            nums[index] = temp;
        }

		// 输出随机排名
        System.out.println("随机排名后的一个序列: ");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + " ");
        }
        System.out.println();
    }
}

运行结果

在这里插入图片描述

补充知识:Debug工具的使用

什么是 Debug 工具 ?

IDEA 自带的断点调试工具,可以控制代码从断点开始一行一行地执行,然后详细观看程序执行的情况

Debug 工具基本使用步骤

  1. 在需要调试的代码行左侧,点击一下,形成一个红色的断点
  2. 在运行的时候选择使用 Debug 方式启动程序,启动后程序会在运行到断点处时暂停
  3. 点击对应按钮控制代码一行一行地往下执行

在这里插入图片描述

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

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

相关文章

Python + pymysql 之 MySQL 查询操作

在MySQL中构建一个测试表&#xff0c;如下&#xff1a; 查询单条数据 # -*- coding: UTF-8 -*- import pymysqldef mysql_query():"""MySQL查询:return:"""# 打开数据库连接db pymysql.connect(host"127.0.0.1",user"root"…

IDEA 配置 openjdk,jre

使用 idea 配置 zip 版本的 openjdk 和 jre&#xff0c;我使用的时 redhat 提供的 jdk 和 jre。 一、下载 idea、jdk 和 jre 红帽下载地址为&#xff1a; jdk 和 jre 安装地址根据个人配置&#xff0c;我的配置如下&#xff1a; 下划线的分别为我的 jdk 和 jre 保存路径 二…

简单学习UE5.2的PCG框架插件里的基础概念

目标 最近了解到5.2版本推出了实验性的功能PCG框架&#xff0c;以及用它做的范例 Electric Dreams。 本篇我简单学习它的一些基础概念&#xff0c;做一些记录。 0. 启用插件 此功能相关的类型都在PCG插件中&#xff0c;因此首先要确保启用了PCG插件&#xff1a; 1. PCGGr…

为什么进程地址空间中包括操作系统?

今天聊聊进程地址空间这点小事。 说到进程的地址空间&#xff0c;大家可能都知道这样一张图&#xff1a; 这张图就是Linux程序运行起来后所谓的进程地址空间&#xff0c;这里包括我们熟悉的代码区、数据区、以及堆区和栈区&#xff0c;今天我们不讲解这些区域&#xff0c;而是…

Vue生态及实践 - SSR(上)

目录 目标 理论 Rendering 你真的需要SSR亦或是同构吗&#xff1f; 同构实践 通用代码 同构第一步&#xff1a;避免单例 src/app.js src/store.js src/router.js 同构第二步&#xff1a;Server entry【服务端进入】&#xff1b;Client entry【客户端进入】 src/entry…

ESP32设备驱动-AS5600磁性旋转位置传感器

AS5600磁性旋转位置传感器 文章目录 AS5600磁性旋转位置传感器1、AS5600介绍2、硬件准备3、软件准备4、驱动实现1、AS5600介绍 AS5600 是一款可编程的 12 位高分辨率非接触式磁性旋转位置传感器。 AS5600可以作为磁性电位器或磁性编码器使用,具有出色的可靠性和耐用性。 与传…

网页版代码编辑器实现

接着前几天写的博客https://blog.csdn.net/woyebuzhidao321/article/details/131495855&#xff0c;提到了涉及vscode网页版工作区创建的api&#xff0c;这两天一时兴起&#xff0c;搞了一个网页版的代码编辑器&#xff0c;如果在2020年10月之前&#xff0c;实现一个网页版代码…

活动笔记 | 「企业人效提升路径」之数字化实践

6月27日&#xff0c;由人力资源智享会联合盖雅工场等机构主办的2023中国人力资源数字化论坛在北京顺利举办。盖雅工场高级解决方案顾问谷天毅先生发表了主题为 《企业人效提升路径之数字化实践》 的分享。 以下是分享内容&#xff0c;enjoy~ △ 盖雅工场高级解决方案顾问谷天…

httpx 返回都是乱码问题,非编码问题。

因为python 的requests 不能使用抓http2 的报文。所以看了一些httpx的使用。但是发现httpx 不能自动解压&#xff0c;text打印出来的都是乱码。一开始以为是编码格式的bug &#xff0c;但是使用chardet 确认了确实是utf-8.然后怀疑是压缩的问题。先去官网搜了一些文档 文档说会…

opencv4.7.0编译opencv-contrib-4.7.0以及CUDA

0、引言 最近工作中需要用到使用CUDA加速后的opencv进行传统算法的开发&#xff0c;在编程之前&#xff0c;需要先解决环境编译和lib库问题&#xff0c;本文就是记录自己编译opencv-4.7.0的全过程。 1、CUDA下载和安装 可参考我之前的博客WIN10安装配置TensorRT详解中的前几…

达尔文——生物医疗科学领域大模型

赛灵力官网 1. 生物医疗领域的挑战 1.1 复杂性 生物系统和生物过程非常复杂&#xff0c;包含大量的相互作用和调控机制&#xff0c;理解和解析这些复杂性是一项巨大的挑战。 举例来说&#xff0c;单单一个人类&#xff0c;体内的生物信息就非常复杂&#xff1a; 人类体内体内…

Django_re_path_使用正则匹配url

与path定义的路由相比&#xff0c;re_path 定义的路由可以使用正则表达式匹配url。 需要注意的是&#xff1a; 如果未定义匹配结果的变量名&#xff0c;匹配的结果默认传入视图的第2个形参。如果定义了匹配结果的变量名&#xff0c;匹配的结果会传给视图的同名字段&#xff0…

从零开始学习自动驾驶决策规划

从零开始学习自动驾驶决策规划 从入门到掌握的一系列讲解&#xff0c;其中涵盖的内容如下&#xff1a; 前言课 第一节-ros工程的创建 第一节-运行环境和工程目录简介第二节-工程运行和小车模型搭建简介 第二节-车辆里程计第三节-整体架构思路 第三节-地图路线构建方法 第三节…

Packet Tracer – 配置静态 NAT

Packet Tracer – 配置静态 NAT 目标 第 1 部分&#xff1a;测试不使用 NAT 的访问 第 2 部分&#xff1a;配置静态 NAT 第 3 部分&#xff1a;测试使用 NAT 的访问 拓扑图 场景 在 IPv4 配置网络中&#xff0c;客户端和服务器使用专用编址。 然后&#xff0c;在含专用编址…

MATLAB---线性规划问题求最优解(含例题)

线性规划是运筹学的基础&#xff0c;在现实企业经营中&#xff0c;如何有效的利用有限的人力、财力、物力等资源。 MATLAB 为方便大家理解&#xff0c;这里我们直接用一个例题为大家讲解使用matlab求解线性规划问题。 根据上图给出的线性规划问题。我们使…

SpringBoot 如何使用 @ExceptionHandler 注解进行局部异常处理

SpringBoot 如何使用 ExceptionHandler 注解进行局部异常处理 介绍 在开发 Web 应用程序时&#xff0c;异常处理是非常重要的一部分。SpringBoot 提供了多种方式来处理异常&#xff0c;其中之一是使用 ExceptionHandler 注解进行局部异常处理。使用 ExceptionHandler 注解&am…

哈工大计算网络课程数据链路层详解之:数据链路层服务

哈工大计算网络课程数据链路层详解之&#xff1a;数据链路层服务 在介绍完网络层的实现功能和协议之后&#xff0c;接下来我们继续介绍网络层的下一层&#xff1a;数据链路层。 本节首先对数据链路层的功能和所提供的服务进行概述。 如下图示例网络所示&#xff0c;标红色的部…

【二分查找】34. 在排序数组中查找元素的第一个和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 解题思路 使用二分查找查找到目标元素的索引之后然后向左以及向右寻找目标元素&#xff0c;然后记录下区间位置 然后保存下来 class Solution {public int[] searchRange(int[] nums, int target) {// 使用二分查找 数组有序…

Java使用Stream API对于数据列表经常处理

Java使用Stream API对于数据列表经常处理 先提供一些简单到复杂的常见例子&#xff0c;您可以根据这些例子进行进一步的开发和学习&#xff1a; 数据过滤筛选操作 查询表中所有数据&#xff1a; List<User> users userDao.getAllUsers();根据条件查询单个结果&#…

别测了,背锅上线!

三百六十行&#xff0c;行行都背锅。 用例千万条&#xff0c;质量第一条。 流程不规范&#xff0c;亲人两行泪&#xff01; 每次上线后多多少少都有些问题&#xff0c;每次的项目总结会总会生产一口新锅&#xff0c;等着你我他来背&#xff0c;这不又要上线了&#xff0c;这次…