服务器之家

服务器之家 > 正文

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

时间:2020-09-29 00:53     来源/作者:秦彬桂

自己写了一个Swap测试类,代码如下:

swap不能交换原生数据类型以及字符串类型。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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”);应该是生成在堆中,是引用对象,但为什么交换不了?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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还是原来的值。其实就是值传递。不理解的话回去看看值传递。

但是这样用数组改写后便可实现交换功能了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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中的栈、堆概念),

那么如何交换两个数值呢?

那么可以传递引用类型的数据,如对象或者数组,下面是传递的数组:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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()方法不能交换的解决就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qbg291932598/article/details/69055864

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址 2020-08-12
最新idea2020注册码永久激活(激活到2100年)
最新idea2020注册码永久激活(激活到2100年) 2020-07-29
返回顶部