2010-03-24 38 views
24

Trình biên dịch phàn nàn về mã này:Tại sao trình biên dịch Java không giống như int nguyên thủy như kiểu cho các giá trị trong HashMap?

HashMap<String,int> userName2ind = new HashMap<String,int>(); 
    for (int i=0; i<=players.length; i++) { 
     userName2ind.put(orderedUserNames[i],i+1); 
    } 

Nó viết "loại bất ngờ" và điểm trên int. Nếu tôi thay thế int theo Stringi+1 theo i+"1", quá trình biên dịch sẽ thành công. Có gì sai ở đây?

+0

Không i + "1" kết thúc bằng "01" cho i == 0; "11" cho i == 1 vv? – extraneon

+0

Có. i + "1" kết thúc bằng "01" cho i == 0, v.v. – Roman

+0

googling "java hashmap int" trỏ tới nhiều tài liệu tham khảo đã yêu cầu/giải quyết vấn đề này. Hãy nghiên cứu câu hỏi của bạn trước. – user2573153

Trả lời

41

Đó là tốt với Integer, nhưng không ổn với int - Java generics only work with reference types, về cơ bản :(

Hãy thử điều này - mặc dù nhận thức được nó sẽ hộp tất cả mọi thứ:

HashMap<String,Integer> userName2ind = new HashMap<String,Integer>(); 
for (int i=0; i<=players.length; i++) { 
    userName2ind.put(orderedUserNames[i],i+1); 
} 
2

Nếu bạn có bộ sưu tập nhỏ, sau đó sử dụng các loại tham chiếu có lẽ là tốt, nhưng có những lựa chọn thay thế và tốt nhất là trove4j. Trove thực hiện một công việc khá tốt trong việc tái tạo API bộ sưu tập bằng cách sử dụng thuần túy nguyên thủy. nhiều trường hợp, hiệu suất tốt hơn khi chèn/tra cứu. Ví dụ của bạn sẽ trông giống như sau:

TObjectIntHashMap<String> userName2ind = new TObjectIntHashMap<String>(); 
for (int i=0; i<=players.length; i++) { 
    userName2ind.put(orderedUserNames[i],i+1); 
} 

Nhược điểm duy nhất, theo kinh nghiệm của tôi là không có cách nào khác để quản lý an toàn luồng.

Các vấn đề liên quan