İçindekilerGirişİndex
YukarıİlkÖnceki YokSonrakiSon
Geriİleri
Yazdır

Collection'lara Genel Bakış

Collection Kütüphanesi

Collection'lar, içerisinde birden fazla nesne barındırabilen, gerektiğinde nesne ekleme, silme gibi işlemlere olanak tanıyan nesnelerdir. Collection'lar bunu dışında, sıralama (sorting) ve collection'ın içerisindeki bir nesneyi bulma (searching) gibi işlemlere de olanak tanırlar. Giderek artan çok sayıda özellik, programcıyı nesne öbekleriyle ilgili işlemler için kod yazmaktan kurtarmaktadır. Ayrıca her programcının kendine özgü çözümü yerine standart bir yöntem sundukları için collection'lar kodun okunaklılığını ve bakımını da kolaylaştırmaktadır.

Diziler ve List Tipi Collection'lar Karşılaştırması

Collection dışında Java dilinde birden fazla nesne barındırabilen dizi (array) yapısı bulunmaktadır. Örneğin

	String[] names=new String[10];

ifadesi on tane nesneyi barındırabilir. Ancak diziler, her türlü programlama sorununa uygun çözüm getiremez. Örneğin, eleman sayısı dizilerde sabittir. On elemanlı bir diziye onbirinci eleman eklenemez. Beşinci elemanla altıncı eleman arasına bir elemen eklemek de mümkün değildir. Başka bir deyişle diziler durağan ('static')tirler; devingen ('dynamic') değildirler. Oysa Collection'lar dinamiktir, istendiği kadar eleman eklenip çıkartılabilir. Üstelik elemanların arasına bir eleman eklenirse ondan sonrakiler otomatik olarak kaydırılır. Diziler yerine kullanılabilecek Collection'lar List'lerdir. Daha doğrusu List interface'ini implement etmiş ArrayList gibi class'lardır. Aşağıdaki kod ArrayList kullanımına basit bir örnek olarak kullanılabilir :

	ArrayList list=new ArrayList(); // Baştan eleman sayısını bilmemiz gerekmiyor
	list.add("1");
	list.add("2");
	list.add("3");
	list.add(1,"1.5"); // Araya Ekledik
	String element=(String) list.get(2); // Yeni indexe göre alır 

Collection'lar Java'ya gelmeden önce de ArrayList'le benzer bir işleve gören Vector adında class bulunmaktaydı. Collection'la Java'nın standart kütüphanelerine eklenince, Vector sınıfında List'i implement edecek şekilde bazı değişiklikler yapıldı. Artık Vector de artık bir Collection'dır.

Diziler ve Map Tipi Collection'ların Karşılaştırılması

Dizilerin bir başka özellikleri de sadece endeks (index)le yani sıra numarasıyla erişime izin vermeleri. '2. Eleman, 3. Eleman' şeklinde. Oysa bazı durumlarda sıra numarası yerine bir anahtarla erişmek gerekebilmektedir. Örneğin plaka numarası, vergi kodu gibi değerler için index'in anlamı yoktur. Bu ülkede alınmış 12312412'inci araba plakasını bulmak istesek bulamayız. Web sitelerde 'kullanıcı ismi' gibi anahtarlar kullanılır. Bazı durumlarda rakam gibi görünmesine rağmen erişim için kullanılan kod metin olarak değerlendirilebilir. Örneğin , telefon numarası veya vatandaşlık no'su gibi. Diziler, erişim için string veya herhangi bir başka nesne kullanılması gerektiği durumlar için hiç uygun değildir. Collection'lar içerinde Map interface'i (ve onu implement eden HashMap class'ı) anahtarla (key'le) erişime olanak tanır. Kullanıcı isimlerine göre şifreleri bir Map'te tutan örnek vermek gerekirse :

	HashMap map=new HashMap();
	map.put("user1","paswword1");
	map.put("user2","password2");
	String pw2=(String) map.get("user1");

Vector class'ına paralel bir biçimde, Collection'lardan önce var olan Hashtable class'ı Map interface'ini implement etmesi sağlanarak Collection çerçevesinin bir parçası haline getirilmiştir.

Veri Gruplama İçin Nesneler ve Collection'lar Karşılaştırması

Bir veya daha fazla nesne, bir başka nesnenin özellikleri olarak da bir arada tutulabilir. Örneğin

class MyClass{
	String s;
	int i;
	double d;
}

şeklinde bir class'da değişik tiplerdeki değerleri bir arada tutmuş sayılır. Ama bir nesnenin bir çok instance'ını bu şekilde saklayamayız. Örneğin, müşteri kavramı için yazılmış bir Customer class'ı olsun.

class Customer{
	String name;
	Address address;
	Phone phone;
}

Biz bu class'ın instance'larını (yani müşterileri) şu şekilde bir class'ta tutamayız :

class Customers{ // Saçma Bir Class
	Customer c1;
	Customer c2;
	Customer c3;
}

Dördüncü bir müşteri için yeni bir property mi yazacağız? Bu nereye kadar sürecek? Bu gibi durumlarda Collection kullanmak gereklidir.

class Company {
	HashMap customers=new HashMap();
}

Öte yandan, Customer diye bir class yapmayıp, ilk elemanın name, ikincisi address üçüncüsü bir collection kullanmak da yanlış bir yol olur.

class Customer{
	ArrayList properties=new ArrayList();	
}

Çünkü collection'lar birbirlerine eşit veya benzer nesneleri bir arada tutmak içindir. Faklı tipte nesneleri sırf aynı kavrama ait oldukları için collection'a koymak yanlış olur. Ayrıca type-safety, yani verilerin tiplerinin uyumu da önemli bir kavramdır. Örneğin

	customer.Address=new Address("Istanbul","TR","....");

şeklinde bir property kullanımı aynı zamanda Address alanına yanlışlıkla Phone girilmesini de engellemiş olur. Oysa collection'lar içerlerinde bulunan nesneler hakkında bilgi sahip olmadıkları için tip güvenliği açısından bir yardımları dokunmaz.

Cast işlemi

Collection'lar içerisinde bulundurdukları nesnelerin tipleri hakkında bilgi sahibi değilidir. O yüzde bir değer geri alınırken 'cast' (değiştirme) yapılmalıdır.

	String value=(String) map.get("key");

Ancak collection'a eklerken bu çeşit bir cast işlemine gerek yoktur. Çünkü collection methodlar'ı hep 'Object' tipinde parametre alarak çalışırlar. Her class aslında, doğrudan veta dolaylı olarak Object class'ını extend etmiş sayıldığından bir X nesnesi aynı zamanda Object'tir. Ama her Object X nesnesi değildir. Daha özel söylersek her String bir Object'ir ama her object bir String değildir.

	Object o;
	String s;
	o=s;// Doğru
	s=o;//Yanlış
	s=(String)o;

Object tipinde tanımlı olan nesne aslında bir String olabilir ama bu bir şeyi değiştirmez. Derleyici onu Object olarak gördüğünden, String olarak kullanmak için onu bu şekilde kullanmak gerekir.

İçindekilerGirişİndex
YukarıİlkÖnceki YokSonrakiSon
Geriİleri
Yazdır