Java HashMap 与 JSONObject

Posted

技术标签:

【中文标题】Java HashMap 与 JSONObject【英文标题】:Java HashMap vs JSONObject 【发布时间】:2011-04-09 21:26:36 【问题描述】:

我想知道 的性能。

似乎 JSONObject 在内部使用 HashMap 存储数据。但与 HashMap 相比,JSONObject 可能会有额外的开销。

有没有人知道Java JSONObject 与HashMap 相比的性能?

谢谢!

【问题讨论】:

你能指定你所指的JSONObject所在的包吗? 【参考方案1】:

正如你所说,JSONObjectHashMap 支持。

因此,性能几乎相同。 JSONObject.get() 添加了一个空检查,如果没有找到键,将抛出异常。 JSONObject.put() 只需调用 map.put()

因此,几乎没有开销。如果您正在处理 JSON 对象,您应该始终使用 JSONObject 而不是 HashMap

【讨论】:

实际上我不同意这一点——因为 JSONObject 是特定于一个库的,与 Maps 不同,将它作为一种类型公开会增加与特定库及其数据类型的耦合。所以我不会断然说它应该总是被使用。 @Stax,我明白你的意思。但是,如果您需要解耦部分代码,您始终可以自己将数据提取到地图中。 是的。我想总体而言,这更像是 POJO 与特定于库的抽象的问题。我喜欢让数据格式方面更接近边缘。【参考方案2】:

我会说这个问题没有意义有几个原因:

    比较苹果和橘子:HashMap 和 JSONObject 用于两个完全不同的目的。这就像在问“Person 类或 Company 类对于存储 PhoneNumber 对象是否更有效”。使用有意义的东西。 如果您正在与 JSON 进行转换,您可能会将数据发送到很远的地方(例如用户的浏览器)。通过网络发送此数据并在用户浏览器中对其进行评估所花费的时间将(可能)远远超过填充 Hashmap 或 JSONObject 的任何性能差异。 那里有不止 1 个“JSONObject”实现。 最后,您还没有询问您想要衡量哪种性能。您实际上打算用这些课程做什么?

【讨论】:

【参考方案3】:

现有答案是正确的,两者之间的性能差异可以忽略不计。

这两种方法基本上都是存储和操作数据的效率很低的方法。更有效的方法通常是绑定到常规 Java 对象中,这些对象使用更少的内存并且访问速度更快。许多开发人员使用 org.json 的简单(原始)库,因为它是众所周知的,但它可能是最不方便和有效的替代方案。像 Jackson 和 Gson 这样的选择是很大的改进,因此值得考虑使用它们。

【讨论】:

【参考方案4】:

JSONObject 在 HashMap 之上没有太多额外的开销。如果您可以使用 HashMap,那么您应该可以使用 JSONObject。前提是您要生成 JSON。

JSONObject 检查作为 JSONObject 一部分存储的值的有效性,以确保它符合 JSON 规范。例如NaN 值不构成有效 JSON 的一部分。除此之外,JSONObject 可以生成 json 字符串(常规 | 美化)。这些字符串可能会变得非常大,具体取决于 JSON 的数量。此外,JSONObject 使用 StringBuffer,所以我会做的许多事情之一就是用 StringBuilder 替换所有出现的 StringBuffer。

JSONObject(来自 org.json)是您可以使用的简单 JSON 库之一。如果您想要一些非常有效的东西,请使用杰克逊之类的东西。

【讨论】:

【参考方案5】:

唯一的性能开销是转换数据!当您 JSONObject 将数据存储在对象的 HashMap 上时,它会转换您想要的数据类型。

【讨论】:

以上是关于Java HashMap 与 JSONObject的主要内容,如果未能解决你的问题,请参考以下文章

JSONObject JSONArray json字符串 HashMap ArryList 在java开发中用到的数据结构

JAVA 中 提取 alibaba.fastjson.JSONObject 字符串中的 KEY 和 VALUE 值

目标 C 的 JSONObject Java 等效项

将 HashMap<String, object> 放入 jsonobject

如何将java中的map转换成jsonobject

如何使用 ResponseEntity 返回 JSONObject 而不是 HashMap? (未找到类型返回值的转换器:类 org.json.JSONObject)