2010-01-05 63 views
6

Xin chào, tôi có câu hỏi về việc có nên sử dụng số ArrayList hoặc HashMap hay không.Sử dụng ArrayList hoặc HashMap

Tôi đang cố gắng xây dựng chương trình Paint. Mỗi đối tượng được vẽ sẽ được gán một đối tượng duy nhất ID.

Nếu tôi muốn có tốc độ truy xuất nhanh khi tôi nhấp vào một đối tượng, tôi có nên sử dụng arraylist hoặc hashmap không?

Trong băm chung có O (1) trong khi danh sách mảng có tốc độ truy xuất O (n).

Tuy nhiên, tôi nghĩ cho trường hợp của mình, vì khi tôi nhấp vào một đối tượng, tôi sẽ lấy ID, do đó chỉ mục của mảng và tôi có thể làm một cái gì đó như ArraylistObject.get (ithElement); , trong trường hợp này, đây cũng sẽ là một quá trình truy xuất O (1)?

bất kỳ đầu vào nào?

Cảm ơn!

+0

ID của bạn có giống với chỉ mục của bạn trong mảng không? –

Trả lời

6

Nếu đối tượng có ID có thể được ánh xạ từ 1 đến 1 thành mảng hơn là truy cập O (1), và trong thực tế sẽ nhanh hơn một chút so với tra cứu băm (bạn không có để tính toán băm).

Tuy nhiên, vấn đề sẽ xảy ra khi bạn xóa một đối tượng. Bạn sẽ bị bỏ lại với một lỗ hổng trong danh sách. Khi tạo các đối tượng mới, bạn có thể tiếp tục thêm vào danh sách và để nó dần dần bị phân mảnh hoặc cố gắng tìm một rãnh rảnh rỗi trong trường hợp bạn sẽ thực hiện tìm kiếm O (n) cho một khoảng trống.

Tóm lại - một hashmap có lẽ phù hợp hơn.

+2

Nếu nó là một ArrayList trong Bộ sưu tập Java, thì mảng sẽ tiếp giáp ngay cả sau khi xóa một đối tượng (quên các chi tiết triển khai).Tuy nhiên, nếu ID đối tượng giống với chỉ mục mảng, hành vi sẽ thậm chí còn hơn sau khi xóa một đối tượng nhất định, ID có thể bắt đầu trỏ đến một đối tượng hoàn toàn mới vì mọi thứ thay đổi để lấp đầy khoảng trống. Vì vậy, chắc chắn một HashMap. – Anurag

+0

Xin lỗi, quên rằng ArrayList thay đổi lại mảng cơ bản khi một phần tử bị loại bỏ (được một thời gian kể từ khi tôi làm Java), nhưng có điểm của bạn là rất hợp lệ mà các tài liệu tham khảo sau đó sẽ được vặn lên. – Paolo

+0

Toàn bộ điểm sử dụng ID làm chỉ mục là bạn sẽ không xóa các mục nhập, nhưng đặt chúng thành giá trị rỗng. –

1

Về mặt tích cực, bạn có thể có thể ép thêm một chút hiệu suất bằng cách thực hiện ArrayLists vừa phải. Nhưng việc xóa đồ vật sẽ là một nỗi đau của hoàng gia - như Paolo và Anurag đã nói, bạn sẽ phải đặt một phần giữ chỗ trống (null?) Hoặc để sắp xếp lại một số đối tượng khác để lấp đầy khoảng trống. Điều này có thể dẫn đến lỗi hiệu suất và lỗi cũ đơn giản. Mặt khác,

HashMaps. Đơn giản để sử dụng, hiệu suất được đảm bảo (trừ khi bạn phân bổ id của bạn thực sự xấu).

Và truy xuất đối tượng theo id có thể không trở thành nút cổ chai của ứng dụng của bạn. Khi nói đi, tối ưu hóa sớm là gốc của tất cả các ác.

1

Nếu bạn có thể đảm bảo rằng các ID sẽ được trong một phạm vi số tương đối nhỏ, sau đó bạn nên sử dụng một mảng đơn giản (với kích thước preinitialized để ID tối đa), chứ không phải là một ArrayList. Điều đó đảm bảo rằng bạn không vô tình xóa các mục nhập và thay đổi mọi thứ khác để lấp đầy khoảng trống, với mọi thứ kết thúc ở một chỉ mục sai. Một mảng đơn giản cũng sẽ nhanh hơn một chút so với ArrayList.

Nếu bạn không thể bảo đảm như vậy, hãy sử dụng HashMap. Rất khó có thể nhận thấy sự khác biệt về tốc độ và sẽ dễ bảo trì hơn.

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