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
猜你喜欢
- 项目介绍springboot搭建的访客管理系统,针对高端基地做严格把控来访人员信息管理,用户后端可以设置多个管理员帐号,给予不同部门的管理层
- 1.简介使用线程池可以避免线程的频繁创建以及销毁。JAVA中提供的用于实现线程池的API:Executor、ExecutorService、
- 配置不生效的解决办法注意:如果配置不生效,则说明spring优先加载了其他配置:解决办法:添加启动参数 -Dlogging.config=c
- 本文实例为大家分享了Java操作qq邮箱发送邮件的具体代码,供大家参考,具体内容如下今天尝试了使用QQ邮箱的POP3/IMAP/SMTP/E
- 一、前言(吐槽+煽情+简介) &n
- 本文实例为大家分享了Struts2框架拦截 器实例的示例代码,供大家参考,具体内容如下在看拦截 器的小例子的前我们先来看看sturts2的原
- 一 应用规划: ※ 确定功能。 ※ 必须的界面及界面跳转的流程。
- 知识点:1.使用SQL Helper创建数据库2.数据的增删查改(PRDU:Put、Read、Delete、Update)背景知识:上篇文章
- java 请求跨域问题解决方法实例详解新建Util类,在Util中添加下面方法: /* * response请求跨域公共设置
- spinner组件有点类型于HTML中的下拉框<Select></select>的样子,让用户每次从下拉框中选取一个
- 本文实例为大家分享了Java实现简单酒店管理系统的具体代码,供大家参考,具体内容如下为某个酒店编写程序:酒店管理系统,模拟订房、退房和打印所
- timer和timertask是jdk自带的定时任务实现,无需导入第三方jar包来完成1、指定多久之后执行此任务,注意:只会执行一次publ
- 平时用到的库仓库名地址备注mavenCentralhttps://repo1.maven.org/maven2/
- 本文为大家分享了JAVA语言课程设计:连连看小游戏,供大家参考,具体内容如下1.设计内容界面中有5*10的界面,图中共有6种不同的图片,每两
- Java中有四种权限修饰符publicprotected(default)private同一个类yesyesyesyes同一个包yesyes
- java.sql.Timestamp(时间戳)继承父类:java.util.Date所有已实现的接口:Serializable, Clone
- 整理文档,java 动态增加定时任务示例,直接上代码。import org.apache.tools.ant.util.DateUtils;
- 1.概述数据库开发一直是JAVA开发的核心之一,作为现在JAVA EE的基石框架,Spring Boot自身携带了一个JDBCTemplat
- 一、说明Boost.MPI 提供了 MPI 标准(消息传递接口)的接口。该标准简化了并发执行任务的程序的开发。您可以使用线程或通过共享内存或
- 如果不知道,类的静态变量存储在那? 方法的局部变量存储在那? 赶快收藏Java内存区域主要可以分为共享内存,堆、方法区和线程私有内存,虚拟机