29 Eylül 2011 Perşembe

intern() ile String karşılaştırmaları

Malum String' Java'da primitif bir tip olarak tanımlı değil. Object sınıfından türetilmiş, bir sürü metodu native olan final bir sınıf. Yani hiyerarşisinin sonunda yer alıyor. Siz herhangi bir sınıf türetemiyorsunuz.

Java'da bildiğimiz gibi == operatörü ile primitif tipler dışındaki karşılaştırmalar obje referansı karşılaştırmaları. Objeler üzerinde karşılaştırma yapmak için equals() methodu kullanılıyor, String'de olduğu gibi.

String içinde yer alan metodları incelerken String döndüren intern() metoduna herkesin gözü gitmiştir. Peki nedir bu intern?

intern() temel olarak şu işe yarıyor, intern() metodu çağırıldığı zaman String objesinin hash'ini alıp, bir lookup tablosuna bakıyor, eğer String objesi ile aynı içeriğe sahip bir başka obje varsa bunu döndüyor. Böylece equals() metodu ile kontrol yapmadan direk lookup table'da arayarak karşılaştırma yapılabiliyor.

Ayrıca JVM statik durumdaki String ifadeleri otomatik olarak intern() işleminden geçiriyor. Böylece == ifadesi ile kontrol yapılabiliyor. Böylece iki String'in içeriklerinin tek tek kontrol edilmesi yerine direk obje referansları kontrol edilmiş oluyor yani doğal olarak equals() metoduna göre oldukça hızlı bir karşılaştırma yapılabiliyor.

Aşağıdaki kodu çalıştırdığınızda tüm ifadeler statik olduğu için == operatörü ile karşılaştırmaların çalıştığını görebilirsiniz.





 1 import java.io.BufferedReader;
2 import java.io.IOException;
3 import java.io.InputStreamReader;
4
5 public class StringIntern {
6
7 public static final String CONSTANT_STRING = "string";
8 public static void main(String[] args) throws IOException {
9 String str1 = "string";
10 if(str1 == CONSTANT_STRING) {
11 System.out.println("1. karşılaştırma");
12 }
13 String str2 = "string";
14 if(str1 == str2) {
15 System.out.println("2. karşılaştırma");
16 }
17
18 InputStreamReader converter = new InputStreamReader(System.in);
19 BufferedReader in = new BufferedReader(converter);
20 String str3;
21 while((str3 = in.readLine()) != null && !str3.equals("")) {
22 if(str3 == CONSTANT_STRING) {
23 System.out.println("3. karşılaştırma");
24 }
25 if(str3.intern() == CONSTANT_STRING) {
26 System.out.println("4. karşılaştırma");
27 }
28 }
29 }
30 }

2 yorum:

  1. intern() kullanımının diğer yöntemlere göre bir avantajı ya da dezavantajı var mı?

    YanıtlaSil
  2. Yazıda değinmeyi unutmuşum, iyi bir hatırlatma oldu :) . intern() metodu ile yapılan kontroller equals() metodu gibi içeriği karşılaştırmıyor, sadece obje referansını kontrol ediyor. Dolayısıyla equals'a göre oldukça hızlı bir karşılaştırma yöntemi.

    YanıtlaSil