Java值传递之swap()方法不能交换的解决

 更新时间:2020年09月28日 14:14:39   作者:秦彬桂  
这篇文章主要介绍了Java值传递之swap()方法不能交换的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

自己写了一个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;
  }
}

以上这篇Java值传递之swap()方法不能交换的解决就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java多线程入门知识及示例程序

    java多线程入门知识及示例程序

    java多线程入门知识及示例程序,大家参考使用吧
    2013-12-12
  • Mybatis 逆向工程的三种方法详解

    Mybatis 逆向工程的三种方法详解

    这篇文章主要介绍了Mybatis 逆向工程的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 为zookeeper配置相应的acl权限

    为zookeeper配置相应的acl权限

    这篇文章主要介绍了为zookeeper配置相应的acl权限的相关实例,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • IDEA中Directory创建多级目录的实现

    IDEA中Directory创建多级目录的实现

    本文主要介绍了IDEA中Directory创建多级目录的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java Socket实现UDP编程浅析

    Java Socket实现UDP编程浅析

    类 DatagramSocket 何 DatagramPacket(数据包/数据报) 实现了基于 UDP协议网络程序;UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证 UDP数据报一定能够安全送达目的地,也不确定什么时候可以抵达
    2022-11-11
  • springboot中Excel文件下载踩坑大全

    springboot中Excel文件下载踩坑大全

    本文主要介绍了springboot中Excel文件下载,但是却容易遇到很多坑,文中通过示例代码介绍的非常详细,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • feign如何打印出http请求

    feign如何打印出http请求

    这篇文章主要介绍了feign如何打印出http请求,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • java算法实现红黑树完整代码示例

    java算法实现红黑树完整代码示例

    这篇文章主要介绍了java算法实现红黑树完整代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Spring定时任务中@PostConstruct被多次执行异常的分析与解决

    Spring定时任务中@PostConstruct被多次执行异常的分析与解决

    这篇文章主要给大家介绍了关于Spring定时任务中@PostConstruct被多次执行异常的分析与解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • Spring中的事务管理及实现方式解析

    Spring中的事务管理及实现方式解析

    这篇文章主要介绍了Spring中的事务管理及实现方式解析,Spring事务管理基于底层数据库本身的事务处理机制,数据库事务的基础,是掌握Spring事务管理的基础,这篇总结下Spring事务,需要的朋友可以参考下
    2024-01-01

最新评论