Java HashMap与JSONObject的区别

40

我想了解Java HashMap与JSONObject的性能。

似乎JSONObject使用HashMap来存储数据。 但是与HashMap相比,JSONObject可能具有额外的开销。

有没有人了解Java JSONObject与HashMap相比的性能情况?

谢谢!


你能指定一下你所提到的JSONObject所在的包吗? - somenickname
5个回答

51

正如你所说,JSONObject是由HashMap支持的。

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

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


9
实际上我不同意这个观点——因为JSONObject是特定于一个库的,与Map不同,将其公开作为一种类型会增加与特定库及其数据类型的耦合度。因此我不会绝对地说它应该总是被使用。 - StaxMan
@Stax,我理解你的观点。但是,如果你需要将代码的一部分解耦,你可以自己将数据提取到一个映射中。 - jjnguy
真的。我想总的来说,这更多是关于POJO与特定库抽象之间的问题;我喜欢将数据格式方面保持在边缘附近。 - StaxMan
性能上可能差别很小,但实际情况取决于您的数据,也可能取决于您的选择。我个人使用 Map<String, Object> response = new HashMap<>();。因为这是核心Java本地支持的,所以我更喜欢它。否则,我也尝试过来自Google Gson库的JsonObject。还有一些人可以使用POJO。就性能而言,POJO会更好,但不适合通用情况。 - Noor Khan

6
我认为这个问题有几个不合理之处:
  1. 比较苹果和橙子:HashMap和JSONObject的用途完全不同。这就像问“存储PhoneNumber对象,Person类或Company类更有效”。使用有意义的东西。
  2. 如果你正在转换JSON数据,你可能会将数据发送到一个远离的地方(比如用户的浏览器)。将数据通过网络发送并在用户的浏览器中进行评估所需的时间(很可能)远远超过填充Hashmap或JSONObject的性能差异。
  3. 有不止一种“JSONObject”实现方法。
  4. 最后,你没有问关于你想要衡量什么样的性能。你实际上打算用这些类做什么?

5

现有答案是正确的,两者之间的性能差异微不足道。

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


1

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

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

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


0
唯一的性能开销在于数据类型转换!因为你的JSONObject将数据存储在一个对象的HashMap中,并且它会将数据类型转换为你想要的类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接