Java值传递之swap()方法不能交换的解决
作者:秦彬桂 发布时间:2023-11-12 20:54:50
自己写了一个Swap测试类,代码如下:
swap不能交换原生数据类型以及字符串类型。
public class Swap5
{
public static void main(String[] args)
{
// String x = "x111";
// String y = "y111";
String x = new String("x111");
String y = new String("y111");
swap(x, y);
System.out.println(x);
System.out.println(y);
}
public static void swap(String a, String b)
{
String temp = a;
a = b;
b = temp;
}
}
运行结果:java Swap5
x111
y111
疑惑:注释部分不能交换可以理解为x和y生成在字符串池中,但是String x = new String(“x111”);应该是生成在堆中,是引用对象,但为什么交换不了?
public class Swap
{
public static void main(String[] args)
{
int c = 3;
int d = 5;
swap(c, d);
System.out.println("c: " + c + " d: " + d);
}
public static void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
}
运行结果:
java Swap
c: 3 d: 5
为什么调用swap()方法后并没有交换c、d的值呢,因为java只有值传递(没有引用传递),所以其实调用swap()时是把值赋给a、b,赋完后与c、d就没什么关系,c、d还是原来的值。其实就是值传递。不理解的话回去看看值传递。
但是这样用数组改写后便可实现交换功能了:
public class Swap5
{
public static void main(String[] args)
{
int[] i = {3, 5};
swap(i);
System.out.println(i[0]);
System.out.println(i[1]);
}
public static void swap(int[] a)
{
int temp = a[0];
a[0] = a[1];
a[1] = temp;
}
}
运行结果:
5
3
总结:
引用类型才可以交换。因为原生数据类型是直接赋值,而引用类型直接赋的是地址,地址指向的是同一个对象,所以能改变。
补充知识:Java参数值传递 swap(a,b)--如何交换a、b的值
首先明白Java的数据类型分为两种:基本数据类型 和 引用数据类型
java中的参数传递机制:值传递
形参是基本数据类型的,将实参的值传递给形参的基本数据类型的变量
形参是引用数据类型的,将实参的引用类型变量的值(对象的首地址)传递给形参
二者的概念:
1)基本类型:简单数据类型是不能简化的、内置的数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数。
2)引用数据类型:Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。
Java数据类型在内存中的存储:
1)基本数据类型的存储原理:所有的简单数据类型不存在“引用”的概念,基本数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面,而Java语言里面八种数据类型是这种存储模型;
2)引用类型的存储原理:引用类型继承于Object类(也是引用类型)都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”是存储在有序的内存栈上的,而对象本身的值存储在内存堆上的;
区别:基本数据类型和引用类型的区别主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的(需要java中的栈、堆概念),
那么如何交换两个数值呢?
那么可以传递引用类型的数据,如对象或者数组,下面是传递的数组:
public class Swap5
{
public static void main(String[] args)
{
int[] i = {3, 5};
swap(i);
System.out.println(i[0]);
System.out.println(i[1]);
}
public static void swap(int[] a)
{
int temp = a[0];
a[0] = a[1];
a[1] = temp;
}
}
来源:https://blog.csdn.net/qbg291932598/article/details/69055864


猜你喜欢
- 目录1. 定义排序列数组2. 修改表头点击事件3. 修改表格排序方法4. 修改后台传参实现思路也比较简单,只需要用一个数组来存放所有排序的列
- 想要将一个项目导出为jar包,供其它项目使用,在eclipse中可以直接导出该项目为jar包,而 在AS中可以通过修改gradle才处理。接
- 预处理指令这些指令/命令不会转换为可执行代码,但会影响编译过程的各个方面;列如,可以让编译器不编译某一部分代码等。C#中主要的预处理指令#d
- C#函数式程序设计之作用域在C#中,变量的作用域是严格确定的。其本质是所有代码生存在类的方法中、所有变量只生存于声明它们的模块中或者之后的代
- 前言quarkus号称超音速亚原子JAVA为Graalvm量身定制的java堆栈,是否名副其实呢?下面就来看看真实情况如何。动手前先简单介绍
- 抽象类什么是抽象类呢?在现实生活中,我们说“人类”,我们无法对应到具体某个人,同样的,&ld
- 打注解@SpringBootTest的时候不会出现提示但是又导入了 <dependency> &nb
- 本文以实例形式详细讲述了Java的反射机制,是Java程序设计中重要的技巧。分享给大家供大家参考。具体分析如下:首先,Reflection是
- 如果所有的键都是小整数,我们可以使用一个数组来实现无序的符号表,将键作为数组的索引而数组中键 i 处存储的就是它对应的值。散列表就是用来处理
- 一、通过配置文件控制静态资源的热部署在配置文件 application.properties 中添加:#表示从这个默认不触发重启的目录中除去
- @SuppressWarnings比较常见,理解和使用起来都很简单。通过源码可以看出,支持在类、属性、方法、参数、构造方法、本地变量上使用。
- 什么是Kotlin?Kotlin是一种可以在 Java 虚拟机 (JVM) 上运行的开源编程语言。该语言可以在许多平台上运行。它是一种将面向
- 1 前言单例模式是我们经常使用的一种模式,一般来说很多资料都建议我们写成如下的模式:/** * Created by qiyei2015 o
- Android的消息机制几乎是面试必问的话题,当然也并不是因为面试,而去学习,更重要的是它在Android的开发中是必不可少的,占着举足轻重
- 主要从以下十几个方面对Hibernate做总结,包括Hibernate的检索方式,Hibernate中对象的状态,Hibernate的3种检
- 前言相信有很多小伙伴,在日常的开发中都有遇到过需要调用第三方接口的需求吧,但是自己有没有写过接口提供给第三方使用呢,常规的都是我们调用别人的
- 1) async / await使用 async / await 模式,可以在执行代码块操作的时候不会阻塞 UI 或者当前的线程。即使该操作
- 在日常工作中,我们往往只关注 Java 内存使用情况,这主要是因为 Java 内存分析相关的工具比较多。与之不同的是,图片内存分析的工具比较
- 可以用如下方法: 修改AudioYusuStreamOut.cpp,添加方法: void AudioYusuStreamOut::swS2M
- Android 中在有序广播中添加自定义权限的实例前言;有序广播说明:有序广播因为要处理消息的处理结果,所以要复杂一些。 * sendOrd