Sebagian besar tugas di sekolah saya untuk kelas pemrograman awal mengharuskan saya menggunakan array. Saya bekerja penuh waktu sekarang, dan saya tidak pernah menggunakan array untuk proyek apa pun yang saya kerjakan. Bahkan dalam proyek yang ada saya tidak pernah melihat penggunaan array di mana pun. Menurut pendapat saya, Daftar lebih mudah digunakan dan merupakan standar. Mengapa profesor memberi tahu siswa untuk menggunakan array dalam tugas mereka? Apakah hanya agar siswa memahami dasar-dasarnya?
Karena sebagian besar universitas mengajarkan Jawa, pertanyaan ini khusus untuk Jawa.
java
programming-languages
programming-practices
Howl Hagrid
sumber
sumber
Jawaban:
Karena array mengajarkan konsep seperti pengindeksan dan batasan, dua konsep yang secara fundamental penting dalam pemrograman komputer.
Daftar bukan "standar." Ada berbagai macam ruang masalah yang cocok untuk array.
sumber
Mereka mungkin ingin memulai dengan struktur data yang paling akurat mewakili cara kerja komputer, jadi Anda terbiasa dengan dasar-dasar sebelum mereka mulai memperkenalkan abstraksi tingkat tinggi seperti Daftar yang membuatnya lebih mudah untuk dikerjakan. Kalau tidak, Anda tidak akan memiliki cara untuk memahami mengapa struktur atau algoritma tertentu lambat / cepat untuk beberapa operasi dan bukan yang lain; jika memori komputer benar-benar terbuat dari daftar tertaut, dunia akan menjadi tempat yang sangat berbeda.
Untuk alasan yang hampir sama, kelas pemrograman pertama saya di perguruan tinggi adalah di C, dan seluruh kelas semua dalam C ++, Java dan bahasa lainnya. Bukan karena C entah bagaimana lebih baik atau lebih mudah, itu karena C (dan Array) tidak menyembunyikan apa pun dari Anda.
sumber
Jawaban di atas memang bagus, tetapi ada satu lagi yang saya pikirkan.
main()
Metode Java berarti bahwa siswa menjumpai susunan dasar sangat awal, seringkali begitu hari pertama kelas. Mengapa?Ini hal pertama yang harus Anda hadapi untuk menulis Hello World dan seterusnya. (Saya telah melihat beberapa kursus menggunakan IDE pengajaran seperti BlueJ pada awalnya, yang memungkinkan Anda untuk menunjuk-dan-klik untuk menjalankan metode sewenang-wenang, tetapi kami akan mengesampingkannya ...) Meskipun mungkin ada baiknya untuk menggunakan beberapa kata kunci ini sebentar, cepat atau lambat sebagian besar guru akan ingin menjelaskannya. Memang, pertanyaan tes tingkat pemula klasik adalah meminta siswa untuk memberikan makna dari setiap kata kunci dalam program Hello World dasar. Dan apa yang kita temukan sebagai bagian dari tanda tangan metode utama kita? Array (Alasannya, sebagian, historis. ArrayList tidak ada di Java 1.0). Array adalah bagian dari set dasar pengetahuan itu. Daftar tidak.
Yang mengatakan, itu tidak biasa bagi kelas untuk memperkenalkan ArrayList sedikit kemudian ke dalam kursus, terutama sekali objek dan penggunaannya telah dibahas. Bahkan kurikulum Ilmu Komputer AP untuk Java mencakup ArrayList (saya tahu sudah terbiasa, dan Google tampaknya menunjukkan bahwa itu masih berlaku), meskipun mengabaikan fakta bahwa ArrayList mengimplementasikan Daftar dan sisa Kerangka Kerja Koleksi.
Akhirnya, pengalaman saya bahwa program CS universitas menggunakan Java sebagai sarana untuk menjelajahi konsep CS dan pemrograman daripada untuk mengajar siswa bagaimana menjadi pengembang Java yang baik. Beberapa program mungkin lebih fokus untuk menghasilkan pengembang profesional sementara yang lain lebih fokus pada teori, tetapi dalam banyak kasus, ada banyak yang harus dipelajari tentang bagaimana menggunakan Java dalam pekerjaan profesional nyata yang tidak akan diajarkan di sebagian besar kurikulum perguruan tinggi. Ini berkisar dari pola desain dan teknik seperti yang ada di Java Efektif hingga kerangka kerja seperti Spring, Hibernate, atau JUnit, atau bahkan hal-hal yang lebih umum seperti JSP atau JDBC. Dengan filosofi itu dalam pikiran, menekankan array pada ArrayList yang lebih umum digunakan lebih masuk akal.
sumber
Salah satu alasan mengapa kelas-kelas pemrograman tahun pertama menggunakan array adalah warisan: itulah bagaimana para profesor awalnya mempelajarinya sebelum kita mulai menggunakan perpustakaan standar dengan daftar dinamis dimasukkan. Menggunakan tipe data primitif juga lebih umum berlaku: array ada di hampir semua komputer bahasa di bawah matahari (dan dapat diimplementasikan dalam beberapa instruksi perakitan). Ketika saya pertama kali belajar pemrograman, mengimplementasikan daftar tertaut adalah salah satu tugas.
Jauh lebih mudah untuk memulai dari prinsip pertama dan kemudian berkata "Itu struktur dasar. Bahasa ini (atau perpustakaannya) memberi Anda struktur data tingkat tinggi ini yang melakukan semua itu, tetapi memberi Anda x, y, dan z," daripada itu untuk mengatakan "Jadi itu struktur data tingkat tinggi ini, sekarang di sini apa yang ada di balik tudung." Mempelajari alasan untuk menggunakan LinkedList vs. ArrayList (atau HashSet vs. TreeSet) biasanya merupakan kursus Algoritma tahun kedua atau ketiga. Daftar dan Peta memiliki antarmuka yang sama dan memberikan hasil yang sama, tetapi dapat memiliki perilaku yang berbeda secara dramatis dalam aplikasi ukuran apa pun. Dan begitu Anda keluar dari Pemrograman 101, tidak ada jaminan bahwa Pemrograman 102 akan menggunakan bahasa yang sama. Jika Anda mulai dari konsep array, Anda bisa mengatakan "
Alasan lain untuk memilih "array" daripada "Daftar" dalam kursus pengantar adalah bahwa array pada dasarnya mudah dipahami: Array 20
bytes
membutuhkan 20 byte (ditambah pasangan untuk menunjukkan akhir array atau panjangnya, tergantung pada implementasi )."Daftar" adalah ketel ikan yang sama sekali berbeda dan dapat diimplementasikan dengan berbagai cara (ArrayList, LinkedList, dan mungkin pasangan yang saya lupa), dengan karakteristik kinerja yang berbeda secara fundamental. Tanpa memahami keberanian dari apa kelas Daftar berbeda lakukan, Anda tidak dapat memiliki diskusi bermakna ketika Anda harus menggunakan
List foo = new ArrayList()
vsList foo = new LinkedList()
. Jika Anda mencoba membuat siswa menggunakan implementasi Daftar, seseorang akan bertanya mengapa Anda menggunakan ArrayList alih-alih salah satu implementasi lainnya. Dan "ArrayList" termasuk kata "Array" dan didukung oleh satu, jadi itu sebenarnya bukan lompatan logika besar dari "array" ke "ArrayList".Berlawanan dengan kepercayaan populer, ADA situasi di mana masuk akal untuk menggunakan array di Daftar, terutama ketika Anda berurusan dengan daftar ukuran statis. Berikut adalah pasangannya:
foo[n]
dereferensi dan melakukan beberapa aritmatika penunjuk di belakang layar, sementarafoo.get(n)
harus melakukan dereferensi, melakukan pemanggilan metode, melakukan dereferensi kedua, dan kemudian mungkin melakukan aritmatika penunjuk (jika Anda menggunakan ArrayList; LinkedLists berpotensi perlu mengulangi setiap elemen Daftar).int[] foo = new int[]{1, 2, 3, 4, 5}
vs saran dalam pertanyaan StackOverflow lainsumber
perm
adalah suatuint[256]
yang memiliki permutasi, seseorang dapat dengan mudah membalikkannya dengan sebuah array:int[] inv = new int[256]; for (int i=0; i<256; i++) inv[perm[i]]=i;
Saya tidak berpikir apa pun yang bisa dituliskan oleh seseorangArrayList<>
akan sebersih itu.ArrayList
bisa dengan mudah diberi konstruktor yang membuat daftar standar-inisialisasi ukuran tertentu.get
danset
tidak mendapatkan inline.get
danset
bisa disatukan , sesuatu seperti tidakmyList.set(23,myList.get(23)+1)
akan seefisien apa punmyArray[23]+=1
. Lebih jauh, bahkan untuk jenis yang tidak perlu tinju, saya akan sangat terkejut jika ada JITter yang bisa setara denganfor (i=0; i<1000; i++) myList2.set(i+2000,myList2.get(i+3000));
apa pun yang kinerjanya hampirSystem.arrayCopy(myArray1,3000,myArray2,2000,1000);
sama. tetapi Java tidak.Java memungkinkan variabel jenis apa pun untuk disimpan ke dalam array. Sebaliknya,
ArrayList
hanya memungkinkan penyimpanan referensi. Dengan demikian, orang mungkin tidak dapat berdiskusiArrayList
tanpa membahas terlebih dahulu bagaimana tinju otomatis akan mengubah primitif menjadi tipe referensi, dan bagaimana terkadang unboxing otomatis akan mengkonversi tipe referensi menjadi primitif:Jika kode tersebut menggunakan
int[3]
bukan daripadaArrayList
, tidak akan ada kejutan. Ketiga elemen akan membandingkan samai
satu sama lain. MenggunakanArrayList
, bagaimanapun, meskipun semua tiga unsur daftar akan selalu membandingkan sama dengani
, dan yang ketiga pertama dan akan selalu membandingkan sama satu sama lain, dua elemen pertama hanya akan sama satu sama lain ketikai
adalah 1, 10, atau 100, tapi (pada sebagian besar implementasi) bukan kapani
1000 atau 10000.sumber
Integer
Kelas memiliki kelas bersarang yang disebutIntegerCache
yang menampungInteger
objek yang diinisialisasi untuk rentang nilai yang biasanya meluas -128..127; tinju nilai di luar rentang itu akan membutuhkan membuat objek baru, tetapi tinju nilai dalam rentang yang di-cache hanya akan mengembalikan referensi ke salah satu objek pra-diinisialisasi yang disimpan diIntegerCache.cache
. Setiap programmer Java yang baik perlu menyadari bahwa duaInteger
variabel tipe yang merangkum nilai yang sama dapat atau tidak bisa dibandingkan, tetapi memperkenalkan gagasan itu terlalu dini dapat membuat siswa melarikan diri dalam ketakutan.==
. Mengingat kemungkinan bahwa auto-unboxing dapat melempar, saya cenderung untuk tidak mengizinkannya sama sekali, tetapi perilakunya dengan==
sangat mengerikan. The==
Operator juga berperilaku buruk dalam kasus-kasus seperti16777217==16777216f
[laporan yang benar], dan konversi implisit untuklong v=Math.Round(123456789), w=Math.Round(123456789012345)
cenderung menjadi tak terduga [Anda bisa menebak apa yang orang-orang ekspresi akan menghasilkan?]IntegerCache
, tentu ada saat-saat itu dapat membantu kinerja, tetapi sering dapat menyebabkan kode yang Just Plain Wrong untuk pekerjaan agak-agak. Dalam beberapa hal, saya berharap ada mode di mana tinju akan secara acak mengembalikan objek dari dua cache integer dan kuasi secara acak mengganti item cache dengan yang baru, sehingga kode yang mengandalkan perilaku tinju nilai -128..127 akan menjadi tidak mungkin berhasil untuk waktu yang lama.Saya pikir masuk akal untuk mengajarkan cara menggunakan array terlebih dahulu karena fakta yang
ArrayList
menggunakan array secara internal. TheArrayList
kelas memiliki variabel anggota yang disebutelementData
yang merupakanObject
array yang.Dari
ArrayList
kode sumber JDK :Ketika Anda menambahkan, memperbarui, mengambil atau menghapus elemen dari
ArrayList
itu menggunakan array internal ini untuk melakukan operasi itu. Seperti yang telah ditunjukkan oleh pengguna Ixrec -ArrayList
hanyalah abstraksi tingkat tinggi yang biasanya lebih mudah untuk dikerjakan.sumber
Java
- Ia bertanya mengapa mengajarkan array ketika biasanya Anda dapat menggunakanArrayList
. Java tidak memiliki pointer. Benar atau salah, saya berpendapat bahwa C / C ++ adalah bahasa yang lebih baik untuk memulai siswa daripada di Jawa. Banyak topik dalam pemrograman dapat lebih dipahami dengan memiliki pengetahuan tentang C / C ++.Dengan asumsi daftar itu memang lebih mudah untuk dikerjakan, seperti yang Anda katakan - itu tidak masalah. Belajar lebih tentang "dasar ke rumit" daripada "mudah ke susah". Jika dasar-dasarnya tidak penting, maka ilmu komputer tidak akan menjadi bidang akademik. Anda bisa belajar bagaimana mengklik bersama aplikasi menggunakan kerangka / pustaka yang ada dari tutorial online. (Tentu saja, seseorang harus menulis perpustakaan itu ... dan seseorang harus mengimplementasikannya
ArrayList
sejak awal ....)sumber
ArrayList
bisa lebih baik ditangani dengan menggunakan array yang terpisah dan "liveItems" menghitung, kecuali bahwa tidak ada cara mudah untuk bekerja dengan array dan menghitung bersama kecuali dengan menjumlahkannya.Itu karena hal terpenting dalam pendidikan akademik adalah mengajarkan Anda untuk menggunakan terminologi yang benar untuk menggambarkan hal-hal yang Anda lakukan.
Daftar adalah sesuatu yang lain array itu. dan Anda tidak dapat menggunakan
java.util.List
di Jawa karena itu adalah antarmuka. Anda biasanya menggunakanjava.util.ArrayList
yang menjadi implementasi Daftar, bukan daftar, tetapi pembungkus objek di sekitar array dinamis. Jadi Anda mengatakan Anda menggunakan 'Daftar' tetapi Anda menggunakan array.Sangat masuk akal untuk melewati kekacauan terminologis itu dan cukup menggunakan array untuk mempelajari apa itu array. Jika Anda menggunakan array di Jawa, setidaknya Anda menggunakan array.
Jujur, itu juga argumen mengapa mengajar pemrograman dengan Java bukanlah ide yang baik. Sulit untuk mempelajari konsep dasar pemrograman dengan benar.
sumber
Anda benar-benar tidak pernah melihat atau menggunakan array sama sekali? Kami menggunakannya sepanjang waktu, di samping daftar. Kami biasanya tidak menggunakan Java, tetapi kami menggunakan banyak bahasa lain yang memiliki kesamaan.
Antara array dan Daftar, bobot seseorang lebih ringan dan, selain itu, lebih to-the-point, sedangkan yang lain mendapat lebih banyak fungsi. Sebagai aturan umum dalam pemrograman, ketika ada dua jenis yang serupa yang pada dasarnya dibagi di sepanjang garis-garis itu, Anda harus memilih yang lebih ringan kecuali Anda benar-benar membutuhkan yang lebih bagus. Selain mengurangi overhead, ini sebenarnya membantu menjaga jumlah kekacauan dan kondisi dalam program dan khususnya kodenya . Jika terjadi kesalahan selama pengujian, Anda memiliki lebih sedikit tempat untuk dilihat; dan yang lebih penting dalam hal susunan vs. Daftar, orang-orang mendapatkan gagasan yang lebih baik tentang ruang lingkup terbatas dari apa yang sebenarnya Anda gunakan dan coba lakukan dengannya.
Dan ya, dari sudut pandang akademis, ada alasan tambahan untuk mengajarkan dasar-dasar kepada siswa. Namun ini sedikit lebih dalam. Array dan Daftar adalah contoh yang baik dari jenis bulkier yang sering hanya dibangun di atas, dan sering hanya membungkus, contoh-contoh yang mendasari dari jenis yang lebih ringan. Bahkan ketika Daftar tidak memiliki array yang mendasarinya, mereka berperilaku secara lahiriah seperti mereka. Salah satu bagian dari mengajar seseorang apa itu Daftar adalah untuk mengajar mereka apa itu array.
Saya bisa melihat ini mungkin keluar dari tangan dalam bahasa seperti C ++, di mana array pada dasarnya tidak bisa lebih dilucuti daripada mereka, tetapi dalam bahasa tingkat yang lebih tinggi, mereka hampir Daftar untuk diri mereka sendiri. Jika mereka sesuai dengan kebutuhan Anda dengan sempurna dalam situasi tertentu, mengapa Anda harus menggunakan sesuatu yang lain?
sumber
T[]
akan siap, tepat di luar gerbang, untuk menerima item dalam urutan apa pun, sementara yangArrayList<T>
mengharuskan item ditambahkan, agar, sebelum mereka dapat dimodifikasi. AT[]
dapat menyalin rentang item yang sewenang-wenang ke kisaran ukuran yang sama dari item lain secaraT[]
relatif cepat, sementaraArrayList<T>
akan membutuhkan membaca item secara terpisah dari satu daftar dan menyimpannya ke yang lain - jauh lebih lambat dan kurang nyaman.