2010-09-08 41 views
27

Tôi tự hỏi về hiệu suất của Java HashMap so với JSONObject.Java HashMap vs JSONObject

Dường như JSONObject lưu trữ dữ liệu nội bộ bằng cách sử dụng HashMap. Nhưng JSONObject có thể có thêm chi phí so với HashMap.

Có ai biết về hiệu suất của Java JSONObject so với HashMap không?

Cảm ơn!

Trả lời

31

Như bạn đã nói, JSONObject được hỗ trợ bởi HashMap.

Do đó, hiệu suất sẽ gần như giống hệt nhau. JSONObject.get() thêm một kiểm tra rỗng, và sẽ ném một ngoại lệ nếu một phím không được tìm thấy. JSONObject.put() chỉ cần gọi map.put().

Vì vậy, hầu như không có phí. Nếu bạn đang xử lý các đối tượng JSON, bạn nên luôn luôn sử dụng JSONObject trên HashMap.

+6

Thực ra tôi không đồng ý với điều này - vì JSONObject cụ thể cho một thư viện, không giống như Bản đồ, việc hiển thị nó dưới dạng một loại sẽ thêm nhiều khớp nối hơn vào thư viện cụ thể và các kiểu dữ liệu của nó. Vì vậy, tôi sẽ không categorically nói nó nên luôn luôn được sử dụng. – StaxMan

+0

@Stax, tôi có thể thấy quan điểm của bạn. Tuy nhiên, nếu bạn cần phải tách một phần của mã, bạn luôn có thể tự mình trích xuất dữ liệu vào bản đồ. – jjnguy

+0

Đúng. Tôi đoán tổng thể nó là nhiều hơn một câu hỏi của POJOs vs abstractions thư viện cụ thể; Tôi muốn giữ các khía cạnh định dạng dữ liệu gần hơn với các cạnh. – StaxMan

7

tôi sẽ nói những câu hỏi không có ý nghĩa đối với một vài lý do:

  1. So sánh táo để cam: HashMap và JSONObject được dành cho 2 mục đích hoàn toàn khác nhau. Nó giống như yêu cầu "là lớp người hoặc lớp công ty hiệu quả hơn để lưu trữ một đối tượng PhoneNumber". Sử dụng những gì có ý nghĩa.
  2. Nếu bạn đang chuyển đổi sang/từ JSON, bạn có thể gửi dữ liệu đến một địa điểm xa (như trình duyệt của người dùng). Thời gian thực hiện để gửi dữ liệu này qua mạng và đánh giá dữ liệu đó trong trình duyệt của người dùng (có thể) sẽ làm lu mờ bất kỳ sự khác biệt về hiệu năng nào khi điền một Hashmap hoặc JSONObject.
  3. Có nhiều hơn 1 "JSONObject" thực hiện nổi xung quanh ra khỏi đó.
  4. Cuối cùng, bạn chưa hỏi về loại hiệu suất bạn muốn đo lường. Bạn đang thực sự lập kế hoạch để làm gì với các lớp học này?
1

JSONObject không có quá nhiều chi phí bổ sung trên đầu trang của HashMap. Nếu bạn đồng ý với việc sử dụng HashMap thì bạn sẽ không sao khi sử dụng JSONObject. Điều này được cung cấp bạn muốn tạo JSON.

JSONObject kiểm tra tính hợp lệ của các giá trị mà bạn đang lưu trữ như một phần của JSONObject của bạn, để đảm bảo giá trị phù hợp với thông số JSON. Ví dụ: Các giá trị NaN không tạo thành một phần của JSON hợp lệ. Ngoài ra, JSONObject có thể tạo ra các chuỗi json (thường xuyên | prettfied). Những chuỗi đó có thể khá lớn, tùy thuộc vào số lượng JSON. Ngoài ra, JSONObject sử dụng StringBuffer, vì vậy một trong nhiều thứ mà tôi sẽ làm là thay thế tất cả các lần xuất hiện của StringBuffer bằng StringBuilder.

JSONObject (từ org.json) là một trong các thư viện JSON đơn giản mà bạn có thể sử dụng. Nếu bạn muốn một cái gì đó rất hiệu quả, hãy sử dụng một cái gì đó giống như Jackson.

4

Câu trả lời hiện tại là chính xác, sự khác biệt về hiệu suất giữa hai điều này là không đáng kể.

Cả hai phương pháp cơ bản là không hiệu quả trong việc lưu trữ và thao tác dữ liệu. Phương pháp hiệu quả hơn thường liên kết với các đối tượng Java thông thường, sử dụng ít bộ nhớ hơn và truy cập nhanh hơn. Nhiều nhà phát triển sử dụng thư viện đơn giản (nguyên thủy) của org.json vì nó nổi tiếng, nhưng có thể là sự thay thế ít tiện lợi và hiệu quả nhất có sẵn.Các lựa chọn như Jackson và Gson là những cải tiến lớn nên rất đáng xem xét sử dụng chúng.