Jan 1, 0001  

title: Java Dersleri 13 - Koleksiyon API (Collection API) Listeler link: http://orhanbalci.net/tr/?p=645 author: Orhan Balci description: post_id: 645 created: 2010/02/17 21:39:33 created_gmt: 2010/02/17 18:39:33 comment_status: open post_name: java-dersleri-13-koleksiyon-api-collection-api status: publish post_type: post

Java Dersleri 13 - Koleksiyon API (Collection API) Listeler

[caption id=“attachment_834” align=“aligncenter” width=“600” caption=“Java Dersleri 13 Listeler”]Java Dersleri 13 Listeler[/caption] Koleksiyonlar yazılımımızda verinin hafızada nasıl tutulacağına karar veren soyut veri yapılarıdır. Koleksiyon sınıfları verileri sıralaması, tekil veri taşıyıp taşımaması gibi özelliklerine göre birbirinden ayrılır. Yapacağımız işlemlerin sıklığına göre bu kapsayıcı (container) koleksiyon sınıflarından seçim yapmamız gerekir. Bu seçim yazılım performansı için hayati önem taşımaktadır. Örneğin elimizdeki veriye sıralı (sequential) veya rastgele (random) erişip erişmeyeceğimiz önemlidir. Bu da bizim kapsayıcı sınıf seçimimizi etkileyecektir. İkinci bir örnek olarak elimizdeki verinin sürekli olarak sıralı tutulmasını arzu ediyor olabiliriz. Bu da seçimimize direkt olarak yansıyacaktır. En çok bilinen koleksiyon API arayüzü List arayüzüdür. Listeler verilerimizi belirli bir sıraya göre hafızada tutan kapsayıcı sınıflardır. Sizlere liste arayüzünün metodlarını teker teker açıklamak yerine kullanımına örnekler vererek konuyu hafızanıza yerleştirmek istiyorum. İlk olarak listeye eleman eklemeyi görelim : [java] List al = new ArrayList(); List al2 = new ArrayList(); al.add(“ahmet”); al.add(0,“mehmet”); al.add(0,“ali”); al.add(0,“veli”); System.out.println(al); System.out.println(al2); al2.addAll(al); System.out.println(al2); [/java] Örneğimizde iki adet ArrayList kapsayıcı nesnesi oluşturup bunlara çeşitli metodlar vasıtasıyla eleman ekleyerek içeriklerini yazdırdık. İlk metodumuz add(), listemizin sonuna eleman eklemeye yarar. Yine **add ** metodumuzun overloadu olarak listenin sonuna değil istediğimiz indeksine eleman eklemeye yarayan bir metodumuz var. Listemize bir diğer listeden çoklu eleman eklemek için ise addAll metodunu kullanıyoruz. İkinci olarak listeden eleman silmeye bakalım : [java] al.remove(“ali”); System.out.println(“Liste 1 :” + al); al2.remove(0); System.out.println(“Liste 2 :” + al2); al2.removeAll(al); System.out.println(“Liste 2 :” + al2); [/java] Listeden eleman silmek için remove() metodunu kullanıyoruz. remove() metodunun iki overload’u bulunuyor. Birincisi parametre olarak listeden silmek istediğimiz elemanın kendisini alırken, ikincisi elemanın listedeki yerini (indeks) alır. Toplu silme işlemi için removeAll() metodunu kullanabiliriz. Bu metod parametre olarak verilen liste içindeki elemanları silme yapılan listeden çıkarır. Yukarıdaki örnekte al2 listesinden al listesinde bulunan bütün elemanlar çıkarılmıştır. Bu işlem sonunda al listesinde al fark al2 kalmış olur. Az kullanılan ama yararlı bir metod olan retainAll() kullanımını örnekle görelim : [java] //retainAll() kullanımı List liste1 = new ArrayList(); List liste2 = new ArrayList(); for(int i = 0; i <= 10; i++) { liste1.add(String.valueOf(i)); } System.out.println(“Liste 1 :” + liste1); for(int i = 0; i <= 15; i++) { liste2.add(String.valueOf(i)); } System.out.println(“Liste 2 :” + liste2); liste2.retainAll(liste1); System.out.println(“Liste 2 :” + liste2); [/java] Burada liste1 10’a kadar olan sayılarla doldurulmuş, liste2 ise 15’e kadar olan sayılarla doldurulmuştur. liste2’ ye retainAll() komutu verilmiştir. Bu metod liste2 içerisinde olup da liste1‘de olmayan tüm elemanları liste2‘den siler. Yani liste2 içerisinde sadece liste2 ile liste1‘in kesişimi kalır. Örneğin çıktısı : [java] Liste 1 :[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Liste 2 :[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] Liste 2 :[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [/java] şeklindedir. Listenin herhangi bir yerindeki (indeks) elemana ulaşmak için get() metodunu kullanıyoruz. Listenin herhangi yerindeki (indeks) bir elemanı değiştirmek için ise set() metoduna başvuruyoruz. Bu metodların kullanımı görelim : [java] System.out.println(liste2.get(3)); liste2.set(3, “99”); System.out.println(liste2.get(3)); [/java] Bu örnekte liste2 listesinin 4. (listelerde indeksler 0’dan başlar ) elemanı ekrana yazdırılıyor. Daha sonra 4. eleman 99 olarak değiştirilip tekrar ekrana yazdırılıyor. Temel operasyonları öğrendiğimize göre elimizdeki liste üzerinden tüm elemanlara teker teker ulaşmanın (iteration) yöntemlerine bakabiliriz. Bunun için çeşitli yöntemler mevcut. İlk olarak klasik for döngüsüyle erişimi görelim : [java] for (int i = 0; i < liste2.size(); i++) { String string = liste2.get(i); System.out.print(string); } [/java] Burada for döngümüzü listenin uzunluğu (size()) ile kısıtlayarak elemanlara tek tek erişiyoruz. Gelişmiş for döngüsü ile erişim ise şu şekilde: [java] for (String string : liste2) { System.out.println(string); } [/java] Son olarak ise Iterator yardımı ile elemanlara erişim yöntemidir. Bunu da örnekle görelim : [java] ListIterator li = liste2.listIterator(); while (li.hasNext()) { String string = li.next(); System.out.print(string); } [/java] Burada Iterator kullanmanın avantajı listede ileri geri hareket edebiliyor olmamız. Ayrıca listede hareket ederken listeyi değiştirmemiz de mümkün. Bu üç yöntem içinde elemanlara ulaşma hızı olarak en hızlı olanı ilk gösterdiğimiz klasik for döngüsüdür. Diğer iki yöntem ise yaklaşık olarak birbirine eşit hızlarda çalışmaktadır. Örneğin 150000 elemanlı bir dizideki elemanlara tek tek erişmek klasik for döngüsü ile yaklaşık 3 milisaniye sürerken, geliştirilmiş for döngüsü ve Iterator yardımıyla erişmek ise yaklaşık 6 milisaniye sürer. Listeleri kullanırken sıklıkla ihtiyaç duyabileceğimiz metodları Java geliştiricileri **Collections ** sınıfı içine yerleştirmişler. Elimizdeki bir listeyi sıralamak için** Collections.sort(List)**, liste içerisinde arama yapmak için ise Collections.binarySearch(List list, Object key) statik metodlarını kullanabiliriz. Liste arayüzünün anlattıklarım dışında da birkaç metodu bulunuyor fakat bunlara değinmeyeceğim. Java’da Liste arayüzünün iki ayrı gerçeklemesi vardır. bunlardan ilki yukarıda kullandığımız ArrayList’dir. İkincisi ise LinkedList. Bu iki gerçekleme de birbirlerine değişik konularda avantaj sağlarlar. Örneğin ArrayList rastgele erişim konusunda LinkedList’e göre çok avantajlı iken. LinkedList ise araya eleman sokmakta ArrayList’e göre çok üstündür. Bu farkları ufak kod parçaları yazarak deneyip görebilirsiniz. [ad#Yazi Ici Buyuk]

Comments

gzmmm: tşkürrler:D :mrgreen: