Friday, March 13, 2009

Array itu panjangnya statis. Siapa bilang?

Ketika kita belajar struktur data, selalu ada pembandingan antara array dan linked list. Di mana-mana dikatakan bahwa perbedaan antara array dan linked list adalah bahwa array itu sifatnya statis, begitu diset panjangnya 10 misalnya, maka sampai hari kiamatpun juga tetap 10, sedangkan linked list dikatakan bersifat dinamis, elemen-elemennya bisa ditambah dikurangi dan panjangnya bisa dikurangi atau ditambah dengan bebas.

Beberapa saat yang lalu, saya sedikit orek-orekan untuk array ini. Hasilnya adalah bahwa: array bisa dikembangkan ukurannya atau bisa dikurangi (mohon komentar para jago-jago pemrograman). Contoh syntaxnya adalah sebagai berikut:

misalkan diketahui array bertipe integer sebagai berikut:

int[] angka = new int[]{3,5,1,2,0};

menurut buku-buku, array angka hanya bisa diinisialisasi nilainya untuk angka[0] sampai angka[4]. Apabila kita 'memaksa' untuk mengakses atau menginisalisasi angka[5] dan seterusnya, maka akan muncul eksepsi yaitu "IndexOutOfBoundException". 

Dengan sedikit trik, kita bisa memanjangkan ukuran array ini:

int[] temp = angka;
angka = new int[6]; // misalkan kitahanya akan menambah satu alamat saja.

// mengkopi semua isi yang ditampung sementara oleh temp
int i=0;
for (int nilai:temp) {
angka[i] = nilai;
}

// sekarang kita bisa mengisi angka[5]
angka[5] = 98;

Catatan: ketika diinisialisasi array baru (new int[6]), anda mungkin berpikir bahwa itu adalah objek yang berbeda. Tidak, itu objek yang sama, yaitu objek "angka", hanya akan menunjuk memori-memori yang berbeda. Memori-memori yang sebelumnya ditunjuk pada saat new int[5] akan segera dikoleksi oleh interpreter java dan akan dibuang dengan sistem yang dinamakan dengan garbage collector (gc) 

Demikian, semoga bermanfaat.

4 comments:

التوفيق الهداية said...

Ijinkan saya berkomentar.
Pertama: Perbandingan antara linked list dengan array.
Sebenarnya, membandingkan antara linked list dengan array adalah sesuatu yang tidak applicable. Itu seperti membandingkan antara mesin kendaraan dengan bus. Mungkin karena sumber studi kita berbeda, jadi pemahaman kita berbeda juga :D.
Kenapa saya sebut demikian? Dari segi definisi, array adalah tipe data fisik. Sedangkan linked-list adalah tipe data abstrak. Disebut tipe data abstrak, karena tipe data ini akan berbeda antara yang "terlihat" oleh programmer dengan penyimpanan secara fisik. Hal ini berbeda dengan tipe data fisik, baik yang terlihat oleh programmer maupun dalam penyimpanan secara fisik relatif "akan sama".
Tujuan penggunaan linked-list bukanlah masalah dinamisnya, tetapi agar programmer bisa konsentrasi terhadap logika problem yang diselesaikan daripada memikirkan "cara penyimpanan" secara fisik.
Karena perbedaan ini, tidak heran kalau ada linked-list yang dibuat dengan menggunakan array. Tambahan: linked-list tidak selalu menggunakan pointer.

Kedua: Statis-Dinamis
Perbandingan statis-dinamis akan lebih tepat jika diterapkan antara tipe data array dengan tipe data pointer. Alasannya, karena keduanya sama-sama tipe data fisik.

Ketiga: Array dinamis di Java
Setuju sekali kalau ukuran array Java bisa diubah. Tetapi tentu saja belum memberikan keuntungan berarti dibandingkan dengan linked-list. Bayangkan, setiap kali menambah/mengurangi sebuah nilai (agar terlihat dinamis) yang dilakukan adalah:
- simpan nilai sebelumnya ke temp
- ubah ukuran array
- salin nilai temp ke tempat semula.
Bagi yang pernah belajar kompleksitas algoritma, algoritmanya jadi tidak efisien.

Sekedar pembahasan dari sudut pandang yang berbeda. Silakan dikoreksi kalau ada yang salah.

Wassalaam

Anonymous said...

Assalamualaikum Wr. Wb.
pake database kan lebih enteng...
mau nambah mpe 1 juta data or 1 milyar data, its no matter...
hehehe...
nb: kalau array tsb diterapkan ke dalam sistem web misalnya akan menjadika proses lebih lama algoritmanya ngk efektif...
coba kalau datanya ada 1 triliun dan arraynya ada 10 dimensi...
langsung jebol komputernya...
hehehe.

Wassalam

asep said...

maaf pak, aq masih gak dong.. ;) hehehe

Arwan Ahmad Khoiruddin said...

#anonimous
Mas/mbak, kalau kita mau ngakses database, bagaimanapun juga kita mengaksesnya dengan menggunakan Array.

Coba, misalnya dalam PHP,

$hasil = mysql_query($sql,$conn);
$row = mysql_fetch_row($hasil);

do {
list($ini,$itu) = $row;
} while (row = mysql_fetch_row($hasil));

anda lihat, bahwa hasil query tersebut disimpan dalam array.