溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java值傳遞之swap()方法不能交換怎么解決

發(fā)布時(shí)間:2020-10-30 17:01:22 來源:億速云 閱讀:127 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)Java值傳遞之swap()方法不能交換怎么解決,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

自己寫了一個(gè)Swap測(cè)試類,代碼如下:

swap不能交換原生數(shù)據(jù)類型以及字符串類型。

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;
 }
}

運(yùn)行結(jié)果:java Swap5

x111

y111

疑惑:注釋部分不能交換可以理解為x和y生成在字符串池中,但是String x = new String(“x111”);應(yīng)該是生成在堆中,是引用對(duì)象,但為什么交換不了?

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;
 }
}

運(yùn)行結(jié)果:

java Swap

c: 3 d: 5

為什么調(diào)用swap()方法后并沒有交換c、d的值呢,因?yàn)閖ava只有值傳遞(沒有引用傳遞),所以其實(shí)調(diào)用swap()時(shí)是把值賦給a、b,賦完后與c、d就沒什么關(guān)系,c、d還是原來的值。其實(shí)就是值傳遞。不理解的話回去看看值傳遞。

但是這樣用數(shù)組改寫后便可實(shí)現(xiàn)交換功能了:

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;
 }
}

運(yùn)行結(jié)果:

5

3

總結(jié):

引用類型才可以交換。因?yàn)樵鷶?shù)據(jù)類型是直接賦值,而引用類型直接賦的是地址,地址指向的是同一個(gè)對(duì)象,所以能改變。

補(bǔ)充知識(shí):Java參數(shù)值傳遞 swap(a,b)--如何交換a、b的值

首先明白Java的數(shù)據(jù)類型分為兩種:基本數(shù)據(jù)類型 和 引用數(shù)據(jù)類型

Java值傳遞之swap()方法不能交換怎么解決

java中的參數(shù)傳遞機(jī)制:值傳遞

形參是基本數(shù)據(jù)類型的,將實(shí)參的值傳遞給形參的基本數(shù)據(jù)類型的變量

形參是引用數(shù)據(jù)類型的,將實(shí)參的引用類型變量的值(對(duì)象的首地址)傳遞給形參

二者的概念:

1)基本類型:簡(jiǎn)單數(shù)據(jù)類型是不能簡(jiǎn)化的、內(nèi)置的數(shù)據(jù)類型、由編程語言本身定義,它表示了真實(shí)的數(shù)字、字符和整數(shù)。

2)引用數(shù)據(jù)類型:Java語言本身不支持C++中的結(jié)構(gòu)(struct)或聯(lián)合(union)數(shù)據(jù)類型,它的復(fù)合數(shù)據(jù)類型一般都是通過類或接口進(jìn)行構(gòu)造,類提供了捆綁數(shù)據(jù)和方法的方式,同時(shí)可以針對(duì)程序外部進(jìn)行信息隱藏。

Java數(shù)據(jù)類型在內(nèi)存中的存儲(chǔ):

1)基本數(shù)據(jù)類型的存儲(chǔ)原理:所有的簡(jiǎn)單數(shù)據(jù)類型不存在“引用”的概念,基本數(shù)據(jù)類型都是直接存儲(chǔ)在內(nèi)存中的內(nèi)存棧上的,數(shù)據(jù)本身的值就是存儲(chǔ)在??臻g里面,而Java語言里面八種數(shù)據(jù)類型是這種存儲(chǔ)模型;

2)引用類型的存儲(chǔ)原理:引用類型繼承于Object類(也是引用類型)都是按照J(rèn)ava里面存儲(chǔ)對(duì)象的內(nèi)存模型來進(jìn)行數(shù)據(jù)存儲(chǔ)的,使用Java內(nèi)存堆和內(nèi)存棧來進(jìn)行這種類型的數(shù)據(jù)存儲(chǔ),簡(jiǎn)單地講,“引用”是存儲(chǔ)在有序的內(nèi)存棧上的,而對(duì)象本身的值存儲(chǔ)在內(nèi)存堆上的;

區(qū)別:基本數(shù)據(jù)類型和引用類型的區(qū)別主要在于基本數(shù)據(jù)類型是分配在棧上的,而引用類型是分配在堆上的(需要java中的棧、堆概念),

那么如何交換兩個(gè)數(shù)值呢?

那么可以傳遞引用類型的數(shù)據(jù),如對(duì)象或者數(shù)組,下面是傳遞的數(shù)組:

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;
  }
}

關(guān)于Java值傳遞之swap()方法不能交換怎么解決就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI