簡體   English   中英

為什么我對反轉的字符串是真的,這在 Java 中是不相等的?

[英]Why am I getting true for a reversed string, which is not equal in Java?

public class Main
{
    public static void main(String[] args) {
        StringBuilder string = new StringBuilder("abb");
        StringBuilder stringReverse = string.reverse();
    
        if(string.toString().equals(stringReverse.toString())){
            System.out.println(true);
            return;
        }
    
        System.out.println(false);
    }
}

查看此代碼在 IdeOne.com 上實時運行

我得到上面代碼的輸出為“真”。 但是反轉的字符串是'bba'。 'bba' 怎么等於 'abb'? 請有人幫我解決這個問題嗎?

StringBuilder#reverse()反轉 StringBuilder 本身中的文本(並返回相同的內容)。 打印出 string 和 stringReverse 保存的值,自己看看:

System.out.println("string: " + string);
System.out.println("stringReverse: " + stringReverse);

返回

string: bba
stringReverse: bba

更重要的是, StringBuilderAPI告訴你:

導致此字符序列被序列的反向替換。

此外, string 和 stringReverse 是同一個 object ,換句話說,這是:

System.out.println("stringReverse  == string: " + (stringReverse == string));

將打印出true

reverse()返回相同的對象(不是新的StringBuilder )。

您的代碼:

StringBuilder string = new StringBuilder("abb");
StringBuilder stringReverse = string.reverse();

等同於:

StringBuilder string = new StringBuilder("abb");
string.reverse();
StringBuilder stringReverse = string; // Same object!

由於StringBuilder是可變的,當您調用reverse您實際上是在反轉原始StringBuilder

嘗試

StringBuilder string = new StringBuilder("abb");
StringBuilder stringReverse = new StringBuilder(string).reverse();
     
System.out.println(string.toString());
System.out.println(stringReverse.toString());

前三個答案是正確的。 其中之一應該被接受。 我將添加一個關於命名重要性的小想法。

命名可能會混淆或澄清

這個問題是一個例子,說明糟糕的命名如何讓你誤入歧途。

使用string一詞命名您的第一個StringBuilder會導致人們認為該 var 引用了一個可變String對象,而實際上它引用了一個可變StringBuilder 命名像firstStringBuilder這樣的東西可以避免這個容易誤讀的問題。

StringBuilder string = new StringBuilder("abb");
//            ^^^^^^ No, this is not an immutable `String` object reference.

替代命名澄清了。

StringBuilder firstStringBuilder = new StringBuilder( "abb" );
StringBuilder reversedStringBuilder = firstStringBuilder.reverse();  // Both vars ( `firstStringBuilder` & `reversedStringBuilder` ) reference the very same single `StringBuilder` object. 

if( firstStringBuilder.toString().equals( reversedStringBuilder.toString() ) ){
    System.out.println( "firstStringBuilder & reversedStringBuilder are equal because they both point to the very same single StringBuilder object. So the result of calling `.toString` twice on the same object is the same." );
    return;
}

System.out.println( "Not equal" );

查看此代碼在 IdeOne.com 上實時運行

firstStringBuilder 和 reversedStringBuilder 是相等的,因為它們都指向同一個 StringBuilder 對象。 所以在同一個對象上調用.toString兩次的結果是一樣的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM