【问题标题】:What's the complexity of getJSONObject and getJSONArray methods?getJSONObject 和 getJSONArray 方法的复杂性是什么?
【发布时间】:2015-10-28 13:46:04
【问题描述】:

我正在使用 org.json 库作为我的 Java 应用程序的 JSON 客户端,我想知道这个库中一些方法的复杂性。

我正在通过它的 HTTP API 从数据库中检索另一个 JSON 对象(等等)内的 JSON 数组内的数千个 JSON 对象。作为示例(仅作为示例,我的情况要复杂得多),假设我正在做类似的事情:

// Ignoring attributes types
import org.json.*;

public static void main(String[] args) {
    response = MyHTTPClient.post(url, query).asJSON();
    response = JSON.parse(response);
    data = response.getJSONObject(1).getJSONArray("results").getJSONObject(0);
}

org.json 库中的 getJSONObject(int)getJSONArray(String) 方法的复杂性是什么?它是以恒定 [O(1)] 还是线性 [O(n)] 时间运行的?如果没有,正确答案是什么?

【问题讨论】:

  • 所有这些都是开源的,你可以查看它在做什么。在我的脑海中,我认为 JSONObject 是 HashMap 支持的,而 JSONArray 是 ArrayList 支持的,所以 get* 将是 O(1)。
  • 当您从字符串(或 JSONTokener)实例化 JSONObject 时,org.json 将解析整个 JSON 文档。 getJSONObject() 和 getJSONArray() 方法只是非类型化 get() 方法(返回 Object 实例)的类型化版本。如果查看源代码,您会发现 JSONObject 使用 HashMap 而 JSONArray 使用 ArrayList 进行内部表示,因此执行时间接近恒定 (O(1))

标签: java json time-complexity asymptotic-complexity org.json


【解决方案1】:

当您从字符串(或JSONTokener)实例化JSONObject 时,org.json 将解析整个 JSON 文档。 getJSONObject()getJSONArray() 方法只是非类型化 get() 方法(返回 Object 实例)的类型化版本。如果您查看源代码,您会发现 JSONObject 使用 HashMapJSONArray 使用 ArrayList 进行内部表示,因此执行时间接近恒定 (O(1))

【讨论】:

    【解决方案2】:

    getJSONArraygetJSONObject 和方法最终都会调用从 HashMap 获取值的 opt(String paramString) 方法。所以他们应该在接近恒定的时间内工作,即理想的 O(1)。这是一个代码sn-p:

    public Object opt(String paramString)
    {
      return paramString == null ? null : map.get(paramString);
    }
    

    你可以自己看源码,深入挖掘。

    【讨论】:

      猜你喜欢
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 2014-08-06
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多