[英]Map generics in Java
我似乎對Java Generics有一些誤解,我希望你能幫助我。 我試圖像這樣創建一個地圖:
Map<Debater, int>
(Debater是我聲明的接口)但java抱怨int,所以我做了:
Map<Debater, Integer>
我想這是因為int不是一個類,而Integer是,這是正確的嗎?
此外,現在我得到一個Debater,我需要在地圖中添加1到它的值。 我怎么做?
是的,你是對的。
至於遞增:
map.put(debater, map.get(debater) + 1);
自動裝箱將負責對象和基元之間的“切換”。
請注意,如果您已經在地圖中沒有此debater的值,則此(如注釋中所述)將拋出NullPointerException
。 因此,如果你想做二合一,可以按如下方式重新加工:
map.put(debater, map.containsKey(debater) ? map.get(debater) + 1 : 1);
此外,現在我得到一個辯手,我需要在地圖中添加1
它的值。 我怎么做?
我建議您為此獲取AtomicInteger
,以便在多線程環境中更加安全。
Map<Debater, AtomicInteger> map = new HashMap<Debater, AtomicInteger>();
// ...
map.get(debater).incrementAndGet();
否則,您需要添加更多代碼來synchronize
更新,以避免線程獲得“錯誤”值。
我想這是因為int不是一個類,而Integer是,這是正確的嗎?
正確。
此外,現在我得到一個Debater,我需要在地圖中添加1的值。 我怎么做?
這應該做的伎倆:
map.put(debater, map.get(debater)+1);
你是對的,這是因為你必須指定一個類。
至於你的問題,你必須這樣做:
myMap.put(myDebater, myMap.get(myDebater) + 1);
int和Integer之間的所有轉換都將通過自動裝箱完成。
你對int與Integer部分是正確的。
要安全地增加值,請使用:
Integer currentValue = map.get(debater);
if(currentvalue == null) {
map.put(debater, 1);
} else {
map.put(debater, currentValue + 1);
}
或者你可以先使用map.contains(debater)
如果你想處理一個debater未單獨包含在地圖中的情況。
Java不允許在泛型中使用原始類型。 幸運的是,每個基本類型都有一個“box”引用類型,例如Integer
for int
, Boolean
for boolean
等。語言知道這種關聯,並且可以為你做自動裝箱和拆箱。 這意味着您可以執行以下操作:
Integer i = 5;
i++;
您必須注意自動裝箱/拆箱的一些注意事項。 典型的例子如下:
List<Integer> list = new ArrayList<Integer>();
list.add(3); // this is autoboxed, and calls list.add(E)
list.remove(3); // this invokes list.remove(int) overload !!!!
list.remove((Integer) 3) // this is how you call list.remove(E)
你會發現上面的代碼將拋出IndexOutOfBoundsException
,因為第一個remove
嘗試刪除第3個元素,而不是元素3。
您不能使用原始類型(例如int
, float
, char
等)作為泛型類型 - Java中的集合是通用的。 這就是你必須使用Integer
而不是int
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.