java: HashMap <String, int> tidak berfungsi

128

HashMap<String, int>tampaknya tidak berfungsi tetapi HashMap<String, Integer>tidak berfungsi. Ada ide mengapa?

gklots
sumber
pilihan kata-kata Anda untuk pertanyaan Anda membingungkan, dapatkah Anda mengklarifikasi? Dan tepatnya apa yang tidak berfungsi, dapatkah Anda memposting kode?
Anthony Forloney

Jawaban:

203

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");
cletus
sumber
3
Contoh terakhir Anda tidak berfungsi: Tidak dapat melakukan cast dari Map <String, Integer> ke Map <Integer, String>
T3rm1
mempertimbangkan setiap kode yang terpisah di baris baru, kode pada baris 5 harus terlebih dahulu dilemparkan ke Integer sebelum menggunakan metode intValue () karena dianggap sebagai objek ketika Anda menggunakan metode get ().
pelajar baru
2

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.


sumber
0

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];
Younes Meridji
sumber
-3

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);
Chitrapal Singh
sumber
1
Ini tidak menjawab pertanyaan
smac89