2015-09-19 43 views
0

可以說我有若干自動添加到一個HashMap <整數,字符串>

public HashMap<Integer, String> matchup = new HashMap<>(); 

代替手動添加我將如何能夠通過100以1增加一個號碼,以便讓鍵。

可以說我有3個用戶,當他們點擊一個叫做的按鈕時,將我添加到隊列中他們通過在隊列中定義的整數鍵值添加到隊列中。

因此,如果第一個用戶點擊按鈕,他會自動爲鍵值1分配一個字符串。

因此,如果第二個用戶點擊按鈕,他會自動爲鍵值2分配一個字符串。

因此,如果第三個用戶點擊按鈕,他會自動爲鍵值3分配一個字符串。

等;

+0

使用計數器變量,每一次你的元素添加到地圖的時間增加了嗎? –

+0

如果映射關鍵字是直接索引,那麼你得到的可能更適合於ArrayList,即Map。 –

+0

爲了避免併發性問題,請使用timestamp值;它更安全,而不是整數漸進式。另一種方法是@JBNizet表示一個計數器變量,但不要忘記標記該方法以使該變量同步! –

回答

2

正如我在評論中提到VA31答覆 - 可以提高你的code.Just使它線程安全。

你可以試試下面的代碼:

public class Click { 

private AtomicInteger counter = new AtomicInteger(0); 
private Map<Integer, String> matchup = new ConcurrentHashMap<>(); 

public void onClick(String input) { 
    matchup.put(counter.incrementAndGet(), input); 
} 
} 
+0

你確定這是保證線程安全嗎?這些密鑰不會自己碰撞,但是現在或者在將來可能的/可選的HashMap實現中,可能會使用哈希(試圖同時寫入同一個hashbucket)?如果不是ConcurrentHashMap會更好。 –

+0

是的,你說得對 - 我們可以使用ConcurrentHashMap –

1

下面的代碼可能會有所幫助:

public class Click { 

    private static int counter = 0; 
    public static HashMap<Integer, String> matchup = new HashMap<>(); 

    public void onClick(String input) { 
     matchup.put(counter++, input); 
    } 
} 
+0

這段代碼不是線程安全的。如果你將並行運行 - 你會注意到,會有泄漏。 –

0

您可以使用將作爲計數器靜態變量:

public static Integer nextId = 0; 
... 
... 
matchup.put(++nextId, "any string..."); 
相關問題