从数组元素交换窥探java值传递和引用传递

MATLAB调用Java内存管理:原理、问题排查与优化实践 在混合编程中,内存管理是核心挑战之一,尤其当不同语言的内存模型交互时。MATLAB与Java的集成便是一个典型场景,涉及两套独立的内存体系:MATLAB基于mxArray的原生内存管理和JVM的堆内存管理。数据在两者间传递时,需要通过编组(Marshalling)和解组(Unmarshalling)进行转换,这一过程容易产生临时对象和隐式拷贝,从而引发内存泄漏或溢出。从工程实践角度看,理解这种交互机制对于构建稳定高效的科学计算与数据处理应用至关重要。常见问题包括循环中重复创建重量级Java对象、长期持有大型 阅读详情

近日,在复习数组排序时,定义了一个数组位置交换的wrongSwap方法,发现不可行,后来发现是java值传递和引用传递的问题。

import java.util.Arrays;
public class RankArr {

    public static void main(String[] args) {
        int[] arr = {34,11,9,0,6,78};
        int[] a = {23,312,3,44,9};
        simpleSort(arr);
        System.out.println(Arrays.toString(arr));
        bubbleSort(a);
        System.out.println(Arrays.toString(a));
    }

    public static void simpleSort(int[] arr) {

        for (int i=0;i<arr.length-1;i++) {
            for (int j=i+1;j<arr.length;j++) {
                if (arr[i]>arr[j]) {
                    swap(i,j,arr);
                }
                /*
                if (arr[i]>arr[j]) {
                    wrongSwap(arr[i],arr[j]);
                }
                */
            }
        }
    }

    public static void bubbleSort(int[] arr) {

        for (int i=0;i<arr.length-1;i++) {
            for (int j=0;j<arr.length-i-1;j++) {
                if (arr[j]>arr[j+1]) {
                    swap(j,j+1,arr);
                }
            }
        }
    }

    public static void wrongSwap(int a,int b) {
        int t = a;
        a = b;
        b = t;
    }
    public static void swap(int a,int b,int[] arr) {
        int t = arr[a];
        arr[a] = arr[b];
        arr[b] = t;
    }


}

调用wrongSwap()方法时,将数组arr其中的两个元素值作为实参传递给了方法的形参 ,这时内存的栈区创建了两个新的变量存储传递过来的值,方法中的操作实际是对这两个变量值的交换,并没有对main方法中的原数组进行操作。而swap()方法则是把main方法中的原数组引用传递过来,注意传递的是引用,而不是值,不是对象,同时把要交换的两元素下标值传递过来。然后通过引用交换数组对象两下标上的值,实现数组元素的位置互换。在这里,就引出了一个问题:java中的值传递和引用传递

在讲这个问题之前,首先要讲两组概念:
1.形参和实参:
形参:定义在方法(函数)上的参数,用来接收传递过来的实参值。
实参:出现在调用方中,可以是常量、变量、表达式和函数,但是必须被赋值。
形参在函数调用完之后在内存中被释放,形参可以接收基本数据类型值和引用:接收值时只是将原变量值复制,而引用则是将引用值(对象在内存中的虚拟首地址)传递过来,可以实现对对象的操作。

2.基本数据类型和引用类型:
基本数据类型是对一些固定存储结构数据类型的定义,是固定长度的;引用类型包括类和对象、数组、接口,引用类型较复杂,方法中创建一个引用时,此时在栈区分配了一个4byte的空间,但是还没有创建数据,当使用new运算或反射等方法创建对象时,此时就在堆区开辟空间创建数据,然后将该对象在堆内存中的虚拟首地址值赋给引用。

讲完这两组概念,其实值传递和引用传递的问题也清晰了。值传递涉及的是方法调用中基本数据类型值的传入,形参的改变并不会影响实参的改变。而引用传递是方法调用中引用的传递,并没有涉及到对象。(也有人可能会认为引用传递传递的就是引用中存储的对象堆内存地址值,但是与值传递比较值传递是将值复制一份传递,引用传递并没有复制对象,没有创建新的数据存储空间,堆内存中始终只有一个对象,从这点上看,就可以理解为什么要分为值传递和引用传递了。)然而当该引用类型值可以改变或调用了改变其自身的方法时,形参对实体对象的操作会被保存。也就是说,使用实参再次访问该对象的属性时发生了改变。

需要注意的是,某些value被final修饰的类,如String、Integer等,由于其一旦创建则不可更改,所以对形参值的改变就意味这创建了一个新的对象,而原有对象并没有改变。

我是初学者,如有错误,敬请指正!

C语言变量内存本质:从盒子比喻到内存布局的深度解析 在编程中,变量是存储数据的基本单元,其本质是程序运行时在内存中分配的一块具有特定大小和解释方式的存储区域。理解变量的内存原理是掌握C语言等系统级编程语言的关键,它直接关系到程序的正确性、性能和安全性。通过内存视角,可以清晰地解释指针、数组、函数传参等核心概念的技术价值,例如指针本质是存储地址的变量,数组名代表连续内存的首地址,函数传参是值拷贝过程。这种面向内存的思维模式,对于排查内存泄漏、野指针、数组越界等常见问题至关重要,并能有效应用于嵌入式开发、操作系统、性能优化等场景。本文借助GDB调试工具和汇编分析 阅读详情

相关推荐

RGB接口电容触摸屏驱动(一)模块介绍

RGB接口电容触摸屏驱动(一)模块介绍

杰克拉力船长个人博客 7880

java交换数组中的数据

要求:在数组中存入1,2,3,4,5,需要得到5,4,3,2,1。

weixin_58404372的博客 973

【东华大学oj】找到最大数(一维数组->中等)

一天,老师布置了一个作业,要求对一串数字各不相同的数字串进行排序,大的在前,小的在后。接着,我从数字串中的第二个数字开始往后找,找到最大的一个,然后与第二个数字交换,这样的话我就能够确定排序后数字串中的第二个数字;明明研究发现,他的这个想法中最重要的一环就是在一串数字中找到最大的那个,然后与第一个数字交换,可是明明毕竟刚刚开始学习程序设计不久,无法写出较复杂的程序,所以明明想让你这位程序设计专家帮他的忙,帮助他把这段核心程序写出来,然后明明只需模仿着写就可以了。时间限制: 1S类别: 一维数组->中等。

的博客 526

Java学习(36)方法传值——数组的传值

Java学习(36)方法传值——数组的传值

weixin_43360025的博客 1794

【论文笔记】Reaching agreement in the presence of faults (EIG)

1 问题定义 2 交互一致性 3 单点故障 m=1 n=4 4 多点故障(n&amp;gt;=3m+1) 计算过程 m=2 n=7 5 n&amp;lt;3m+1不能达成协定 6 带认证的算法 7 总结 这篇论文在1980年发表,是1982年著名的拜占庭将军问题论文的前身。作者Leslie Lamport是2013图灵奖得主,两篇论文引用次数分别为5000+和2000+。该论文提出的算法现在被...

zjwreal 2995

3个PLC进阶教程实战项目,学完立即接私单!

此处应插入清晰的硬件电路图,包含土壤湿度传感器、水泵、PLC的输入输出端子,并标注清晰的接线方式。同样的,也需要插入清晰的梯形图,用简单的逻辑表达控制过程,比如:土壤湿度传感器信号低于设定值 -> PLC输出信号 -> 水泵启动。我是老王,一个在自动化行业摸爬滚打多年的老工程师,今天咱们不聊那些枯燥的理论,直接上手三个PLC进阶实战项目,学完保证你信心满满,立马就能接私单!想想你家里的空调,它也是通过检测室温,并根据设定的温度进行制冷或制热,这个项目就是类似的原理。

qq_38220914的博客 1476

【Java入门】交换数组中两个元素的位置

主函数包含执行流程,而交换函数只负责交换数组中的元素,没有其他额外的功能,从功能上来说很清晰。例如,当我们需要对数组进行排序或者在某种算法中需要交换元素的位置。所以如果传入错误的参数(例如重复的索引或者越界的索引),可能会抛出数组越界异常。(慧函数)的注释和函数名称使得代码的目的清晰明确,对于阅读者来说易于理解。中,交换数组中的两个元素是基本的数组操作。:此代码被封装在一个类中,具有一定的结构,方便后续的维护。和长度),确保了在函数体中操作的数组是有效的,增强了健壮度。综上,从封装性和可扩展性的角度考虑,

CalEx_Tech的博客 2197

告别Mac自带终端:iTerm2 + Oh My Zsh 保姆级配置指南(含国内镜像源)

本文提供了一份详细的Mac终端优化指南,涵盖iTerm2、Oh My Zsh和Homebrew的配置流程,特别针对国内用户提供镜像源解决方案。通过安装现代化工具链和优化配置,帮助开发者打造高效、美观的终端工作环境,提升日常开发效率。

weixin_42638178的博客 401

第四章:数组的引用传递

数组的引用传递 一. 传递及返回数组 如果要向方法传递一个数组,则方法的接受参数必须是符合其类型的数组。而且数组引用属于引用数据类型,所以在把数组传递进方法之后,如果方法对数组本身做了任何修改,修改结果也将保留下来。 【向方法中传递数组】public class ArrayRefDemo01{ public static void main(String args[]){

程序猿凹凸 1562

VMware vCenter 6.7证书过期急救指南:从503报错到完美修复的全流程

本文详细解析了VMware vCenter 6.7因STS证书过期导致503报错的根本原因,并提供了一套从诊断到修复的完整实战流程。内容包括使用checksts.py脚本检测STS证书状态,通过fixsts.sh脚本更新证书,以及利用Certificate-Manager全面重置所有过期证书,帮助管理员快速恢复服务并避免常见陷阱。

weixin_29234239的博客 773

多尺度仿真软件:Copasi_(1).Copasi概述

Copasi(Complex Pathway Simulator)是一款开源的多尺度仿真软件,专为生物化学、系统生物学和合成生物学领域的研究人员设计。它不仅能够模拟细胞内和细胞间的生化反应网络,还能处理代谢途径、信号传导途径和基因调控网络等多种复杂系统。Copasi提供了用户友好的图形界面和强大的命令行接口,支持多种仿真算法和分析工具,使用户能够高效地进行模型构建、仿真和分析。Copasi允许用户创建自定义报告,以便生成特定格式的仿真结果。用户可以通过图形界面或命令行创建自定义报告。

kkchenjj的博客 857

Java中,交换数组中的两个元素位置

标题: 交换数组中的两个不同元素的位置 【解题核心】:在Java中,交换数组的两个元素下标位置,必须通 过引用来交换。而不能直接进行交换 【代码演示】: public class Swap { public static void swap(int[] a, int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } publ...

weixin_44945344的博客 1万+

【实验】ENSP 实战:酒店有线 + 无线三层组网全配置(VLAN 规划 + AC/AP+SSID 绑定)

三层架构:出口路由器 → 核心交换机 → 汇聚交换机 → 接入交换机 / AP / 终端。

jundao1997的专栏 431

C语言指针核心解析:从内存模型到实战应用

指针是C语言中实现内存直接操作的核心机制,它本质上是一个存储内存地址的变量。其工作原理是通过地址间接访问数据,这赋予了程序直接操控内存布局的能力,从而在系统编程、性能优化和底层开发中具有不可替代的技术价值。指针广泛应用于动态内存管理、数组遍历、字符串处理、函数参数传递以及构建复杂数据结构等场景。理解指针与内存模型的关系,是掌握C语言编程的关键,也是深入学习操作系统、编译原理等核心计算机科学领域的基础。本文通过剖析程序生命周期和内存布局,结合数组、字符串等实战案例,系统讲解指针的概念、原理与使用技巧,帮助读者

weixin_33937499的博客 420

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

构建高效C语言自学体系:从零到项目实战的300小时路径

编程语言学习的关键在于理解底层原理与构建工程思维。C语言作为系统编程的基石,其核心价值在于培养内存思维、过程化思维和底层交互思维,这些是理解计算机工作机制的根本。通过掌握指针、内存管理等核心概念,学习者能够深入理解数据在计算机中的存储与操作方式,从而为学习数据结构、操作系统乃至高级语言打下坚实基础。在工程实践层面,一个高效的学习路径应遵循“输入-消化-输出”的闭环,强调动手实践与项目驱动,而非被动观看教程。例如,通过使用VSCode配置C/C++开发环境,并遵循从基础语法到综合项目的阶段性练习,可以有效形成

436

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C语言学习路径:从零基础到实战应用的四阶段成长指南

编程语言是人与计算机沟通的桥梁,而C语言作为一门接近底层的系统级语言,其核心价值在于帮助开发者深入理解计算机的工作原理。从变量、函数等基础语法开始,逐步掌握程序的组织结构;进而通过指针与内存管理,理解数据在计算机中的存储与访问机制,这是实现高效编程和系统优化的关键。在工程实践中,结构体、文件操作等特性使得C语言能够构建复杂的数据模型和持久化应用。本文基于C语言学习路径和编程思维培养,系统拆解了从建立编程世界观到实现项目开发的四个关键阶段,旨在为初学者提供一条连贯、可执行的学习路线,帮助学习者跨越从语法记忆到

weixin_30263277的博客 444

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java数组交换_实现数组元素互换位置(乘机理解java参数传递)

Java中函数参数是按值传递的,在实现数组元素互换位置之前,我想先说一下Java函数参数传递过程。一般情况下我们会把参数分为基本数据类型和引用数据类型,然后分别来讲参数传递,因为他们的外在表现似乎是不同的,然而,他们的本质都是值传递。在讲值传递时,请务必将“实参的副本”这五个字刻在脑海,因为它是理解值传递的关键。// 例子1int a = 0;void value(int x) {x = 1;}...

weixin_30836221的博客 1875

【Java】数组与引用(重要)

创建数组 // 动态初始化 数据类型[] 数组名称 = new 数据类型 [长度] { 初始化数据 }; // 静态初始化 数据类型[] 数组名称 = { 初始化数据 }; 代码示例: int[] arr = new int[3]{1, 2, 3}; int[] arr = {1, 2, 3}; 注意事项: 静态初始化的时候, 数组元素个数和初始化数据的格式是一致的 使用数组 获取长度和访问元...

qq_43909184的博客 2324

Java实现两个数交换的几种方法

Java实现两个数交换的几种方法

lllwwwb的博客 1万+

数组的引用传递

本章目标掌握数组的引用传递可以使用方法接收或返回一个数组了解Java对数组操作的支持   传递及返回数组之前的方法操作传递和返回的都是基本数据类型,但是方法中也可用来传递和返回数组。如果要向方法中传递一个数组,则方法的接收参数处必须是符合其类型的数组。而且数组属于引用数据类型,所以在把数组传递进方法之后,如果方法对数组本身做了任何修改,修改结果都是会保存下来的。   向方法中传递数组 ...

chaoyv 1357

Java_题目_数组交换元素

Java_题目_数组交换元素

SisinRyu的博客 429

初识JAVA篇-深入理解数组与数组传参

数组的使用与数组如何传参,如何使用数组传参,形参与实参的区别

小扳手 549

Java实现两数交换

在Java中,因为没有地址的说法,因此无法直接通过传地址达到两数交换的效果,Java中的基本数据类型是存储在栈空间上的,而栈空间的地址是无法直接拿到的,在栈空间上存储的地址都是局部变量,当方法结束后变量就会被JVM直接回收,这也就意味着只要是存储在栈空间上的变量都无法做到两数交换。

L326214的博客 1383

Java交换数组数据

需求:定义一个数组,存入1,2,3,4,5,6,7,8,9。交换前:1,2,3,4,5,6,7,8,9。交换后:9,8,7,6,5,4,3,2,1。按照要求交换索引对应的元素。

qq_71119599的博客 485

Java中数组的反转

数组反转就是将两个对称的位置的元素进行交换,在这里提供两种实现方式: 思路一(如下图所示): 1.对称交换,所以需要两个变量来记录对称的两个位置 2.一组交换完后,左边的需要进行加1,右边的就需要进行减1 3.如果是奇数的话,当两个位置相等(min==max)就不会交换, 4.如果是偶数的话,当两个数擦肩而过的时候,即左边的跑到右边,右边的跑到左边(min&amp;amp;...

Hi_alan的博客 1923

【Java】数组上

数组的应用 应用库函数 import java.util.Arrays; 1、写一个swap函数,实现一个数组中元素之间的交换 public class Course0718 { public static void swap(int[] a, int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } //写主函数,定义一个数...

qq_44768644的博客 202
下一篇: 如何理解java继承中内存分布
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值