簡體   English   中英

如何避免在for循環中用Java創建不必要的對象

[英]How to avoid unnecessary object creation in Java in a for loop

我正在使用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 *類, org.codehaus.jettison.json必須將其寫入json對象的文件中

為了快速生成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文本。 或者,您可以直接寫入文件或網絡套接字,而根本不將其保留在內存中。

你的json似乎像

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

在每個后續循環中...在文本json數組上設置了2個jsonobject ...您可以將大小減小一半...通過在每個后續循環中創建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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM