Java Puzzle 12 – String Pool

Merhaba Arkadaslar ,
Bu bolumde String Pool ‘u inceleyecegiz.

SpringExample1.java

package _12.string.pool;

public class StringExample1 {

	public static void main(String[] args) {
		
		String lang1 = "java";
		String lang2 = "java";
		
		System.out.println(lang1 == lang2);
	}
}

Kodumuzu calistirdigimizda output “true” olacaktir.

true

== kontrolu , reference type degiskenler icin , bu iki reference type degisken ayni objeyi(identical) gosteriyor mu sorusuna cevap doner.
Yukaridaki kod ornegimiz true dondugune gore lang1 ve lang2 reference type degiskeni ayni objeyi gostermektedir.

NOT : Javada , 8 primitive tip disinda her sey objedir. java.lang.String , java.lang.Integer , int[] tipleri gibi.

String’ler icin bazi ozel durumlar mevcuttur , Java’da Heap’in ozel bir bolumu olarak String Pool bolgesi bulunmaktadir.

pool

All literal strings and string-valued constant expressions are interned.
Butun String literalleri ve String degere sahip Constant Expression’lar interned ozellige sahiptir.

Bir baska ornek olarak ;

SpringExample2.java

package _12.string.pool;

public class StringExample2 {

	public static void main(String[] args) {
		
		String lang1 = "java8";
		String lang2 = "java" + "8";
		
		System.out.println(lang1==lang2);
		
	}
}

pool1

Ornegi calistirdigimizda output true olacaktir ;

true

Bir baska ornek olarak ;

SpringExample3.java

package _12.string.pool;

public class StringExample3 {

	public static void main(String[] args) {

		String lang1 = "java8";

		final String version = "8";
		String lang2 = "java" + version;

		System.out.println(lang1 == lang2);
	}
}

Burada String version degiskeni final oldugu icin Constant Expression ozelligine sahiptir. Bu nedenle interned ozellik gosterir.
Ornegi calistirdigimizda output true olacaktir.

true

Bir baska ornek olarak ;

SpringExample4.java

package _12.string.pool;

public class StringExample4 {

	public static void main(String[] args) {
		
		String lang1 = "java8";

		String version = "8";
		String lang2 = "java" + version;

		System.out.println(lang1 == lang2);
	}
}

String version degiskenimizden final modifier’i kaldiralim. Ornegimizi calistirdigimizda output false olacaktir.

false

Bir baska ornek olarak ;

SpringExample5.java

package _12.string.pool;

public class StringExample5 {

	public static void main(String[] args) {
		
		String lang1 = "java8";
		String lang2 = "java" + getVersion();

		System.out.println(lang1 == lang2);
	}

	public static String getVersion() {
		return "8";
	}

}

Benzer sekilde method invocation da Constant Expression degildir , dolayisiyla interned ozellik gostermez. Bu nedenle output false olacaktir.

false

java.lang.String sinifinda intern metodu yer almaktadir. Bu metot String objelerinin canonical temsili dondurur.
Non Constant Expression ifadeler icin intern metodu uzerinden == kontrolu yaptigimizda true donecektir.

Returns a canonical representation for the string object.
public native String intern();
System.out.println(lang1.intern() == lang2.intern()); // true

String objelerini karsilastirma yaparken her zaman equals metodunu kullanalim. equals metodu “meaningfully” olarak kontrol yapar.
new anahtar kelimesiyle String objesi olusturdugumuzda bu obje her zaman Heap’te olusur.

SpringExample6.java

package _12.string.pool;

public class StringExample6 {

	public static void main(String[] args) {
		
		String lang1 = new String("java8");
		String lang2 = new String("java8");

		System.out.println(lang1 == lang2); //false
		System.out.println(lang1.equals(lang2)); //true
	}
}

pool2

Yazimi burada sonlandiriyorum.
Herkese bol Javali gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *