2010-09-08 20 views
27

Me pregunto acerca del rendimiento de Java HashMap vs JSONObject.Java HashMap vs JSONObject

Parece que JSONObject almacena datos internamente usando HashMap. Pero JSONObject podría tener una sobrecarga adicional en comparación con HashMap.

¿Alguien sabe sobre el rendimiento de Java JSONObject en comparación con HashMap?

Gracias!

Respuesta

31

Como dijo, JSONObject está respaldado por un HashMap.

Debido a esto, el rendimiento será casi idéntico. JSONObject.get() agrega una verificación nula, y generará una excepción si no se encuentra una clave. JSONObject.put() solo llama al map.put().

Por lo tanto, casi no hay sobrecarga. Si está tratando con objetos JSON, debe siempre usar JSONObject sobre HashMap.

+6

En realidad no estoy de acuerdo con esto, ya que JSONObject es específico de una biblioteca, a diferencia de Maps, al exponerlo como un tipo agregará más acoplamiento a una biblioteca específica y sus tipos de datos. Entonces no diría categóricamente que siempre debería usarse. – StaxMan

+0

@Stax, puedo ver su punto. Pero, si necesita desvincular una parte del código, siempre puede extraer los datos en un mapa usted mismo. – jjnguy

+0

Es cierto. Creo que en general es más una cuestión de POJOs vs abstracciones específicas de la biblioteca; Me gusta mantener los aspectos de formato de datos más cerca de los bordes. – StaxMan

7

yo diría que la pregunta no tiene sentido por varias razones:

  1. comparar manzanas con naranjas: HashMap y JSONObject están destinados para 2 fines completamente diferentes. Es como preguntar "es la clase Person o Company class más eficiente para almacenar un objeto PhoneNumber". Usa lo que tiene sentido
  2. Si está convirtiendo a/desde JSON, es probable que envíe los datos a un lugar lejano (como el navegador de un usuario). El tiempo necesario para enviar estos datos a través de la red y evaluarlos en el navegador del usuario (muy probablemente) eclipsará las diferencias de rendimiento al llenar un Hashmap o JSONObject.
  3. Hay más de 1 implementación de "JSONObject" flotando por ahí.
  4. Finalmente, no ha preguntado qué tipo de rendimiento le gustaría medir. ¿Qué piensas hacer con estas clases?
1

JSONObject no tiene demasiada sobrecarga adicional en la parte superior de un HashMap. Si está de acuerdo con el uso de un HashMap, entonces debería estar bien usando un JSONObject. Esto se proporciona si desea generar JSON.

JSONObject comprueba la validez de los valores que está almacenando como parte de su JSONObject, para asegurarse de que se ajusta a la especificación JSON. Por ej. Los valores NaN no forman parte de JSON válido. Aparte de esto, JSONObject puede generar cadenas json (regular | prettfied). Esas cadenas pueden ser bastante grandes, dependiendo de la cantidad de JSON. Además, JSONObject usa StringBuffer, por lo que una de las muchas cosas que haría sería reemplazar todas las instancias de StringBuffer con StringBuilder.

JSONObject (de org.json) es una de las bibliotecas JSON simples que puede usar. Si quieres algo muy eficiente, usa algo como Jackson.

4

Las respuestas existentes son correctas, las diferencias de rendimiento entre las dos son insignificantes.

Ambos son básicamente métodos bastante ineficientes para almacenar y manipular datos. Por lo general, un método más eficiente consiste en enlazar objetos regulares de Java, que usan menos memoria y son más rápidos de acceder. Muchos desarrolladores usan la biblioteca simple (primitiva) de org.json porque es bien conocida, pero es posible la alternativa menos conveniente y eficiente disponible.Opciones como Jackson y Gson son grandes mejoras, por lo que vale la pena considerar su uso.