string java操作




Java賦值運算符執行 (6)

Reimus給出了正確的答案,但我想詳細說明。

在Java(和大多數語言)中,約定是左邊的變量,右邊是賦值。

讓我們分解一下:

String x = "hello";
//x <- "hello"

String y = "goodbye";
//y <- "goodbye";

出於調試目的以及代碼可讀性,將行分開以便它們只做一件事總是一個好習慣。

System.out.println(x.equals(x = y)); //Compound statement

這裡, x.equals(...) 在x的原始引用上調用,或者“hello”,它被更新為第二個引用。

我會寫這個(這會給你你預期的答案):

x = y;
// x <- y = "goodbye"

boolean xEqualsX = x.equals(x);
// xEqualsX <- true

System.out.println(xEqualsX);
// "true"

現在看來它應該表現得很明顯,但是也很容易看出每一行中到底發生了什麼,這是你應該努力的。

在Java中,我理解賦值求值為右操作數的值,因此 x == (y = x) 等語句的求值為 true

但是,此代碼輸出 false

public static void main(String[]args){
    String x = "hello";
    String y = "goodbye";
    System.out.println(x.equals(x = y));
}

為什麼是這樣? 在我的理解中,它首先評估 (x = y) ,它將 x 的值賦值給 x ,然後返回 y 的值。 然後評估 x.equals(y) ,這應該是 true 因為 xy 現在應該共享相同的引用,但相反,我得到了 false

這裡發生了什麼?


在java中String是一個類。

String x = "hello";
String y = "goodbye"; 

是一個兩個不同的字符串,它引用兩個不同的值,如果你比較則不相同

 System.out.println(x.equals(x = y)); 
//this compare value (hello and goodbye) return true

    System.out.println(x == (y = x)); 
// this compare reference of an object (x and y) return false  

它是看x.equals(將x指定為y,總是返回true)所以基本上是x.equals(true)


我在eclipse中嘗試過你的問題你的兩個表達都是正確的。 1)x ==(y = x)求值為真它是真的因為x的值賦給y'是'hello'然後x和y比較它們會相同所以結果將為真

2)x.equal(x = y)它是假的,因為y的值賦值給x然後x和x比較它們的值會不同所以結果將是假的


括號中的 x=y 表示表達式 (x=y) 現在是 goodbye ,而 x.equals 的外部x保持值 hello


重要的是要記住java中的 String 是一個對象,因此是一個引用。 你打電話的時候

x.equals(...)

它正在檢查當前由 x 引用的位置的值是否等於您傳入的值。在內部,您正在更改 x 引用 的值,但您仍然使用 原始 引用調用 equals (對“hello”的引用“)。 所以,現在你的代碼正在比較,看看“你好”是否等於“再見”,這顯然不是。 在此之後,如果再次使用 x ,將導致引用與y相同的值。





assignment-operator