2013-02-09 44 views
8

Trong Java, có một HashMap đầy đủ đầy với dữ liệu hình thức như:Kiểm tra sự tồn tại của một HashMap chính

HashMap<Integer, int[]> map = new HashMap<Integer, int[]>(1000000, 1); 

gì là nhanh hơn khi kiểm tra sự tồn tại của một khóa ngẫu nhiên, nói 100:

if (map.get(100) == null)) 

hoặc

if (!map.containsKey(100)) 

?

Câu hỏi thú vị từ quan điểm tối ưu hóa vi mô.

+0

Tại sao bạn không thử nghiệm nó đơn giản? – rekire

+0

Tôi đã làm, nhưng nó cung cấp cho tất cả các thời gian thực hiện khác nhau trong một khoảng thời gian và nhiều hơn hoặc ít hơn như nhau. Vì vậy, tôi không biết điều gì thực sự nhanh hơn. –

Trả lời

15

Các containsKey nên rất nhẹ chậm hơn bởi vì nó kết quả trong một cuộc gọi chức năng thêm (nó chỉ gọi getEntry) (nó có thể được tối ưu hóa đi, tôi không chắc liệu Java sẽ làm như vậy). containsKey trông giống như:

public boolean containsKey(Object key) { 
    return getEntry(key) != null; 
} 

Nhưng lưu ý rằng containsKey thể mặt khác rất nhẹ nhanh trên Map hiện thực khác (nhưng có lẽ không phải những người trong Java API tiêu chuẩn).

Nói chung việc triển khai của tôi như sau: (tránh sự cần thiết cho containsKey)

int[] arr = map.get(100); 
if (arr == null) // doesn't exist 
    // do stuff 
else // exists 
    // do stuff with arr 

dưới đây sẽ chắc chắn thể chậm hơn so với ở trên: (nếu các mục mà bạn tìm kiếm tồn tại một số tiền hợp lý của thời gian)

if (!map.containsKey(100)) // doesn't exist 
    // do stuff 
else // exists 
{ 
    int[] arr = map.get(100); 
    // do stuff with arr 
} 

Edit: Nhờ zvzdhk cho việc cung cấp các nguồn containsKey. Tôi thực sự nên kiểm tra.

5

Thực tế cả hai cách tiếp cận đều giống nhau. Nếu bạn nhìn vào java.util.HashMap mã nguồn bạn có thể tìm containsKey tiếp theo thực hiện:

public boolean containsKey(Object key) { 
    return getEntry(key) != null; 
} 
+1

Vâng, @ downvoter, sửa tôi nếu tôi sai. – bsiamionau

2

Hai chỉ khác ở return loại trừ map.get(key) có thể trả lại bạn null trong trường hợp nếu nó một chìa khóa, tuy nhiên map.containsKey(key) sẽ đưa bạn trở boolean mà có thể được sử dụng để phân tán hai trường hợp có thể có của map.get(key) trở về null.

1

Không có sự khác biệt giữa hai phương pháp này. Sự khác biệt chính chỉ là những gì bạn sẽ làm tiếp theo. Nếu bạn cần giá trị sau đó, tất nhiên bằng cách nhận được bạn sẽ có giá trị.

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