Rumah >Java >javaTutorial >Apakah perbezaan utama antara `HashMap map = new HashMap();` dan `Map map = new HashMap();` dalam Java?

Apakah perbezaan utama antara `HashMap map = new HashMap();` dan `Map map = new HashMap();` dalam Java?

Susan Sarandon
Susan Sarandonasal
2024-11-27 14:00:14673semak imbas

What is the key difference between `HashMap map = new HashMap();` and `Map map = new HashMap();` in Java?

Perbezaan Antara HashMap dan Map dalam Java

Apabila mentakrifkan peta dalam Java, pengguna mungkin menghadapi variasi seperti:

HashMap<String, Object> map = new HashMap<String, Object>();
Map<String, Object> map = new HashMap<String, Object>();

Pendasar Objek

Walaupun terdapat perbezaan ini, kedua-duanya memetakan pengisytiharan menghasilkan objek asas yang sama: HashMap. Perbezaannya terletak pada antara muka yang melaluinya objek itu diakses.

Perbezaan Antara Muka

Dalam contoh pertama, jenis antara muka ialah HashMap, menyediakan akses terus kepada kaedah khusus HashMap. Dalam contoh kedua, jenis antara muka ialah Map, menawarkan antara muka yang lebih generik kepada HashMap yang mendasari.

Pengekodan kepada Antara Muka

Secara amnya, ia disyorkan untuk membuat kod kepada antara muka yang paling abstrak (Peta di sini) dan bukannya pelaksanaan tertentu (HashMap). Ini membolehkan fleksibiliti dalam mengubah pelaksanaan asas tanpa melanggar kod sedia ada.

Contoh Pecah Kontrak

Pertimbangkan kelas Foo dengan dua HashMaps:

class Foo {
    private HashMap<String, Object> things;
    private HashMap<String, Object> moreThings;

    // Getters and methods using HashMaps
}

Subkelas SpecialFoo menggunakan perkara dan lebih banyak perkara melalui kaedah yang dijangka HashMaps:

class SpecialFoo extends Foo {
    // Methods using HashMaps
}

Jika Foo dikemas kini kemudian untuk menggunakan TreeMaps dan bukannya HashMaps, jenis tandatangan benda dan lebih banyak perkara berubah. Akibatnya, SpecialFoo rosak kerana ia menjangkakan HashMaps tetapi kini menerima TreeMaps.

Penyelesaian: Mengisytiharkan Koleksi sebagai Antara Muka

Untuk mengelakkan pelanggaran kontrak sedemikian, isytiharkan koleksi sebagai antara muka paling abstrak yang mungkin:

class Foo {
    private Map<String, Object> things;
    private Map<String, Object> moreThings;

    // Getters and methods using Maps
}

Pendekatan ini memastikan bahawa SpecialFoo tidak akan rosak jika pelaksanaan Foo berubah.

Faedah Pengekodan kepada Antara Muka

  • Peningkatan fleksibiliti dan kebolehselenggaraan
  • Mengurangkan risiko pecah kontrak
  • Pematuhan kepada prinsip reka bentuk perisian (cth., enkapsulasi, penyongsangan kebergantungan)

Oleh itu, walaupun dua pengisytiharan peta mungkin kelihatan berbeza, ia menghasilkan objek asas yang sama. Amalan terbaik menentukan pengekodan kepada antara muka yang paling abstrak untuk mengekalkan fleksibiliti dan mengelakkan pecah kod.

Atas ialah kandungan terperinci Apakah perbezaan utama antara `HashMap map = new HashMap();` dan `Map map = new HashMap();` dalam Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn