Zagadka ze Stringami

Stosunkowo prosta lecz ciekawa zagadka dotycząca klasy String. Dlaczego po uruchomieniu poniższego kodu otrzymujemy:

<barista@javaczyherbata.pl> java StringPuzzle
true false


Oto kod zagadki.

public class StringPuzzle {

	public static void main(String[] args) {
		new StringPuzzle().checkEquality();
	}

	public void checkEquality() {
		String b1 = "Barista8";
		String b2 = "Barista" + "8";
		String b3 = "Barista" + b1.length();

		System.out.println((b1 == b2) + " " + (b1 == b3));
	}
}

Powodzenia:)

3 komentarze to “Zagadka ze Stringami”

  • dembol says:
    javap -c StringPuzzle 
    

    daje poniższy rezultat

    public void checkEquality();
      Code:
       0:	ldc	#5; //String Barista8
       2:	astore_1
       3:	ldc	#5; //String Barista8
       5:	astore_2
       6:	new	#6; //class java/lang/StringBuffer
       9:	dup
       10:	invokespecial	#7; //Method java/lang/StringBuffer."":()V
       13:	ldc	#8; //String Barista
       15:	invokevirtual	#9; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
       18:	aload_1
       19:	invokevirtual	#10; //Method java/lang/String.length:()I
       22:	invokevirtual	#11; //Method java/lang/StringBuffer.append:(I)Ljava/lang/StringBuffer;
       25:	invokevirtual	#12; //Method java/lang/StringBuffer.toString:()Ljava/lang/String;
       28:	astore_3
       29:	getstatic	#13; //Field java/lang/System.out:Ljava/io/PrintStream;
    

    Jak widzimy drugi string został sklejony podczas kompilacji i zapisany w puli stringów (jest on identyczny ze stringiem pierwszym, więc tak naprawdę oba zostały zapisane na tej samej pozycji). Z kolei trzeci string został sklejony z wykorzystaniem StringBuffera. Całe wyrażenie zostało zamienione na new StringBuilder(String.valueOf("Barista")).append(b1.length()).toString() co w wyniku daje nowy obiekt, stąd false podczas porównywania referencji.

    Potwierdzenie daje nam specyfikacja Javy, "15.18.1. String Concatenation Operator +"

    If only one operand expression is of type String, then string conversion (§5.1.11) is performed on the other operand to produce a string at run-time.

  • kubale says:

    Dembol, marnujesz się w WP 😉
    I w dodatku chcą Was sprzedać za 2/3 ceny ;P

  • dembol says:

    Da się na tym portalu jakoś zalajkować wypowiedź? Chętnie bym to zrobił dla powyższego komentarza 😉

Leave a Reply