2010-09-08 2 views
27

Мне интересно о производительности Java HashMap vs JSONObject.Java HashMap vs JSONObject

Кажется, что JSONObject хранит данные внутренне, используя HashMap. Но у JSONObject могут быть дополнительные накладные расходы по сравнению с HashMap.

Знает ли кто-нибудь о производительности Java JSONObject по сравнению с HashMap?

Спасибо!

ответ

31

Как вы сказали, JSONObject подкрепляется HashMap.

Из-за этого производительность будет почти одинаковой. JSONObject.get() добавляет нулевую проверку и генерирует исключение, если ключ не найден. JSONObject.put() просто звонит map.put().

Итак, накладных расходов почти нет. Если вы имеете дело с объектами JSON, вы должны всегда использовать JSONObject над HashMap.

+6

На самом деле я не согласен с этим - поскольку JSONObject специфичен для одной библиотеки, в отличие от Карт, раскрывая ее как тип, будет добавлено больше связывания с конкретной библиотекой и ее типами данных. Поэтому я бы категорически не сказал, что его всегда следует использовать. – StaxMan

+0

@Stax, я вижу вашу точку зрения. Но если вам нужно отделить часть кода, вы всегда можете извлечь данные на карту самостоятельно. – jjnguy

+0

Правда. Я предполагаю, что в целом это скорее вопрос POJOs и абстракций, специфичных для библиотеки; Мне нравится держать аспекты формата данных ближе к краям. – StaxMan

7

Я бы сказал, что вопрос не имеет смысла по нескольким причинам:

  1. сравнивают яблоки с апельсинами: HashMap и JSONObject предназначены для 2-х совершенно разных целей. Это похоже на запрос: «Класс Person или класс компании более эффективен для хранения объекта PhoneNumber». Используйте то, что имеет смысл.
  2. Если вы конвертируете в/из JSON, вы, скорее всего, отправляете данные в отдаленное место (например, в браузер пользователя). Время, затраченное на отправку этих данных по сети и их оценку в браузере пользователя (вероятно), затмевает любые различия в производительности при заполнении Hashmap или JSONObject.
  3. Существует более чем 1 реализация «JSONObject», плавающая вокруг.
  4. И, наконец, вы не спросили о том, какую производительность вы хотели бы измерить. Что вы на самом деле планируете делать с этими классами?
1

JSONObject не имеет слишком много дополнительных накладных расходов сверху HashMap. Если вы используете HashMap, вы должны быть в порядке, используя JSONObject. Это обеспечивается тем, что вы хотите создать JSON.

JSONObject проверяет правильность значений, которые вы храните как часть вашего JSONObject, чтобы убедиться, что он соответствует спецификации JSON. Напр. Значения NaN не составляют часть действительного JSON. Кроме того, JSONObject может генерировать строки json (обычный | prettfied). Эти строки могут стать довольно большими, в зависимости от количества JSON. Кроме того, JSONObject использует StringBuffer, поэтому одна из многих вещей, которые я бы сделал, - это заменить все вхождения StringBuffer на StringBuilder.

JSONObject (from org.json) - одна из простых библиотек JSON, которые вы можете использовать. Если вы хотите что-то очень эффективное, используйте что-то вроде Джексона.

4

Существующие ответы правильные, различия в производительности между ними незначительны.

Оба являются в основном довольно неэффективными методами хранения и обработки данных. Более эффективный метод обычно связывается с обычными объектами Java, которые используют меньше памяти и быстрее получают доступ. Многие разработчики используют простую (примитивную) библиотеку org.json, потому что она хорошо известна, но возможно наименее удобная и эффективная альтернатива.Такие варианты, как Джексон и Гсон, являются большими улучшениями, поэтому стоит рассмотреть возможность их использования.

Смежные вопросы