![](/img/trans.png)
[英]Why am i getting Assert Not Equal from the Mock Server in 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);
}
}
我得到上面代碼的輸出為“真”。 但是反轉的字符串是'bba'。 'bba' 怎么等於 'abb'? 請有人幫我解決這個問題嗎?
StringBuilder#reverse()
反轉 StringBuilder 本身中的文本(並返回相同的內容)。 打印出 string 和 stringReverse 保存的值,自己看看:
System.out.println("string: " + string);
System.out.println("stringReverse: " + stringReverse);
返回
string: bba
stringReverse: bba
更重要的是, StringBuilder的API告訴你:
導致此字符序列被序列的反向替換。
此外, 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" );
firstStringBuilder 和 reversedStringBuilder 是相等的,因為它們都指向同一個 StringBuilder 對象。 所以在同一個對象上調用
.toString
兩次的結果是一樣的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.