关于JAVA方法中数组的思考

C#上位机案例:西门子S7协议通信+实时曲线显示(WinForm+ZedGraph) 创建/// PLC数据模型(对应DB1块)/// 采集时间(用于曲线的X轴)set;/// 温度值(℃)set;/// 压力值(MPa)set;/// PLC通信状态set;西门子S7协议通信和实时曲线显示,也是工控现场最常见的场景之一。整个开发过程的关键不在于“写出代码”,而在于“写出符合工控场景的稳定代码”——比如解耦通信逻辑与界面逻辑、处理跨线程问题、限制数据点数量、释放资源等。新手在学习时,建议先跟着步骤搭建好环境,跑通基础功能,再逐步尝试进阶优化。需要注意的是,工控上位机的核心是。 阅读详情

今天做一道leetcode题目时,出现了一个错误,就是在方法中修改了数组,但是在主方法中数组没有改变。我自己写了几段代码测试了一下,发现了这么一个问题,平时的数组传递的是一个地址,但是其实在方法的参数中还是一个形参,只是指向了内存中的数组,所以在修改数组的值时需要注意一个问题,就是不要将形参的引用指向别的地址。这么说可能有点抽象,上图~

就是方法的参数,传递的其实是一个地址,此时方法中的参数还是指向内存中的数组的,但是如果给这个形参指向一个新的数组,他的引用就会指向别的数组

而单个改变数组中的值就像下面这样

这样一来就不会改变形参的引用,从而达到改变原数组的目的,下面代码验证一下

public class EveryDay{
	public static void main(String[] args) {
		//定义一个数组
		int arrs[]= {1,2,3,4,5,6};
		//调用第一种方法,即改变引用指向的方法
		arrayTestOne(arrs);
		//输出一样,结果为123456,说明原数组没有改变
		for(int i=0;i<arrs.length;i++)
			System.out.print(arrs[i]);
		System.out.println();
		//调用第二种方法,即改变引用中的数值
		arrayTestTwo(arrs);
		//输出000000,说明原数组改变了
		for(int i=0;i<arrs.length;i++)
			System.out.print(arrs[i]);
	}
	//第一种方法,先开辟一块内存存放新的内容,然后给形参赋值
	public static void arrayTestOne(int[] arrs) {
		int[] temp = {0,0,0,0,0,0};
		arrs=temp;
	}
	//第二种方法,依次修改数组的值
	public static void arrayTestTwo(int[] arrs) {
		for(int i=0;i<arrs.length;i++) {
			arrs[i]=0;
		}
	}
}

这样可以明显看出形参的指向在第一种方法中发生了改变,第二种方法只是修改了指向内容的值,所以原数组也发生了改变。

可能这样大家都比较清楚数组的引用什么时候发生了改变,但是还有一个比较具有迷惑性的用法,需要注意一下。

public class EveryDay{
	public static void main(String[] args) {
		//定义一个字符数组
		char[] chars = {'1','2','3','4','5','6'};
		//调用第一种方法,即改变引用指向的方法
		arrayTestOne(chars);
		//输出一样,结果为123456,说明原数组没有改变
		for(int i=0;i<chars.length;i++)
			System.out.print(chars[i]);
		System.out.println();
		//调用第二种方法,即改变引用中的数值
		arrayTestTwo(chars);
		//输出000000,说明原数组改变了
		for(int i=0;i<chars.length;i++)
			System.out.print(chars[i]);
	}
	//第一种方法,先开辟一块内存存放新的内容,然后给形参赋值
	public static void arrayTestOne(char[] arrs) {
		String temp = "000000";
		arrs=temp.toCharArray();
	}
	//第二种方法,依次修改数组的值
	public static void arrayTestTwo(char[] arrs) {
		for(int i=0;i<arrs.length;i++) {
			arrs[i]='0';
		}
	}
}

在上面的例子中,我是调用的字符串的toCharArray()方法,查看源码

/**
     * Converts this string to a new character array.
     *
     * @return  a newly allocated character array whose length is the length
     *          of this string and whose contents are initialized to contain
     *          the character sequence represented by this string.
     */
    public char[] toCharArray() {
        // Cannot use Arrays.copyOf because of class initialization order issues
        char result[] = new char[value.length];
        System.arraycopy(value, 0, result, 0, value.length);
        return result;
    }

可以发现,他是先在内存中开辟了一块空间存放新的数组,然后将数组的地址引用返回,所以如果使用toCharArray方法的话,会将形参的引用指向改变,从而导致无法修改原数组的值,所以以后使用java的原生方法时要注意这点。另外,由此我们可以理解为什么java在方法中无法改变原来的字符串,因为java中string类型的字符串是不可改变的,也就是说,你无法单独改变string中的单个元素的值,只能新开辟一块内存来存放改变后的字符串,形参也因此改变,如果我们想改变string类型的字符串的话,建议将方法的返回值改为string类型,并赋给原字符串,这样原来的字符串就改变了。好了,本次思考到此结束,在思考下去我就要植发了,hh~

ps:本次思考为单纯的个人想法,如有错误之处,恳请指正

【算法】克里金kriging参数值预测模型 模型中特征值2个,目标值1个,data数据集如图所示。搭建kriging参数值预测模型。 阅读详情

相关推荐

KITTI数据集下载及解析

KITTI数据集下载及解析 版本 更新时间 更新内容 作者 1 V 1.0 xxx 完成主体内容 W. Xiao 2 文章目录KITTI Dataset1 简介1.1 数据采集平台1.2 坐标系2 数据解析2.1 image文件2.2 velodyne文件2.3 calib文件2.4 label文件3 KITTI可视...

u013086672的博客 5万+

数组在方法中的运用

数组在方法中 1. 定义方法,求出指定元素在数组中出现的次数. 2. 定义方法,统计数组中出现次数为1的元素一共有多少个。(推荐-遍历数组,然后调用第一个方法,求出数组中每个元素在数组中出现的次数,如果只出现了一次,就统计) 3. 在main方法中定义数组,如int arr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};。然后调用方...

xiaoyaGrace的博客 381

告别水印!Vue3项目集成Stimulsoft.Reports.js完整配置与激活指南

本文详细介绍了如何在Vue3项目中集成Stimulsoft.Reports.js,提供从授权策略到性能优化的完整解决方案。通过模块化架构设计和现代化引入方式,帮助开发者高效实现专业级报表功能,同时避免版权风险和水印问题,特别适合中小型项目需求。

weixin_33701294的博客 431

Java数组的使用和方法

for循环是可以拿到数组下标的,for-each拿不到数组下标,所以for-each只能够全部遍历,无法对数组元素进行修改或进行操作.注意数组的每一元素都有其对应的下标,下标从0开始,想找到这个数组中的某个数据,是通过数组的下标来进行访问的。数组下标从0开始,范围是[0,arr.length),为左闭右开区间,或者[0,arr.length-1]尤其对于二维数组而言,无非就是一个一维数组,只不过该一维数组中的每一个元素是另一个。无论是二维数组,还是多维数组,它们本身就是一个一维数组。...

HAN&BLOG 5242

提高RFID检测距离以及检测速度的方法总结

摘要:提高RFID检测距离需优化阅读器功率、标签灵敏度、天线设计及频段选择,同时减少环境干扰;提升检测速度则需改进防碰撞算法、增强并行处理能力、精简数据传输。实际应用需平衡两者关系,如物流仓储采用UHF频段、高增益天线和动态Q算法实现远距离高速读取,ETC系统则通过微波频段和高速调制实现超远距离快速识别。不同场景需针对性优化硬件配置和系统参数。

start_up_go的博客 292

等保测评-达梦数据库

一般适用于等保测评

m0_54146694的博客 1297

Java数组(这一篇就够了)(超详细)

文字定义:数组是一种数据结构,用于存储多个相同类型的数据。java中 "类型[ ]" 即数组,并且索引下标从0开始。

m0_73158088的博客 3万+

端侧 AI 落地避坑指南(中):为什么 QAT 救不了精度?——对齐“融合后算子“的硬件物理约束

在上一篇文章中,我们深入探讨了量化的本质,并得出结论:QAT(量化感知训练)是保持精度的关键。明明做了 QAT,精度还是崩塌了!让我们看一个真实的案例:✅ 使用了✅ 配置了量化✅ 训练了 50 个 epoch,学习率降为原来的 1/10✅ 冻结了 BN 统计量FP32 模型:mAP = 0.85QAT 后 FP32:mAP = 0.84(正常)工具量化后:mAP = 0.68(崩塌!问题出在哪里?层融合(Layer Fusion)机制。

weixin_51988935的博客 55

Java 数组常用方法大全

注意:此处的(,)也算一个字符串 一维数组的创建方法: 方法一: 使用如下: String[] arr; arr = new String[5]; 方法二: 使用如下: int[] arr = new int[6]; 方法三: 使用如下: int[] arr={1,5,6,8,2,3,7}; 二维数组的创建方法: 方法一: 使用如下: int[][] arr = new int[5][3]; // 包含5个一维数组,每个一维数组的长度为3 int arr = new int[5][3]; arr[1]

weixin_51958247的博客 2万+

PNETLab 镜像包官方下载太慢?不急,最新版本PNET_4.2.10分享!

你好,这里是网络技术联盟站,我是瑞哥。PNETLab是一个强大的网络仿真工具平台,全称Packet Network Emulator Tool Lab。它不仅允许用户进行深入的网络实验,还支持社区成员之间的实验室共享。PNETLab致力于为学习者、教师以及网络工程师提供一个全面的实验环境,以便于他们能够在实际部署前测试和验证网络配置和协议。和。这两个部分相辅相成,共同构成了一个全面且灵活的网络仿真生态系统。

网络技术联盟站 4472

深度学习在移动开发中的应用:实时姿态估计实战

我们将使用TensorFlow Lite框架,结合专为移动端优化的MoveNet模型,实现一个能够在主流Android设备上达到30FPS的多人姿态跟踪解决方案,并深入探讨其优化技巧和实际应用场景。特别是3D姿态估计、多人长期跟踪等前沿技术的发展,将进一步推动移动端姿态估计技术的应用深度和广度。在下一篇文章中,我们将探讨深度学习在移动端的另一个创新应用:实时手势识别,包括如何在资源受限的环境中实现复杂手势的实时识别,以及这项技术在AR/VR交互、智能家居控制等场景中的应用。第四部分:典型应用场景实现。

Programming Talk 325

Java数组的三种声明方式

具体的细节大家可以不用先去了解,这涉及到很多知识,只要记住输出的时候,先导包,然后再利用Arrays.toString(arr)输出就行了。如:先定义好一个长度为4的新数组,此时数组为空,使用arr[ ]数组下标来进行逐个赋值。那我们定义好数组之后,就理所应当的对声明好的数组进行赋值。那么对于未涉及过编程的小伙伴,看到这可能会蒙了。原因就是我们sout(arr)时,输出的是这个数据的内存地址,而不是真实的数据。使用数组: 只需要一个变量,然后数组中存很多的数据, 其实可以把数组想成 一个容器。

qq_43842093的博客 1558

[Unity开发] [PICO]避坑指南:PICO商店上传APP时PXR Platform APPID设定详解

PICO开发者上传Unity应用时常见的"APPID不符"问题,主要源于混淆了开发者后台两个不同位置的APPID。

每日出拳老爷子的博客 556

有关JVM处理Java数组方法的思考

在Java中,获取数组的长度和String的长度是两种不同的方法,这引起了本文作者的一番思考。本文从JVM的角度,探讨了Java数组在JVM中是什么对象,有哪些成员,以及声明方法。 作者:jarfield来源:JavaEye博客|2010-01-08 09:30 移动端 收藏 分享 本文来自jarfield的博客,原文标题为《为什么如此获取Java数组的长...

a944145054的博客 93

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JVM处理Java数组方法的思考

在Java中,获取数组的长度和String的长度是两种不同的方法,这引起了本文作者的一番思考。本文从JVM的角度,探讨了Java数组在JVM中是什么对象,有哪些成员,以及声明方法。

kobejayandy的专栏 1751

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

[转]有关JVM处理Java数组方法的思考

在Java中,获取数组的长度和String的长度是两种不同的方法,这引起了我的一番思考。本文从JVM的角度,探讨了Java数组在JVM中是什么对象,有哪些成员,以及声明方法。      记得有人问我:“为什么获取数组的长度用.length(成员变量的形式),而获取String的长度用.length()(成员方法的形式)?”      我当时一听,觉得问得很有道理。做同样一件事情,为什么...

icanfly20000的博客 164

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

读《有关JVM处理Java数组方法的思考》记录

本来想转载的,结果比较懒,就直接用链接了。有关JVM处理Java数组方法的思考==================================================了解:1、数组并不存在于任何一个Java包中。2、数组是由jvm创建的。 [I, [[I ,  [[[I  , 分别是一维,二维,三维数组。3、数组获取长度的方法, arr.length. ---为啥?  因为通过编译器通...

阳光灿烂的中午 335

笔记-Java基础语法-数组、数组应用

(1)数组:存储同一种数据类型的多个元素的容器 (2)特点:每一个元素都有编号,从0开始,最大编号是长度-1。 编号 的专业教法:索引 (3)定义格式 A:数据类型[] 数组名; B:数据类型 数组名[]; 推荐使用A方式,B方法就忘了吧 但是要能看懂 (4)数组的初始化 A:动态初始化 只给长度,系统给出默认值 举例:int[] arr = new int[3]; B:静态初始化 给出值,系统决定长度 举例:int[] arr = new int[]{1,2,3}; 简化版:

qq_28523741的博客 1347

java基础语法(下)

1:方法(掌握) (1)方法:就是完成特定功能的代码块。 注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法。 (2)格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) { 方法体语句; re...

qq_37080458的博客 136
上一篇: 题解: 矩阵置零(73)
下一篇: 题解: 独特的电子邮件地址(929)
CSwhit
博客等级 码龄11年 19粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值