HashMap<String, int>tampaknya tidak berfungsi tetapi HashMap<String, Integer>tidak berfungsi. Ada ide mengapa?
HashMap<String, int>tampaknya tidak berfungsi tetapi HashMap<String, Integer>tidak berfungsi. Ada ide mengapa?
Jawaban:
Anda tidak bisa menggunakan tipe primitif sebagai argumen umum di Java. Gunakan sebaliknya:
Map<String, Integer> myMap = new HashMap<String, Integer>();
Dengan auto-boxing / unboxing ada sedikit perbedaan dalam kode. Tinju otomatis berarti Anda dapat menulis:
myMap.put("foo", 3);
dari pada:
myMap.put("foo", new Integer(3));
Auto-boxing berarti versi pertama secara implisit dikonversi ke versi kedua. Buka kotak otomatis berarti Anda dapat menulis:
int i = myMap.get("foo");
dari pada:
int i = myMap.get("foo").intValue();
Panggilan implisit ke intValue()berarti jika kunci tidak ditemukan itu akan menghasilkan NullPointerException, misalnya:
int i = myMap.get("bar"); // NullPointerException
Alasannya adalah tipe erasure . Tidak seperti, katakanlah, dalam C # tipe generik tidak dipertahankan saat runtime. Mereka hanya "gula sintaksis" untuk casting eksplisit untuk menghemat Anda melakukan ini:
Integer i = (Integer)myMap.get("foo");
Sebagai contoh, kode ini legal:
Map<String, Integer> myMap = new HashMap<String, Integer>();
Map<Integer, String> map2 = (Map<Integer, String>)myMap;
map2.put(3, "foo");
GNU Trove mendukung ini tetapi tidak menggunakan obat generik. http://trove4j.sourceforge.net/javadocs/gnu/trove/TObjectIntHashMap.html
Anda tidak dapat menggunakan tipe primitif di HashMap. int, atau doubletidak bekerja. Anda harus menggunakan tipe penutupnya. sebagai contoh
Map<String,Integer> m = new HashMap<String,Integer>();
Sekarang keduanya adalah objek, jadi ini akan berhasil.
int adalah tipe primitif, Anda bisa membaca apa artinya tipe primitif di java di sini , dan Peta adalah antarmuka yang memiliki objek sebagai input:
public interface Map<K extends Object, V extends Object>
objek berarti kelas, dan itu juga berarti bahwa Anda dapat membuat kelas lain yang keluar darinya, tetapi Anda tidak bisa membuat kelas yang keluar dari int. Jadi Anda tidak bisa menggunakan variabel int sebagai objek. Saya punya solusi untuk masalah Anda:
Map<String, Integer> map = new HashMap<>();
atau
Map<String, int[]> map = new HashMap<>();
int x = 1;
//put x in map
int[] x_ = new int[]{x};
map.put("x", x_);
//get the value of x
int y = map.get("x")[0];
Anda dapat menggunakan tipe referensi dalam argumen umum, bukan tipe primitif. Jadi di sini Anda harus menggunakannya
Map<String, Integer> myMap = new HashMap<String, Integer>();
dan menyimpan nilai sebagai
myMap.put("abc", 5);