1. 程式人生 > 程式設計 >Java值傳遞之swap()方法不能交換的解決

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值傳遞之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;
  }
}

以上這篇Java值傳遞之swap()方法不能交換的解決就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。