Java:数组

文章目录

  • 一、数组的介绍
  • 二、数组的定义
    • 2.1 静态初始化
    • 2.2 动态初始化
  • 三、常见操作
    • 3.1 访问数据
    • 3.2 修改数据
    • 3.3 常见问题
  • 四、数组内存图(难点)
    • 4.1 前置知识
    • 4.2 执行流程
  • 五、结语

一、数组的介绍

Java中的数组是一种基本的数据结构,它能够存储固定数量的、相同类型的元素。数组中的每个元素都通过一个索引(或位置)来访问,索引通常是从0开始的整数

  • 固定大小:一旦创建,数组的长度不可变。
  • 连续内存分配:数组元素在内存中

二、数组的定义

Java中定义数组主要有以下两种方式

2.1 静态初始化

如果你已经知道数组中要存储哪些具体元素,可以使用静态初始化。这时不需要指定数组长度,它会根据初始化元素的数量自动决定。

这里有些同学可能碰到,[]中括号放在数组名后面,其实都是一样,我这边建议[]中括号放在数据类型

public class Main {public static void main(String[] args) {// 静态初始化: 简写格式(推荐)// 格式:数据类型[] 数组名 = {元素1,元素2,元素3,......}int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};// 静态初始化:完整格式// 格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,......}int[] arr1 = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};// 这两句话的意思都是:创建一个 int类型的数组,数组中存放着1, 2, 3, 4, 5, 6, 7, 8, 9数据}
}

2.2 动态初始化

当你只知道数组的长度,但不确定具体元素值时,可以使用动态初始化。

public class Main {public static void main(String[] args) {/* 动态初始化:完整格式格式:数据类型[] 数组名 = new 数据类型[数组的长度]*/int[] arr = new int[10]; // 这句话的意思是:创建一个 int类型的数组,长度为10}
}

因为这种方式只指定数组的长度,元素会被赋予类型的默认值

  • 整数类型:0
  • 小数类型:0.0
  • 字符类型:‘/u0000’ (空格)
  • 布尔类型:false
  • 引用类型:null (除了上面四类8种数据类型外,其他都是引用类型)

三、常见操作

数组元素需要通过索引访问

  • 索引也叫下标
  • 索引是从0开始的,逐渐加1,直到数组长度-1为止

3.1 访问数据

需求:定义一个数组,获取数组的第一个元素和最后一个元素

public class Main {public static void main(String[] args) {// 1、定义数组int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};// 2、访问第一个元素System.out.println(arr[0]); // 1// 3、访问最后一个元素System.out.println(arr[8]); // 9}
}

现在有一个问题,如果这个数组的长度你不知道,当然我们现在都知道访问第一个元素下标都是0,那最后一个元素因为你不知道数组长度所以你就不知道下标

public class Main {public static void main(String[] args) {// 1、定义int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};// 2、访问第一个元素System.out.println(arr[0]); // 1// 3、访问最后一个元素// 获取数组的长度:数组名.length// 解释:arr.length会获取到数组的长度,因为下标是从0开始的,所以要减1,// 如果不减1,意思是arr[9],这就会造成数组中没有这个下标,你还要去访问,就会抛出索引越界异常System.out.println(arr[arr.length - 1]);; // 9}
}

3.2 修改数据

需求:定义一个数组,修改数组的第一个元素和最后一个元素,并打印出来

import java.util.Arrays;public class Main {public static void main(String[] args) {// 1、定义数组int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};// 2、修改第一个元素arr[0] = 11;// 3、修改最后一个元素arr[arr.length - 1] = 99;// 4、打印数组// 解释:Arrays是java提供的一个针对于数组的一个工具类,里面有很多方法// Arrays.toString(数组名):这会把数组以字符串的方式打印出来System.out.println(Arrays.toString(arr)); // [11, 2, 3, 4, 5, 6, 7, 8, 99]}
}

3.3 常见问题

数组索引越界异常:java.lang.ArrayIndexOutOfBoundsException
原因:当你访问的下标超出数组的长度时就会报出这个错误

public class Main {public static void main(String[] args) {// 1、定义数组int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};// 2、访问数组[9]的数据System.out.println(arr[9]);// Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 9 out of bounds for length 9//	at Main.main(Main.java:7)// 翻译:你有一个异常,类型是java.lang.ArrayIndexOutOfBoundsException,原因是索引9超出了数组的长度9// 在Main类中main方法第7行}
}

四、数组内存图(难点)

4.1 前置知识

我们要理解数组的内存图,要先搞明白Java内存分配中的堆、栈。

  • 堆:存储的是对象或数组,在Java中通过new关键字创建的对象都存储在堆内存中;
  • 栈:方法运行时使用的内存,比如程序的主入口main()方法运行时就会进入到方法栈中执行。

当你理解什么是堆、栈后,你还要理解什么是地址值。

public class Main {public static void main(String[] args) {// 1、定义数组int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};// 2、打印数组的地址值System.out.println(arr); // [I@4eec7777}
}
  • 解释:1. [:是指这个对象是数组类型2. I:是指数组中存放的是整数类型,D是小数类型3. @:间隔符号,没什么特殊含义4. 4eec7777:是这个对象的地址值,就是在你要使用这个数组,你就要去堆中根据这个地址值去找到这个数组再操作实际,我们会把这一整个叫地址方便一些,你只要知道4eec7777才是真实的地址值就可以了
    

4.2 执行流程

public class Main {public static void main(String[] args) {// 1、定义数组 arrint[] arr = new int[2]; // [I@4eec7777}
}
  1. 首先,栈内存会去加载main()方法,此时会将 int[] arr = [I@4eec7777 放在栈内存中
  2. 因为根据new关键字的都会在堆内存中产生,堆内存会创建一个地址值为:[I@4eec7777 的int类型的数组,此时数组的数据都是默认值,长度是2
  3. 之后的每次的操作如果要操作数组的元素的话(比如:访问数据,修改数据),会去堆内存中根据数组的地址值查询数组,然后根据下标去操作数组,产生的结果,会返回到栈内存中。

场景:我要修改arr的值,arr2会改变吗,为什么

import java.util.Arrays;public class Main {public static void main(String[] args) {// 定义数组int[] arr = new int[2]; // [I@4eec7777int[] arr2 = arr; // [I@4eec7777// 修改数组的值arr[0] = 1;// 打印两个数组System.out.println(Arrays.toString(arr)); // [1, 0]System.out.println(Arrays.toString(arr2));// [1, 0]}
}

答:会改变,因为操作的两个数组的地址是一样的


五、结语

这篇博客大概3500字左右,希望能对你有所帮助,如果有什么问题欢迎留言,我这边有时间就会回。

如果觉得我写的不错的小伙伴,可以帮我点个赞,收藏一下,如果还有什么希望我出的教程可以留言,我会参考。

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

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

相关文章

Nginx+Tomcat负载均衡、动静分离集群

目录 1.Nginx负载均衡 1.1 负载均衡概念 1.2 负载均衡原理 1.3 Nginx配置反向代理 1.3.1 反向代理概念 1.3.2 反向代理主要参数 2.Nginx动静分离 2.1 动静分离的概念 2.2 Nginx 静态处理优势 2.3 动静分离原理 3. NginxTomcat动静分离的实验设计 3.1 准备三台虚拟机…

js 选择一个音频文件,绘制音频的波形,从右向左逐渐前进。

选择一个音频文件&#xff0c;绘制波形&#xff0c;从右向左逐渐前进。 完整代码&#xff1a; <template><div><input type"file" change"handleFileChange" accept"audio/*" /><button click"stopPlayback" :…

Typora编辑的markdown文档莫名其妙消失或未保存--解决方案【亲测可行】

由于误触键盘导致文件关闭&#xff0c;打开文件之后发现里面文字全没了~气死了&#xff01;&#xff01;&#xff01;&#xff01; 可以通过如下方法解决&#xff01; 一、打开typora 二、【文件】-【偏好设置】 三、点击恢复未保存的草稿&#xff0c;找到最近的文件复制粘贴…

django 内置 JSON 字段 使用场景

Django 内置的 JSON 字段&#xff08;JSONField&#xff09;是在 Django 3.1 版本中引入的&#xff0c;用于处理 JSON 格式的数据。JSONField 允许在数据库表中存储和查询 JSON 数据&#xff0c;并且在与 Python 代码交互时自动转换为合适的 Python 数据类型。以下是一些常见的…

nignx简易安装脚本

yum -y install gcc gcc-c pcre pcre-devel gd-devel openssl openssl-devel zlib zlib-devel id nginx || useradd nginx wget http://nginx.org/download/nginx-1.16.0.tar.gz tar xzf nginx-1.16.0.tar.gz cd nginx-1.16.0/ #预编译 ./configure \ --prefix/usr/loc…

2024050302-重学 Java 设计模式《实战享元模式》

重学 Java 设计模式&#xff1a;实战享元模式「基于Redis秒杀&#xff0c;提供活动与库存信息查询场景」 一、前言 程序员&#x1f468;‍&#x1f4bb;‍的上下文是什么&#xff1f; 很多时候一大部分编程开发的人员都只是关注于功能的实现&#xff0c;只要自己把这部分需求…

Facebook商城号怎么做?思路与操作分析

2016 年&#xff0c;Facebook打造了同名平台 Facebook Marketplace。通过利用 Facebook 现有的庞大客户群&#xff0c;该平台取得了立竿见影的成功&#xff0c;每月访问量将超过 10 亿。对于个人卖家和小企业来说&#xff0c;Facebook Marketplace是一个不错的销货渠道&#xf…

动态规划实现斐波那契数列,时间复杂度和空间复杂度解析

动态规划实现斐波那契数列 代码回顾&#xff1a; #include <iostream> using namespace std;// 动态规划实现&#xff0c;时间复杂度 O(n) unsigned long long fibonacciDP(int n) {if (n < 1) return n;unsigned long long prev2 0;unsigned long long prev1 1;u…

【面试宝藏】Redis 常见面试题解析其二

Redis 高级面试题解析 20. 说说 Redis 哈希槽的机制&#xff1f; Redis 集群采用哈希槽&#xff08;Hash Slot&#xff09;机制来分布和管理数据。整个哈希空间被划分为 16384 个槽&#xff0c;每个键通过 CRC16 校验后取模映射到一个哈希槽。每个节点负责一部分哈希槽&#…

【二进制部署k8s-1.29.4】十一、metallb的安装部署

文章目录 简介 一.安装metallb二.配置metallb三.验证metallb 简介 本章节主要讲解安装metallb-v0.7.1的安装&#xff0c;metallb算是平民版的负载均衡&#xff0c;用于测试、访问量较小的情况还是比较不错的&#xff0c;但是对于请求量比较的时候&#xff0c;由于流量都集中在一…

猫熊超市管理系统

import java.util.Scanner;//增加商品类 //此类用来录入一个商品的所有属性&#xff0c;并作为结果对其返回 public class Add {public Goods add1() {Scanner scanner new Scanner(System.in);System.out.println("请输入商品名称");String name scanner.next();S…

表示学习(Representation learning)以及相关(半监督)论文阅读

引言: 这篇博客主要介绍的是表示学习(representation learning),在此基础上,研究了Circle loss这篇CVPR文章。感觉所谓的半监督,目前,在图像分类领域作用寥寥,图数据已经与图像这类数据不是一个类别了。 表示学习(Representation learning)以及相关(半监督)论文阅读…

dns域名解析服务和bond网卡

目录 dns域名解析服务 一、DNS 1、定义 2、以www.baidu.com为例 3、域名体系结构 4、DNS解析使用的协议和端口 5、dns域名解析的过程 6、dns解析的优先级 二、如何实现域名解析 1、域名解析 2、bind配置文件位置 &#xff08;一&#xff09;正向解析 &#xff08;…

fedora40上安装dotnet-sdk-6.0

电脑已经安装过vs code&#xff0c;但是在终端上执行&#xff1a;dotnet --version还是报错。 现在要重新安装dotnet-sdk-6.0 1、确保清理干净之前的安装 首先&#xff0c;移除可能的残留文件&#xff1a; sudo dnf remove dotnet-sdk-6.0 sudo rm -rf /usr/share/dotnet/ …

Python面试宝典:Python中与Pandas数据分析相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第十九章:数据处理和分析:第二节:Pandas数据分析】 第十九章:数据处理和分析第二节:Pandas数据分析1. Pandas的核心数据结构2. 创建Series和DataFrame3. 数据访问和选择4. 数据清洗5…

利他性「销售」回复话术|学会事半功倍!

【菜鸟】&#xff1a;我给你的真的已经是最低价了 【销冠】&#xff1a;现在市场竞争这么激烈&#xff0c;能给你少100我都不会给你少报1块的&#xff0c;我的目的是留下你呀&#xff0c;又怎么会傻到报高价格把你拒之门外呢 【菜鸟】&#xff1a;适合你的才是最好的产品&#…

层出不穷的大模型产品,你怎么选?

随着近日腾讯元宝APP的正式上线&#xff0c;国内大模型产品又添一员。关于接连出现的“全能“大模型AIGC产品&#xff0c;你都用过哪些呢&#xff1f;不妨来分享一下你的使用体验吧&#xff01;在这些大模型产品中&#xff0c;你更倾向于选择哪款&#xff1f; 目前&#xff0c;…

每天CTF小练--ctfshow新手村

easy_base 密文&#xff1a;0XezFWZfNXafRjNlNXYit3dvh2cmR3Y 等号在前面&#xff0c;直接倒序后解码 ctfshow{base64_is_easy} 代码解&#xff1a; s 0XezFWZfNXafRjNlNXYit3dvh2cmR3Y print(s[::-1]) #翻转字符串 print(s[::-1]) #翻转字符串 print(s[::-1]) #翻转…

线性回归模型:统计学中的预测利器

线性回归模型&#xff1a;统计学中的预测利器 线性回归模型是统计学中一种重要的预测模型&#xff0c;广泛应用于各个领域&#xff0c;如经济学、社会科学、生物学和工程学等。它基于最小二乘法原理&#xff0c;通过拟合线性关系来解释变量之间的关系&#xff0c;并预测因变量…

HarmonyOS(二十五)——Harmonyos通用事件之点击事件

组件被点击时触发的事件就是点击事件。 1.事件 名称支持冒泡功能描述onClick(event: (event?: ClickEvent) > void)否点击动作触发该回调&#xff0c;event返回值见ClickEvent对象说明。从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 2.ClickEvent对象…