Sepertinya ini compiler optimization. String itu konstan, artinya tidak bisa
berubah dan tidak akan berubah. Keitka dikompilasi, string dimasukkan dalam
lookup table, maka isi lookup hanya ada satu "halo". Ketika dicompile, a dan
b akan menunjuk pada address yang sama. Compiler mikir ngapain bikin
referensi baru lagi, lha a dan b ngga akan berubah toh isinya.

Beda dengan c = a + b; di mana a = "ha" dan b = "lo". Di sini kompiler ngga
bisa mikir (well, sebenernya bisa aja kalo kompilernya canggih), jadi
alokasi memori akan dilakukan ketika run time. Di sini sudah pasti referensi
memori yang ditunjuk "halo" ketika kompilasi dan "halo" yang dialokasi
ketika run-time akan berbeda. Ceritanya sama ketika a = new String("halo"),
karena alokasi memori dilakukan ketika run time.

Pesan saya, jangan bergantung pada "quirky" feature seperti ini. Setiap
compiler akan melakukan optimisasi berbeda-beda. Jadi bisa jadi ketika
dicompile dengan compiler lain hasilnya bisa false.

Best regards,
Yasri

2009/10/26 Last Wanto <j...@lastwanto.web.id>

>
>
> halo, tiba-tiba kepikiran nih, ada yg tau jawabannya ??
>
> gini :
>
> String di java kan termasuk class. Dan seperti kita ketahui untuk
> membandingkan dua buah isi dari String biasanya kita menggunakan method
> equals. sedangkan penggunaan operator == untuk membandingkan String ,maka
> yang dibandingkan adalah reference atau alamat memorynya.
>
> String a = new String("halo");
> String b = new String("halo");
>
> a==b hasilnya false, karena emang referencenya beda.
>
> String a = "ha";
> String b = "lo";
> String c = a+b;
>
> "halo" == c , hasilnya false , karena String sendiri itu constants. jadi
> penggunaan + di String sama dengan menciptakan sebuah reference yang
> berbeda..
>
> Nah, ada yang tau kenapa ?
>
> String a = "halo";
> String b = "halo";
>
> atau
>
> String a = "halo";
> "halo" == a , hasilnya true
>
> a==b hasilnya bisa true.
>  
>

Kirim email ke