Koleksiyonlara Giriş
- Java’da yazılım geliştirirken bazen tek bir değişken içerine farklı verilere erişmek isteyebiliriz.
- Bu gibi durumlarda Java Collections sınıfını kullanmak işinizi kolaylaştıracaktır.
- Kollection sınıfı içerisinde:
- ArrayList
- LinkedList
- Hashset
- Queue vb. gibi yapıları içermektedir.
Koleksiyonların Avantajları
- Birden fazla veriyi tek bir değişken içinde saklamanıza olanak sağlar.
- Veri çekme, veri işleme, sıramala, veri içerisinde arama yapmak gibi işlemleri kolaylaştırırlar.
- Dinamik bir yapıda olduklarından belli bir boyutları yoktur. Çalışma zamanında boyutları değişebilir.
- Koleksiyonların kullanımı bazen kafa karıştırıcı olabilir.
Ortak Koleksiyon Metotları
- Koleksiyon sınıfları birtakım ortak metotlar kullanırlar. Bu metotlar bazen sınıftan sınıfa farklılık gösterebilir.
- add:Koleksiyon nesnesine referans verilen elemanı ekler.
- remove: Koleksiyon nesnesinden referans verilen elamanı siler.
- isEmpty: koleksiyon nesnesinin boş olup olmadığına bakar.
- contains: koleksiyon nesnesi içerisinde referans olarka belirtilen elemanı arar.
- iterator: koleksiyon nesnesini iterasyon nesnesine rferans olarak göndermeyi sağllar.
- size: koleksiyon nesnesinin boyutunu döndürür.
Iterator Sınıfı
- Bu sınıf koleksiyon nesnelerimizi yinelememizi sağlar.
- Iterator nesnesi ile Koleksiyon nesnesi altında bulunan elemanlar arasında güvenli şekilde dolaşabilir veya elemanlar üzerinde işlem yapabilirsiniz.
- hasNext: bir sonraki elemanın olup olmadığına bakar.
- next: bir sonraki elemanı getirir.
- remove: iterater nesnesinin kolleksiynoda gösterdiği elemanı siler.
Örnek
import java.util.HashSet;
import java.util.Iterator;
public class IteratorExp {
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet<String> c=new HashSet<String>();
c.add("a");c.add("abc");c.add("abcd sdff");
Iterator<String> i=c.iterator();
while (i.hasNext()) {
System.out.println("New item="+ i.next());
}
}
}
Kümeler (HashSet)
- HashSet koleksiyonu Set arayüzünden türetilmiştir.
- Tam olarak küme yapısına benzer.
- Eklenen veri türleri aynı olmak zorunda değildir.
- Elemanlarının sıralı olması şartı yoktur.
- Aynı isme sahip birden fazla eleman ekleyemezsiniz.
- add: metodu kullanılarak eleman eklenebilir.
- remove: metodu ile adı verilen eleman kümeden silinir.
- add metodu ile eklenilen eleman kümede mevcutsa metot false döndürür ve o eleman kümeye eklenmez.
Örnek
import java.util.HashSet;
import java.util.Iterator;
class kumeler {
public static void main(String[] args) {
HashSet hSet=new HashSet();
String[] s= {"Ali","Ahmet","Mehmet","Fatma","Ali"};
boolean chk;
for (String temp:s) {
chk=hSet.add(temp);
if(!chk) {
System.out.println("Kopya eleman bulundu!");
}
}
hSet.remove("Fatma"); // Eleman Silmek
Iterator i=hSet.iterator();
while (i.hasNext()) {
System.out.println("Eleman="+i.next());
}
}
}
LinkedHashSet Yapısı
- HashSet içeresinde verilere erişim sırası belirsizdir.
- LinkedHashSet ise öğeler birbirine tek yönlü bağlıdır.
- Yeni bir eleman eklendiğinde önceki ve sonraki elemanlar yeniden düzenlenir.
Örnek
import java.util.Iterator;
import java.util.LinkedHashSet;
public class LinkedSet {
public static void main(String[] args) {
LinkedHashSet lHSet=new LinkedHashSet();
lHSet.add("Ahmet");
lHSet.add("Mehmet");
lHSet.add("Fatma");
lHSet.add("Hasan");
lHSet.remove("Fatma");//Eleman silmek
Iterator i=lHSet.iterator();
while (i.hasNext()) {
System.out.println("Eleman="+i.next());
}
}
}
-------------------------------
Eleman=Ahmet
Eleman=Mehmet
Eleman=Hasan
Sıralı Kümeler TreeSet
- TreeSet öğesi SortedSet arayüzünün bir alt sınıfıdır.
- Bu koleksiyon tipinde tip kontrolü yapılır.
- Yani küme içerisindeki elemanlar farklı veri tiplerinde olmamalıdır aksi halde derleme zamanı hatası (runtime error) alırsınız.
- first: Koleksiyon Öğesinin en küçük elemanını verir.
- last: en büyük elemanını verir.
- headSet: metot içinde verilen öğeden küçük olanları verir.
- tailSet: metot içinde verilen öge ve büyük olanları verir.
- descendingSet: Küme sıralamasını tersine çevirir.
Örnek
import java.util.*;
public class SortedSet {
public static void main(String[] args) {
TreeSet<String> ts=new TreeSet<String>();
ts.add("Istanbul");
ts.add("Adana");
ts.add("Ankara");
ts.add("Izmir");
ts.add("Sivas");
//ts.add(1);
Iterator i=ts.iterator();
while (i.hasNext()) {
System.out.println("Eleman="+i.next());
}
System.out.println(ts.first());
System.out.println(ts.last());
}
}
Liste Yapıları
- List koleksiyon arayüzü verileri bir dizi(array) halinde depolar.
- Dizilerde olduğu gibi bu yapıda da indis değeri vardır.
- Dizilerden en büyük farkı boyutlarının önceden belirlenmiş olmamasıdır.
- Liste yapılarında liste elemanları içeresinde güvenli bir şekilde gezinebilmek için ListIterator() metodu kullanılmaktadır.
- hasNext, hasPrevious, next, previous, get, set, nextIndex, previousIndex gibi metotları vardır.
ArrayList Yapısı
- ArrayList sınıfı elemanları bir dizi biçiminde saklar ve boyutu eleman eklendikçe otomatik olarak büyür.
- ArrayList sınıfının elemanlarına indis(index) ile erişim mümkündür.
- Veri sayısının belli olmadığı veya dizin boyutunun önceden bilinmediği durumlarda kullanışlıdır.
- ArrayList dizilerden farklı olarak nesneleri depolayabilir.
Örnek
import java.util.*;
public class Liste {
public static void main(String[] args) {
ArrayList<Integer> liste=new ArrayList<Integer>();
liste.add(1);
liste.add(2);
liste.add(3);
ListIterator i=liste.listIterator();
while(i.hasNext()) {
System.out.print("elemanın indisi= "+i.nextIndex());
System.out.println(" elemanın değeri= "+i.next());
}
System.out.println(liste);
liste.remove(0);//verilen indisteki değeri siler
System.out.println(liste);
liste.add(0,10);//0 nolu indise yeni değer ekler
System.out.println(liste);
System.out.println(liste.get(1));//1 nolu indisteki eleman
liste.set(2, 21);//2 nolu indisteki değeri değiştirir
System.out.println(liste);
}
}
LinkedList (Bağlı Liste)
- Bağlı Liste (Linked List) yapısında adından da anlaşılacağı gibi elemanlar eklenirken aralarına bir bağ konulur.
- Bu bağ hem tek yönlü hem de çift yönlü olabilir.
- Bağlı Liste yapısı istenildiğinde özelleştirilerek kuyruk(queue) ve yığıt(stack) elde edilmesine olanak sağlar.
- Liste(List) yapısı için kulanılan birçok metot LinkedList için de geçerlidir.
Örnek
import java.util.*;
public class BagliListe {
public static void main(String[] args) {
LinkedList ls=new LinkedList();
ls.add(1); ls.add(2);
ls.add(3); ls.add(24);
System.out.println("Tüm Liste: "+ls);
ls.addFirst(12);
System.out.println(ls.getFirst());
ListIterator i=ls.listIterator();
while (i.hasNext()) {
System.out.println("Eleman="+i.next());
}
}
}
Kuyruk Sınıfı
import java.util.LinkedList;
public class Kuyruk {
private LinkedList list=new LinkedList();
public void ekle(Object item) {
list.addLast(item);
}
public Object cikar() {
return list.removeFirst();
}
public Object ilkItem() {
return list.getFirst();
}
public boolean isEmpty() {
return list.isEmpty();
}
}
Yığıt Sınıfı
import java.util.LinkedList;
public class Yigit {
private LinkedList list=new LinkedList();
public void ekle(Object item) {
list.addFirst(item);
}
public Object cikar() {
return list.removeFirst();
}
public Object ilkitem() {
return list.getFirst();
}
public boolean isEmpty() {
return list.isEmpty();
}
}
Ana Sınıf (KuyrukYığıt)
public class KuyrukYigit {
public static void main(String[] args) {
Kuyruk queue=new Kuyruk();
Yigit stack=new Yigit();
for (int i=0;i<=3;i++) {
queue.ekle(i);
stack.ekle(i);
}
while(!queue.isEmpty()) {
System.out.print(queue.cikar()+” “);
}
System.out.println();
while(!stack.isEmpty()) {
System.out.print(stack.cikar()+” “);
}
}
}
Queue ve Stack Sınıfları
- Kuyruk sınıfı Java’da LinkedList Sınıfından türetilerek kullanılabilir.
- Kuyruk İlk Giren İlk Çıkar (First in First Out (FIFO)) mantığıyla çalışır.
- Liste ve Kuyruk yapıları indis değerleri ile işlem yapamazlar.
- Yani indis değeriyle bir elemana erişmeniz mümkün değildir.
- Yığıt ise Son Giren İlk Çıkar(Last in First Out(LIFO)) mantığıyla çalışır.
- Yığıt içerisinde eleman eklemek ve çıkarmak için özel metotlar kullanılır.
- push() : Yığıta yeni bir eleman ekler.
- pop() : Yığıttan bir eleman çıkartır.
Örnek
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class Kuyruk2 {
public static void main(String[] args) {
Queue kuyruk=new LinkedList(); //Kuyruk sınıfı
Stack yigit=new Stack(); //Yığıt sınıfı
kuyruk.add(1); yigit.push(1);
kuyruk.add(2); yigit.push(2);
kuyruk.add(3); yigit.push(3);
kuyruk.offer(78);Object a=yigit.peek();
System.out.println(a.toString());
while(!kuyruk.isEmpty()) {
System.out.println(kuyruk.remove());
}
while(!yigit.isEmpty()) {
System.out.println(yigit.pop());
}
}
}
Map Arayüzü ve HashMap Sınıfı
- Map Collection arayüzünün bir parçası değildir.
- Bu Arayüz elemanlarını anahtar değerine eşleştirerek saklar.
- Anahtar değerler arasında kopya değerler bulunmaz.
- Bazı özel metotlara sahiptir:
- containsValue(Object key): Map içinde referans olarak verilen değer varsa true yoksa false döner.
- entrySet(): Map içindeki elemanları Set koleksiyon öğesi olarak verir.
- get(Object key): Map içerisinden verilen anahtar değere ait öğeyi getirir.
- put(Object key, Object Value): Map içerisine anahtar değer ile verilen elemanı kaydeder.
- Values(): Map içindeki değerleri koleksiyon olarak verir.
HasMap Sınıfı
- HashMap sınıfı Map arayüzünün bir örneğidir.
- Anahtar değer veya veriler sıralı olmak zorunda değildir.
- HasMap sınıfında performansı belirleyen bazı faktörler vardır.
- Başlangıç sığası: Initial Capacity
- Yükleme Katsayısı: Load Factor
- HasMap içerisindeki alan dolduğunda otomatik olarak yeniden bir sığa belirlenir.
Örnek
import java.util.HashMap;
import java.util.Set;
public class HashTablosu {
public static void main(String[] args) {
HashMap<Integer, String> hash=new HashMap<Integer, String>(10, 0.75f);
hash.put(1, "Bir");
hash.put(2, "İki");
hash.put(3, "Üç");
hash.put(4, "Dört");
Set veri=hash.entrySet();
Set key=hash.keySet();
System.out.println(hash);
System.out.println(hash.containsKey(1));
System.out.println(veri);
System.out.println(key);
}
}
-----------------------------------
{1=Bir, 2=İki, 3=Üç, 4=Dört}
true
[1=Bir, 2=İki, 3=Üç, 4=Dört]
[1, 2, 3, 4]