如何避免在for循环中使用Java创建不必要的对象

时间:2015-09-30 10:29:00

标签: java json oop object

我正在使用java

创建以下json文件
JSONObject json = new JSONObject();
JSONArray vertex = new JSONArray();
for (int i = 0; i < num; i++) {
    JSONObject usr1 = new JSONObject();
    JSONObject usr2 = new JSONObject();

    // String na="name"+i
    usr1.put("type", "string");
    usr1.put("value", "name" + i);
    usr2.put("name", usr1);

    usr2.put("_id", Integer.toString(i));
    usr2.put("_type", "vertex");
    // v2.put(usr2);
    vertex.put(usr2);

    // email
    JSONObject usr3 = new JSONObject();
    JSONObject usr4 = new JSONObject();
    usr3.put("type", "string");
    usr3.put("value", "email" + i + "@gmail.com");
    usr4.put("email", usr3);

    usr4.put("_id", Integer.toString(i + num));
    usr4.put("_type", "vertex");
    vertex.put(usr4);
}
json.put("vertex", vertex);

num可能约为60,000-200,000。

但是在这里我一次又一次地创建java对象,这非常昂贵。我希望最小化对象创建,并且不想过多地更改代码结构。如何在不改变代码结构的情况下实现这一目标呢?

我使用org.codehaus.jettison.json包中的JSON *类。我必须将它写入json对象的文件

2 个答案:

答案 0 :(得分:2)

为了在不创建中间对象的情况下快速生成JSON,可以使用JSONWriter

StringWriter sw = new StringWriter();
JSONWriter writer = new JSONWriter(sw);
writer.object().key("vertex").array();
for (int i = 0; i < num; i++) {
    writer
        .object() // usr2
            .key("name")
                .object() // usr1
                    .key("type").value("string")
                    .key("value").value("name"+i)
                .endObject()
            .key("_id").value(Integer.toString(i))
            .key("_type").value("vertex")
        .endObject()
        .object() // usr4
            .key("email")
                .object() // usr3
                    .key("type").value("string")
                    .key("value").value("email"+i+"@gmail.com")
                .endObject()
            .key("_id").value(Integer.toString(i+num))
            .key("_type").value("vertex")
        .endObject();
}
writer.endArray().endObject();
String json = sw.toString();

此处StringWriter用于存储中间JSON文本。或者,您可以直接写入文件或网络套接字,而不必将其保留在内存中。

答案 1 :(得分:1)

你的json似乎就像

{
"vertex": [
    {
        "name": {
            "type": "string",
            "value": "name0"
        },
        "_id": 0,
        "_type": "vertex"
    },
    {
        "email": {
            "type": "string",
            "value": "email0@gmail.com"
        },
        "_id": 0,
        "_type": "vertex"
    },
    .....
]
}

在每个连续循环... 2 jsonobject已设置在vertext json数组上... 你可以通过在每个连续的循环中创建1个jsonobject来减小一半的大小

类似这样的事情

{
"vertex": [
    {
        "_id": 0,
        "_type": "vertex",
        "name": "name0",
        "email": "email0@gmail.com"
    },
    ....
]
}

你不会在json创作上做太多...

虽然我也不会觉得包含“_id”和“_type”键的意思...因为“_id”包含从0到num的索引,你可以使用顶点数组得到该索引...

因此你可以使用json的结构作为

{
"vertex": [
  {
    "name": "name0",
    "email": "email0@gmail.com"
  },
  ....
]
}

你的java代码可能会减少到这个......

JSONObject json = new JSONObject();
JSONArray vertex = new JSONArray();
for (int i = 0; i < num; i++) {
   vertex.put(new JSONObject().put("name", "name" + i).put("email", "email" + i + "@gmail.com"));
}
json.put("vertex", vertex);