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值传递之swap()方法不能交换的解决

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

标签:Java,值传递,swap
0
投稿

猜你喜欢

  • Android四大组件之broadcast广播使用讲解

    2023-07-27 12:41:50
  • Android中通知Notification使用实例(振动、灯光、声音)

    2021-09-28 20:00:01
  • Java数据结构之双向链表图解

    2023-02-07 10:07:22
  • 浅谈Java中的Queue家族

    2021-12-23 08:36:49
  • java音乐播放器实现代码

    2022-08-29 08:41:22
  • C#读取或设置ScrollLock状态的方法

    2023-03-14 21:41:24
  • Java Spring的refresh方法你知道吗

    2023-07-08 11:53:18
  • 使用android-apktool来逆向(反编译)APK包方法介绍

    2022-03-19 14:15:51
  • Java实现的读取资源文件工具类ResourcesUtil实例【可动态更改值的内容】

    2022-01-15 17:27:12
  • C# 基于udp广播收集局域网类所有设备信息

    2022-04-28 00:17:23
  • C#使用WebClient实现上传下载

    2022-04-22 21:46:31
  • 详解JAVA类加载机制

    2023-11-08 04:05:16
  • Java基础教程之包(package)

    2021-11-01 01:53:19
  • java mybatis如何操作postgresql array数组类型

    2023-04-25 22:59:37
  • JavaWeb详细讲述Cookie和Session的概念

    2022-03-23 08:39:44
  • Android刮刮卡功能具体实现代码

    2021-08-06 04:12:24
  • Java8特性使用Function代替分支语句

    2021-09-05 07:29:09
  • C#通过流写入一行数据到文件的方法

    2023-08-22 13:04:08
  • Java函数式编程(八):字符串及方法引用

    2022-05-02 22:28:23
  • SpringMVC使用@PathVariable接收参数过程解析

    2021-09-03 20:52:41
  • asp之家 软件编程 m.aspxhome.com