JavaRush /Blog Java /Random-MS /Coffee break #176. Persamaan dan perbezaan antara Array d...

Coffee break #176. Persamaan dan perbezaan antara Array dan ArrayList. Cara Menulis Kaedah Equals() Berkesan

Diterbitkan dalam kumpulan

Persamaan dan perbezaan antara Array dan ArrayList

Sumber: Sederhana Artikel ini menumpukan pada pemahaman konsep Array dan ArrayList dan perbezaan antara mereka. Coffee break #176.  Persamaan dan perbezaan antara Array dan ArrayList.  Bagaimana untuk menulis kaedah equals() yang cekap - 1

Tatasusunan Java

Array ialah struktur data yang membolehkan anda menyimpan urutan nilai yang tersusun daripada jenis yang sama. Contohnya, anda boleh membuat susunan aksara, nombor dan sebagainya. Ini terpakai kepada semua jenis primitif dan juga objek seperti String . Sebaik sahaja tatasusunan dibuat, kita tidak boleh menukar saiznya. Berikut ialah contoh umum untuk mengisytiharkan pembolehubah rujukan tatasusunan dan memperuntukkan tatasusunan:
dataType[] arrayName = new dataType[numElements];
Jika kita cuba menambah lebih daripada saiz tatasusunan, kita mendapat ArrayIndexOutOfBoundsException .

Pengisytiharan Array

Untuk mengisytiharkan tatasusunan, gunakan aksara [ ] selepas jenis data. Mereka menunjukkan bahawa pembolehubah adalah rujukan kepada tatasusunan. Pembolehubah rujukan tatasusunan boleh merujuk kepada tatasusunan pelbagai saiz. Kata kunci baharu mencipta ruang dalam ingatan untuk menyimpan tatasusunan dengan bilangan elemen tertentu. Pembolehubah rujukan tatasusunan ditetapkan untuk merujuk kepada tatasusunan yang baru diperuntukkan ini. Contoh berikut mengisytiharkan pembolehubah rujukan tatasusunan gameScores , memperuntukkan tatasusunan empat integer, dan memperuntukkan Skor permainan untuk merujuk kepada tatasusunan yang diperuntukkan.
int[] gameScores = new int[4];
Elemen tatasusunan dimulakan secara automatik kepada nilai lalai apabila anda menggunakan kata kunci baharu untuk memulakan rujukan tatasusunan. Nilai lalai untuk unsur jenis data integer dan titik terapung ialah sifar dan nilai lalai untuk unsur Boolean adalah palsu . Anda juga boleh mengisytiharkan pembolehubah rujukan tatasusunan tanpa segera memperuntukkan tatasusunan, dan kemudian menetapkan pembolehubah dengan tatasusunan yang diperuntukkan.
int[] gameScores;

gameScores = new int[4];

Memulakan Tatasusunan dengan Nilai Bukan Lalai

Anda boleh memulakan elemen tatasusunan dengan nilai bukan lalai dengan menyatakan nilai awal dalam pendakap kerinting {} yang dipisahkan dengan koma.
int [] myArray = { 5 , 7 , 11 };
Contoh di atas mencipta tatasusunan tiga elemen integer dengan nilai 5, 7 dan 11. Inisialisasi tatasusunan ini tidak memerlukan penggunaan kata kunci baharu kerana saiz tatasusunan ditetapkan secara automatik kepada bilangan elemen dalam pendakap kerinting. Untuk tatasusunan besar, permulaan boleh dicapai dengan mentakrifkan tatasusunan dahulu dan kemudian menggunakan gelung untuk menetapkan elemen tatasusunan. Elemen tatasusunan boleh diakses menggunakan indeks berasaskan sifarnya.
Int[ ] intArray = new int [ ] {2};
intArray [0] = 1;
intArray [1] = 2;

ArrayList

ArrayList ialah senarai tersusun bagi elemen jenis rujukan boleh saiz semula . Ia juga merupakan kelas daripada pakej java.util kepunyaan Rangka Kerja Koleksi Java. ArrayList memberikan kami tatasusunan dinamik dan secara automatik mengendalikan saiz semulanya. Apabila anda menambah elemen pada ArrayList, saiz memorinya meningkat secara automatik. Anda boleh menggunakan ArrayList menggunakan import java.util.ArrayList; . Kami juga boleh membuat contoh ArrayList menggunakan pernyataan berikut:
ArrayList<Type> arrayList = new ArrayList<Type>();
ArrayList boleh membesar dalam saiz untuk menampung elemen yang diperlukannya. ArrayList tidak menyokong jenis primitif seperti int , sebaliknya jenis rujukan seperti Integer . Kesilapan biasa di kalangan pemula ialah mengisytiharkan ArrayList daripada jenis primitif seperti int , seperti dalam ArrayList<int> myVals . Ini mengakibatkan ralat penyusunan: "jenis yang tidak dijangka, dijumpai : int, diperlukan: rujukan". Contoh: Mari buat objek ArrayList bernama cars , yang akan menyimpan rentetan:
import java.util.ArrayList;

ArrayList<String> cars = new ArrayList<String>();
Untuk menambah elemen pada ArrayList , gunakan kaedah add() . Untuk mengakses elemen ArrayList , kaedah get() digunakan .
cars.add("Tesla");
cars.add("BMW");
cars.add("Kia");
cars.get(0);
Perbezaan antara tatasusunan terbina dalam dan ArrayList di Jawa ialah dalam kes pertama, saiz tatasusunan tidak boleh diubah (jika anda ingin menambah atau mengalih keluar elemen ke/daripada tatasusunan, anda perlu mencipta yang baharu ). Manakala dalam ArrayList , elemen boleh ditambah dan dialih keluar pada bila-bila masa.

Persamaan Antara Array dan ArrayList

  • Array dan ArrayList digunakan untuk menyimpan elemen.
  • Array dan ArrayList boleh menyimpan nilai nol.
  • Kedua-dua proses berlaku dalam masa yang tetap.
  • Mereka mungkin mempunyai nilai pendua.
  • Array dan ArrayList tidak menjamin kehadiran elemen tertib.

Perbezaan Utama Antara Array dan ArrayList

Perbezaan utama antara tatasusunan ( Array ) dan ArrayList ialah sifat statik tatasusunan dan sifat dinamik ArrayList . Setelah dibuat, anda tidak boleh menukar saiz tatasusunan, manakala ArrayList boleh menukar saiznya mengikut keperluan. Satu lagi perbezaan penting ialah tatasusunan ialah fungsi asas yang disediakan oleh Java. Sebaliknya, ArrayList ialah sebahagian daripada rangka kerja koleksi di Java. Kita boleh mengakses elemen tatasusunan menggunakan kurungan segi empat sama di mana kita boleh menentukan indeks. Walaupun terdapat satu set kaedah untuk mengakses elemen ArrayList dan mengubahnya. Walaupun mereka berbeza, kedua-duanya masih boleh dibandingkan dalam aspek lain. Kedua-dua struktur data dalam Java ini adalah berdasarkan indeks dan membolehkan anda menyimpan objek. Selain itu, mereka membenarkan nilai nol dan pendua. Jika anda mengetahui saiz objek terlebih dahulu, maka lebih baik menggunakan tatasusunan. Tetapi jika anda tidak pasti tentang saiznya, maka anda harus menggunakan ArrayList sebaliknya .

Cara Menulis Kaedah Equals() Berkesan

Sumber: Sederhana Siaran ini akan membantu anda lebih memahami penggunaan kaedah equals() apabila bekerja dengan kod Java. Jika kita bercakap tentang kaedah lalai equals() dan tanpa sebarang pelaksanaan, maka ia dalam banyak cara serupa dengan operasi == . Iaitu, kaedah ini membandingkan objek. Sebagai contoh, equals() membandingkan dua rentetan dan mengembalikan benar jika rentetan itu sama dan palsu jika tidak. Sila ambil perhatian bahawa operator == tidak disyorkan untuk membandingkan objek dalam Java. Sebabnya ialah apabila membandingkan objek, == hanya akan kembali benar jika rujukan menunjuk ke objek yang sama. Cara paling mudah untuk mengelakkan masalah adalah dengan tidak mengatasi kaedah equals , dalam hal ini setiap contoh kelas adalah sama hanya dengan dirinya sendiri. Anda hanya perlu mengatasi equals apabila kelas mempunyai konsep kesamaan logik yang berbeza daripada identiti mudah objek, dan superclass belum lagi mengatasi kesamaan. Oleh itu, apabila menggunakan kaedah equals() , anda perlu mengetahui sama ada rujukan objek adalah setara secara logik dan sama ada ia merujuk kepada objek yang sama.

Sifat kaedah sama

Setiap kaedah equals melaksanakan hubungan kesetaraan . Ia mempunyai ciri-ciri berikut:
  • Reflektif : Untuk sebarang nilai rujukan bukan nol x, x.equals (x) mesti mengembalikan true .

  • Simetri : Untuk sebarang nilai rujukan bukan nolx dan y , x.equals(y) mesti mengembalikan benar hanya jika y.equals(x) mengembalikan true .

  • Transitif : Untuk sebarang nilai rujukan bukan nol x , y , z , jika x.equals(y) mengembalikan true dan y.equals(z) mengembalikan true , maka x.equals(z) juga mesti mengembalikan true .

  • Konsisten : Untuk sebarang nilai rujukan bukan nol x dan y, berbilang panggilan ke x.equals(y) mesti secara konsisten mengembalikan benar atau konsisten mengembalikan palsu .

  • Tidak batal : Untuk sebarang nilai rujukan bukan nol x, x.equals (null) mesti mengembalikan false .

Mari kita lihat lebih dekat setiap hartanah:

Reflekstiviti:

Objek mestilah sama dengan dirinya sendiri. Untuk mengesahkan ini, tambahkan tika kelas anda pada koleksi. Kaedah mengandungi mungkin menunjukkan bahawa koleksi tidak mengandungi contoh yang baru anda tambahkan.

simetri:

Dua objek (ia boleh dari kelas yang berbeza) mestilah sama antara satu sama lain.

Susulan:

Jangan tulis kaedah sama yang bergantung pada sumber yang tidak boleh dipercayai/tidak menentu.

Bukan sifar:

Sentiasa mengembalikan benar jika objek yang dihantar kepada sama adalah null .

Mari kita ringkaskan:

Berikut ialah resipi untuk kaedah yang sama kualiti :
  1. Gunakan operator == untuk menguji sama ada hujah adalah rujukan kepada objek ini.

  2. Gunakan operator instanceof untuk menyemak sama ada hujah adalah jenis yang betul.

  3. Hantar hujah kepada jenis yang betul.

  4. Untuk setiap medan "ketara" dalam kelas, semak sama ada medan hujah itu sepadan dengan medan sepadan objek itu:

    • Untuk medan primitif: yang jenisnya bukan float atau double , gunakan operator == untuk perbandingan.
    • Untuk medan rujukan objek: panggil kaedah sama secara rekursif; untuk medan titik terapung gunakan kaedah statik Float.compare(float, float); dan untuk medan berganda gunakan Double.compare(double, double) .
    • Untuk medan tatasusunan: Gunakan garis panduan ini pada setiap elemen. Jika setiap elemen dalam medan tatasusunan adalah penting, gunakan salah satu kaedah Arrays.equals() .
    • Sesetengah medan rujukan objek mungkin mengandungi nilai nol . Untuk mengelak daripada membuang NullPointerException , semak medan sedemikian untuk kesamaan menggunakan kaedah statik Objects.equals(Object, Object) .
  5. Apabila anda selesai menulis kaedah equals anda , tanya diri anda tiga soalan: Adakah ia simetri? Adakah ia transitif? Adakah dia konsisten?

Dan ingat, sentiasa mengatasi hashCode apabila mengatasi sama dengan .
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION