2013-06-03 27 views
13

mã Java đơn giản này cho biết thêm 2 để một bộ long, và sau đó in dù 2 là thành viên của tập:Mã Java bằng cách sử dụng HashSet của thời gian không hoạt động?

import java.util.*; 

class A { 
    public static void main(String[] args) { 
     HashSet<Long> s = new HashSet<Long>(); 
     long x = 2; 
     s.add(x); 
     System.out.println(s.contains(2)); 
    } 
} 

Nó nên in true từ 2 là trong bộ này, nhưng thay vào đó nó in false. Tại sao?

$ javac A.java && java A 
false 
+0

Thử sử dụng đối tượng 'Long' thay vì nguyên thủy' long'. –

+0

@LuiggiMendoza - Một nguyên thủy dài hạn sẽ hoạt động tốt vì hộp số tự động. Vấn đề là nó là một nguyên thủy 'int'. –

+0

Xin lỗi, bạn nói đúng. Chữ 2 được xử lý như 'int' do đó được tự động đóng hộp thành' Integer'. –

Trả lời

21

bộ của bạn có chứa các trường hợp Long và bạn đang tìm kiếm một Integer (loại vào đó một int được đóng hộp khi một Object được yêu cầu).

thử nghiệm

System.out.println(s.contains(Long.valueOf(2))); 

hoặc

System.out.println(s.contains(2L)); 
+11

Tôi muốn nhập "2L" ('L' chữ hoa) thay vì "2l", vì 2l có thể trông giống như hai mươi mốt. –

+0

@MarlonBernardes Đã chỉnh sửa: '2l' đã thay đổi thành' 2L'. –

1

cửa hàng Hashset của bạn đối tượng Long và không int/Integer .. Bạn đang cố gắng để có được một Integer nơi int được đóng hộp trong khi một đối tượng được yêu cầu.

+0

Cải thiện đáng kể. Lưu ý của tôi hiện đã bị xóa. –

6

Khi bạn nói s.contains(2), nó tìm kiếm 2 theo mặc định là int, được đóng hộp thành Integer. Nhưng đối tượng bạn đã lưu trữ là Long. Vì vậy, nó trả về false

Hãy thử sử dụng s.contains(Long.valueOf(2)) để thay thế.

+0

Trên thực tế, đối tượng được lưu trữ là một 'Long', không phải là' long'. Nhưng +1 để có được bản chất của vấn đề chính xác. –

+0

Rất tiếc. Chỉ là một lỗi đánh máy. Cảm ơn bạn đã thông báo. :) –

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