Yazan : Şadi Evren ŞEKER

Bu yazının amacı, Java dilindeki vektör sınıfının kullanılmasını ve yapısını anlatmaktır.

Java dilindeki vektörlerin yapısından bahsederek başlayalım. Klasik veri yapısı olarak dizilerin (array) ve bağlı listelerin (linked list) özelliklerini birleştirmiştir.

Bir vektör boyutu belli olmadan tanımlanıp içerisine veri konuldukça hafızada kapladığı yeri arttırmaktadır. Bu anlamda bağlı listelere benzer özellik göstermektedir. Yani bir vektörün boyutunun önceden tanımlanması gerekmez. Aslında vektörün boyu yoktur ve herhangi bir anda vektör için bir limit belirtilmez.

Boyutunu belirsiz tutabilmemizin yanında, bir vektörün herhangi bir elemanına doğrudan erişmek (random acces) de mümkündür. Bu sayede vektör yapısı diziler ve bağlı listelerden daha avantajlı bir hal almış olur.

Vektörler hakkında bilmemiz gereken son özellik ise, vektörlerin tipsiz olduğudur. Yani vektörler içlerinde istenilen tipte veri tutabilir. Bunu, JAVA dilinde bulunan nesne mirası sayesinde yapmaktadırlar. JAVA dilinde, bütün nesneler, Object sınıfından türemiştir. Yani aslında bütün nesneler ile Object sınıfı arasında bir miras (inheritance) ilişkisi bulunmaktadır.

Dolayısıyla JAVA dilindeki bütün nesneler, Object sınıfına yukarı akış yapılarak (upcasting) bu tipte tutulabilir. Aşağıdaki örneklerde bu durumu gösteren kodlar sunulacaktır.

Gelelim vektörlerin, JAVA dilindeki kullanılışlarına

Basit bir uygulama ile bu sınıfı tanımaya başlayalım.

 

Öncelikle java dilindeki vektör sınıfı, java.util paketi altında bulunabilir. Dolayısıyla vektörler ile çalışırken kodun başına

import java.util.Vector;

yazmak gerekir. Yukarıdaki kodun 14. satırında da bu import işlemi ile koda başlanmıştır.

Kodun ana çalışan sınıfı (class) vektorDeneme isimli sınıftır ve bu sınıfın içerisinde bir adet main fonksiyonu bulunur. Bu fonksiyonun içinde victor isimli bir Vector tanımlanmıştır.

Ayrıca vektörün içerisinde tutulacak veri tipini belirlemek için bir oluşum sınıfı (composition class) tanımı yapılmış ve insan tipinin, boy ve yaş bilgilerinden oluştuğu kodlanmıştır. (kodun 14-23. satırları arası). Bu sınıf içerisinde bir inşa fonksiyonu (yapıcı fonksiyon, constructor) tanımlanmış ve iki tam sayı (int) alarak bir insanı tanımlamaya imkan sağlamıştır.

Kodun 28. satırında, insan tipinde bir ali nesnesi (object) üretilmiş ve bu nesne, 29. satırda, daha önceden tanımladığımız victor ismindeki vektöre yerleştirilmiştir.

Kodun 30. satırında, victor isimli vektörün boyutunun nasıl alındığı gösterilmiştir. Buna göre bir vektör nesnesinin .size() şeklinde metodu çağrılarak, boyutu alınabilir.

Ayrıca vektörün herhangi bir sıradaki elemanına erişmek için .elementAt() fonksiyonunu çağırmak ve bu fonksiyona parametre olarak kaçıncı elemana erişilmek istendiğini vermek yeterlidir.

Ne yazık ki 31. satırdaki çağırma işlemi sonucunda JAVA anlamlı bir şey basamaz. Bunun sebebi, vektörün 0. elemanı olarak konulan nesnenin tipinin belirsiz olması ve şu anda nesne sınıfına (object) çevrilmiş olmasıdır. Vektörün 0. sırasında bulunan bu elemanın üyelerine (members) erişmek için öncelikle insan tipine geri çevrilmesi gerekir. Bunun için tip inkılabı yapıp nesnenin başına parantezler içerisinde (insan) yazılmıştır. Ancak bu çevirim yapıldıktan sonra boy ve yas üyelerine erişilebilmiş ve ekrana basılmıştır.

Yukarıdaki kodun çıktısı aşağıda verilmiştir:

  • vektör boyutu: 1
  • vektörün 0. elemanı : javaapplication21.insan@190d11
  • elemanın insan olarak boyu : 100 yasi : 10

Görüldüğü üzere, çıktının ikinci satırında, JAVA nesneyi ekrana basmıştır. (aslında ekrana basılan nesnenin dizgiye (string) çevrilmiş ve serilenmiş halidir, daha fazla bilgi için nesne serileme (serialization) başlıklı yazıya bakabilirsiniz).

Vektörlerin, JAVA dilinde bir tip kısıtlaması ile kullanılması da mümkündür.

Örneğin yukarıdaki kodda bulunan victor isimli vektöre, yeni elemanlar eklenirken herhangi bir kısıt bulunmaz. İkinci elemanı olarak öğrenci, üçüncü elemanı olarak ders tipinde nesneler eklenebilir. Bu nesnelerin hepsi Object tipine çevrilerek yerleştirilir. Ancak biz kısıtlamak istersek bir şablon tanımı (template) yapmamız mümkündür.

Vector<insan>kisitli = new Vector<insan>();

Şeklindeki tanım, sadece insan tipinden nesneler alabilir. Farklı tiplerdeki nesnelerin bu vektöre konulması mümkün değildir. Aynı zamanda tip dönüşümü yapmak da gerekmez. Yani bir önceki kodda bulunan ve vektörün herhangi bir elemanının boyu veya yaşını bastırmak için başına eklediğimiz (insan) ibaresinin bu kodda bulunması artık gerekmez. Çünkü JAVA bu sınıfların tiplerini bilmektedir ve bu tiplere göre erişime izin verir.

 

 

Yorumlar

  1. ahmet alp balkan

    Aslinda anlatmaya calistiginiz sey LinkedList yapisi bu yazida. Vector yazan her yere LinkedList yazin ayni sonucu aliyorsunuz ustelik Vector daha yavas cunku thread-safe linked list implementasyonu. Eger threadlerden bahsetmeyeceksek vector kullanmanin amaci yok.

    http://ahmetalpbalkan.com

  2. aynur

    ahmet bey linkedlistlerde herhangi bir elemanı indeks ile erişim sağlayamazsınız.Vector yapısının linkedlistten en büyük farkı bu zaten.Dizilerdeki indeks ile hızlı erişimi böylece kullanmş oluruz.İyi çalışmalar:)

  3. aynur

    Hocam vectorlerde araya ekleme ve silmenin maliyeti O(N) mi oluyor.Kendimce şöyle bir fikir yürüttüm.Silmem gereken elemanı bulmam için arama yapmam gerekiyor bu durumda O(N)olması gerekiyor fakat emin değilim..

  4. Şadi Evren ŞEKER Article Author

    Soruyu bir önceki yorumunuz ile birikte şu şekilde cevaplamak gerek.
    Aşağıdaki 3 veri yapısı (data sturctures) da JAVA için olmak üzere:
    Linkedlist (bağlı liste): En yavaş çözümdür, erişim süreleri O(N)’dir
    Array List: Bağlı listenin üzerine bir erişim dizisi konulmuştur. Bu dizi basitçe bağlı listedeki bütün elemanları gösteren bir gösterici listesi olarak düşünülebilir. Bağlı listelerden çok daha hızlı erişim süresi vardır O(1)’dir.
    Vector: Array list mantığı ile çalışır ve bir indexer dizisi tutar. Erişim süresi benzer şekilde O(1)’dir. Arraylistten farkı fonksiyonlarının thread safe olmasıdır. Yani senkronizasyon problemi yaşamazlar. Şayet thread kullanmıyorsanız vector kullanmanızın anlamı yoktur. Hatta kullanmamanız menfaatiniz icabıdır çünkü fonksiyonların thread safe özelliği vakit kaybetmenize sebep olur.

    Umarım açık olmuştur.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir