length - java string用法




Java String.equals與== (14)

與Jorman見面

約曼是一個成功的商人,擁有2間房屋。

但其他人不知道。

這是同一個約曼嗎?

當你從麥迪遜或伯克街道問鄰居時,這是他們唯一可以說的:

單獨使用住所,很難確認它是否是同一個Jorman。 由於它們是2個不同的地址,因此假設這些人是2個不同的人是很自然的。

這就是操作符==行為。 所以它會說datos[0]==usuario是錯誤的,因為它只是比較地址

救援調查員

如果我們派了一名調查員呢? 我們知道這是同一個Jorman,但我們需要證明它。 我們的偵探將密切關注所有物理方面。 經過徹底的調查,代理人將能夠確定是否是同一個人。 讓我們看看它發生在Java術語。

以下是String的equals()方法的源代碼:

它通過字符比較字符串,以得出他們確實是平等的結論。

這就是String equals方法的行為。 所以datos[0].equals(usuario)將返回true,因為它執行邏輯比較

這個問題在這裡已經有了答案:

這段代碼將一個字符串分隔成一個標記並將它們存儲在一個字符串數組中,然後將一個變量與第一個房屋進行比較......為什麼它不起作用?

public static void main(String...aArguments) throws IOException {

    String usuario = "Jorman";
    String password = "14988611";

    String strDatos = "Jorman 14988611";
    StringTokenizer tokens = new StringTokenizer(strDatos, " ");
    int nDatos = tokens.countTokens();
    String[] datos = new String[nDatos];
    int i = 0;

    while (tokens.hasMoreTokens()) {
        String str = tokens.nextToken();
        datos[i] = str;
        i++;
    }

    //System.out.println (usuario);

    if ((datos[0] == usuario)) {
        System.out.println("WORKING");
    }
}

==運算符是一個簡單的值比較。
對於對象引用,(值)是(引用)。 所以如果x和y引用同一個對象,x == y將返回true。


.equals()將檢查兩個字符串是否具有相同的值並返回boolean值,因為==運算符會檢查兩個字符串是否是同一個對象。


==測試引用相等。

.equals()測試值是否相等。

因此,如果你真的想測試兩個字符串是否具有相同的值,你應該使用.equals() (除非在一些情況下,你可以保證具有相同值的兩個字符串將由同一個對象表示,例如: String interning )。

==用於測試兩個字符串是否是相同的Object

// These two have the same value
new String("test").equals("test") ==> true 

// ... but they are not the same object
new String("test") == "test" ==> false 

// ... neither are these
new String("test") == new String("test") ==> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" ==> true 

// concatenation of string literals happens at compile time resulting in same objects
"test" == "te" + "st"  ==> true

// but .substring() is invoked at runtime, generating distinct objects
"test" == "!test".substring(1) ==> false

需要注意的是==equals() (一個指針比較而不是一個循環)便宜得多,因此,在適用的情況下(即,你可以保證你只處理interned字符串),它可以呈現出重要的性能提升。 但是,這些情況很少。


a==b

比較參考,而不是值。 ==與對象引用的用法通常僅限於以下內容:

  1. 比較一下引用是否為null

  2. 比較兩個枚舉值。 這是有效的,因為每個enum常量只有一個對象。

  3. 你想知道兩個引用是否屬於同一個對象

"a".equals("b")

比較相等的值。 由於此方法在Object類中定義,所有其他類都從中派生,因此它會自動為每個類定義。 但是,除非類重寫它,否則它不會對大多數類進行智能比較。 它已被大多數Java核心類以有意義的方式定義。 如果它沒有為(用戶)類定義,則它的行為與==相同。


equals()函數是Object類的一個方法,應該被程序員覆蓋。 String類重寫它來檢查兩個字符串是否相等,即在內容中而不是引用。

==運算符檢查兩個對象的引用是否相同。

考慮這些程序

String abc = "Awesome" ;
String xyz =  abc;

if(abc == xyz)
     System.out.println("Refers to same string");

這裡的abcxyz ,都是指相同的String "Awesome" 。 因此表達式(abc == xyz)true

String abc = "Hello World";
String xyz = "Hello World";

if(abc == xyz)
    System.out.println("Refers to same string");
else
    System.out.println("Refers to different strings");

if(abc.equals(xyz))
     System.out.prinln("Contents of both strings are same");
else
     System.out.prinln("Contents of strings are different");

這裡abcxyz是兩個不同的字符串,其內容相同,為"Hello World" 。 因此,這裡的表達式(abc == xyz)false ,其中as (abc.equals(xyz))true

希望你了解==<Object>.equals()之間的區別

謝謝。


使用string.equals(Object other)函數比較字符串,而不是==運算符。

該函數檢查字符串的實際內容, ==運算符檢查對象的引用是否相等。 請注意,字符串常量通常是“interned”的,這樣兩個具有相同值的常量實際上可以與==進行比較,但最好不要依賴它。

if (usuario.equals(datos[0])) {
    ...
}

注意:比較是在'usuario'上完成的,因為在你的代碼中保證非null,儘管你仍然應該檢查你在datos數組中實際上是否有一些令牌,否則你會得到一個數組超出範圍例外。


使用分割而不是分詞器,它肯定會為Eg提供精確的輸出:

string name="Harry";
string salary="25000";
string namsal="Harry 25000";
string[] s=namsal.split(" ");
for(int i=0;i<s.length;i++)
{
System.out.println(s[i]);
}
if(s[0].equals("Harry"))
{
System.out.println("Task Complete");
}

之後,我相信你會得到更好的結果.....


如果要比較字符串的任何指定值(即基本字符串),則“==”和.equals都可以使用,但對於新的字符串對象,只能使用.equals,而這裡“==”不起作用。

例:

String a = "name";

String b = "name";

if(a == b)(a.equals(b))將返回true。

String a = new String("a");

在這種情況下, if(a == b)將返回false

所以最好使用.equals運算符......


您應該使用string equals來比較兩個字符串是否相等,而不是運算符==,它只是比較引用。


有人在更高的帖子中說==用於int並用於檢查空值。 它也可以用來檢查布爾運算和字符類型。

要小心,並仔細檢查你使用的是字符而不是字符串。 例如

    String strType = "a";
    char charType = 'a';

對於字符串,你會檢查這將是正確的

    if(strType.equals("a")
        do something

    if(charType.equals('a')
        do something else

將是不正確的,你需要做到以下幾點

    if(charType == 'a')
         do something else

注意在某些情況下,使用“==”運算符可能會導致預期的結果,因為java處理字符串的方式 - 字符串文字在編譯過程中被實現(參見String.intern() ) - 因此當您為例如兩個類中的"hello world" ,並將這些字符串與“==”進行比較,您可以得到結果:true,這是根據specification預期的; 當你比較相同的字符串時(如果它們具有相同的值),當第一個字符串字面量(即通過"i am string literal"定義),第二個是在運行時期間構建的。 與“新”關鍵字像new String("i am string literal")== (相等)運算符返回false,因為他們都是不同的String類的實例。

只有正確的方法是使用.equals() - > datos[0].equals(usuario) ==只有在兩個對==對象的同一個實例時(即,具有相同的內存地址)

更新日期 :01.04.2013我更新了這篇文章,其中有些評論是正確的。 最初我宣布實習(String.intern)是JVM優化的副作用。 儘管它確實節省了內存資源(這就是我所說的“優化”),但它主要是語言的特徵


通常, .equals用於對像比較,您想驗證兩個對像是否具有相同的值。

==用於參考比較(兩個對像是堆上的同一Object )並檢查對像是否為空。 它也用於比較原始類型的值。


The == operator checks if the two references point to the same object or not.
.equals() checks for the actual string content (value).

請注意,.equals()方法屬於Object類(所有類的超類)。 您需要按照您的類需求來覆蓋它,但對於字符串,它已經實現並檢查兩個字符串是否具有相同的值。

Case1)
String s1 = "";
String s2 = "";
s1 == s1;      // true
s1.equals(s2); // true
Reason: String literals created without null are stored in the string pool in the permgen area of the heap. So both s1 and s2 point to the same object in the pool.
Case2)
String s1 = new String("");
String s2 = new String("");
s1 == s2;      // false
s1.equals(s2); // true
Reason: If you create a String object using the `new` keyword a separate space is allocated to it on the heap.




string