2013-12-18 21 views
5

Aşağıdaki kodu varNeden "==" bazen String.trim ile çalışıyor?

public static void main(String... args) { 

    String s = "abc"; 
    System.out.println(s.hashCode()); 
    String s1 = " abc "; 
    System.out.println(s1.hashCode()); 
    String s2 = s.trim(); 
    System.out.println(s2.hashCode()); 
    String s3 = s1.trim(); 
    System.out.println(s3.hashCode()); 
    System.out.println(); 
    System.out.println(s == s1); 
    System.out.println(s == s2); 
    System.out.println(s == s3); 
} 

OP:?

96354 
32539678 
96354 
96354 

false -- Correct 
true -- This means s and s2 are references to the same String object "abc" . 
false -- s3=s1.trim()... which means s3="abc" yet s==s3 fails.. If the above conditon were to be considered (s==s2 is true..) , this should also be true.. 

Neden ben yeni dönecektir s1.trim() çünkü ..

+3

@JigarJoshi - Bir kopyası varsa şüpheliyim. OP, ne zaman kullanılacağını bilir == 've' equals() '.Bu soru, belirli bir durumla ilgilidir. Burada, farklı durumlar için farklı şekilde davranır. – SudoRahul

+1

@ R.J Öyleyse bu soru mevcut olmamalı .. (ya da OP sadece konuyla ilgili diğer kopyaların bazılarını gözden geçirmelidir) – user2864740

+3

@ user2864740 - Bu konuda size katılmıyorum. Çok özel bir şüphe istemek güzel bir sorudur. Bunun neden olmamalı olduğunu anlamıyorum. Yeniden açmak için oylama – SudoRahul

cevap

2
public String trim() { 
    int len = value.length; 
    int st = 0; 
    char[] val = value; /* avoid getfield opcode */ 

    while ((st < len) && (val[st] <= ' ')) { 
     st++; 
    } 
    while ((st < len) && (val[len - 1] <= ' ')) { 
     len--; 
    } 
    return ((st > 0) || (len < value.length)) ? substring(st, len) : this; 
} 

size durumunda görebileceğiniz gibi (System.out.println(s == s2);) this true olsun neden aynı referans işaret edilen döndürülür.

+1

çok teşekkürler kardeşim .. – TheLostMind

5

i ler == s3 kontrol ederken "yanlış" alıyorum örneği. Dizeler böylece bir işlev sonra Strings uygulanan her zaman yeni bir örneğini iade edilecek ve Sen örneği eşitliği karşılaştırır == kullandığınız iletmenin

Düzenleme: Chris Hayes ve R.J. tarafından önerildiği gibi Kesintisiz beyaz yazı yoksa trim akıllıdır ve this değerini döndürür. Yani ikinci durumda 'abc' beyaz boşlukları var, bu durumda this değil, yeni bir dize örneğini döndürüyor. trim method

+0

@RJ - bu benim sorum ... – TheLostMind

+1

@RJ Döşemek için boşluk yoksa, 'trim' akıllıdır ve 'this' döndürür. http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java#String.trim%28%29 –

+0

@RJ Muhtemelen olurdu İlk yorumda daha açık olması için size büyük bir keder getirdim. :) –

1

ait

kaynak kod belgelerinde bakın - http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#trim() -

A copy of this string with leading and trailing white space removed, or this string if it has no leading or trailing white space.

dize o dize kendisini verilen döndüren aynı kalıyor zaman.

+0

Evet .. kullanmam gerektiğini biliyorum .equals() benim soru neden s1.trim() yeni bir nesne döndürür s.trim() ? – TheLostMind

2

String.trim'a bakarsanız, sonunda dizginin kırpılmış olması durumundadöndürdüğünü görürsünüz. Bu yüzden == başarısız oluyor.

1

(JDK itibaren) java.lang.String.trim() için Java 7 kaynak kodu:

public String trim() { 
    int len = value.length; 
    int st = 0; 
    char[] val = value; /* avoid getfield opcode */ 

    while ((st < len) && (val[st] <= ' ')) { 
     st++; 
    } 
    while ((st < len) && (val[len - 1] <= ' ')) { 
     len--; 
    } 
    return ((st > 0) || (len < value.length)) ? substring(st, len) : this; 
} 

Dönüş ifadesi varsa String hiçbir değişiklik kesilmiş olan belirtiyor, Yaylı ihtiyaçlarını kesilmiş olan

String s = "abc"; 
String s2 = s.trim(); 
System.out.println(s == s2); // is true 

kesileceği, java.lang.String.substring() olarak adlandırılır: bu nedenle s == s2, döndürülür. Java 7 alt dizeyi kaynak kodu() 'dir:

new String(value, beginIndex, subLen) 

Bu yüzden s: String trim edilmesi

public String substring(int beginIndex, int endIndex) { 
    if (beginIndex < 0) { 
     throw new StringIndexOutOfBoundsException(beginIndex); 
    } 
    if (endIndex > value.length) { 
     throw new StringIndexOutOfBoundsException(endIndex); 
    } 
    int subLen = endIndex - beginIndex; 
    if (subLen < 0) { 
     throw new StringIndexOutOfBoundsException(subLen); 
    } 
    return ((beginIndex == 0) && (endIndex == value.length)) ? this 
      : new String(value, beginIndex, subLen); 
} 

sonra) (alt dize yeni bir dize döndürür kesilmiş olması gerekir! = s3: Bu yanıt için

String s = "abc"; 
String s1 = " abc "; 
String s3 = s1.trim(); 
System.out.println(s == s3); // is false 

Kaynak kodu GitHub'dan here mevcuttur.

İlgili konular