我有一個回圈,它不斷為一些字串設定新值并對其進行研究,我認為我可以改進它。起初它很容易(這就是它的實際外觀),但我正在尋找一種方法來避免執行大量“ToString”,然后將該字串重置為“”。
private void obtenerProfCita(JSONArray catalogoDatos) {
String areaConsumer = "";
String resourceConsumer = "";
String activityConsumerid = "";
for(int i = 0; i < catalogoDatos.length(); i ) {
areaConsumer = catalogoDatos.getJSONObject(i).get("area_consumerid").toString();
resourceConsumer = catalogoDatos.getJSONObject(i).get("resource_consumerid").toString();
activityConsumerid = catalogoDatos.getJSONObject(i).get("activity_consumerid").toString();
if(StringUtils.isNotBlank(areaConsumer) && StringUtils.isNotBlank(resourceConsumer) && StringUtils.isNotBlank(activityConsumerid)) {
log.error("REFERENCIA TUOTEMPO:\nModulo: " i "\nCONSUL: " areaConsumer "\nIDPROF: " resourceConsumer);
TuotempoDAO.guardarActivityId(catalogoDatos.getJSONObject(i));//Guardar en BBDD el Activity_ID
}
areaConsumer = "";
resourceConsumer = "";
}
}
如您所見,這是一個基本的 for 回圈,但考慮到 JSONArray 非常大,我一直在尋找一種使用 StringBuilders 或 StringBuffers 并避免 JSON 陣列中的“ToStrings”的方法。
stringBuilders 的實際代碼:
private void obtenerProfCita(JSONArray catalogoDatos) {
StringBuilder areaConsumer = new StringBuilder();
StringBuilder resourceConsumer = new StringBuilder();
StringBuilder activityConsumerid = new StringBuilder();
for(int i = 0; i < catalogoDatos.length(); i ) {
areaConsumer.append(catalogoDatos.getJSONObject(i).get("area_consumerid").toString());
resourceConsumer.append(catalogoDatos.getJSONObject(i).get("resource_consumerid").toString());
activityConsumerid.append(catalogoDatos.getJSONObject(i).get("activity_consumerid").toString());
if(StringUtils.isNotBlank(areaConsumer) && StringUtils.isNotBlank(resourceConsumer) && StringUtils.isNotBlank(activityConsumerid)) {
log.error("REFERENCIA TUOTEMPO:\nModulo: " i "\nCONSUL: " areaConsumer "\nIDPROF: " resourceConsumer);
TuotempoDAO.guardarActivityId(catalogoDatos.getJSONObject(i));//Guardar en BBDD el Activity_ID
}
areaConsumer.setLength(0);
resourceConsumer.setLength(0);
}
}
我也懷疑使用 StringBuilder 而不是 String 的效率如何,如果有人可以向我解釋它會很棒。
編輯。感謝下面的 OH GOD SPIDERS,我改進了一些代碼。這是它現在的樣子:
private void obtenerProfCita(JSONArray catalogoDatos) {
StringBuilder areaConsumer = new StringBuilder();
StringBuilder resourceConsumer = new StringBuilder();
StringBuilder activityConsumerid = new StringBuilder();
for(int i = 0; i < catalogoDatos.length(); i ) {
areaConsumer.append(catalogoDatos.getJSONObject(i).get("area_consumerid"));
resourceConsumer.append(catalogoDatos.getJSONObject(i).get("resource_consumerid"));
activityConsumerid.append(catalogoDatos.getJSONObject(i).get("activity_consumerid"));
if (StringUtils.isNotBlank(areaConsumer)
&& StringUtils.isNotBlank(resourceConsumer)
&& StringUtils.isNotBlank(activityConsumerid)) {
log.error("REFERENCIA TUOTEMPO:\nModulo: " i "\nCONSUL: " areaConsumer "\nIDPROF: " resourceConsumer);
TuotempoDAO.guardarActivityId(catalogoDatos.getJSONObject(i));//Guardar en BBDD el Activity_ID
}
areaConsumer.setLength(0);
resourceConsumer.setLength(0);
activityConsumerid.setLength(0);
}
}
任何幫助表示贊賞
編輯2:
感謝您的所有幫助,我將根據最后的評論和答案修改我的代碼。
uj5u.com熱心網友回復:
不同之處在于,在回圈中連接大量字串時:
- 用例如 = 在回圈中連接字串會創建許多新的中間字串
- StringBuilder 沒有,它收集所有字串,然后在最后構建一個新字串(實際上我認為它有一個被填充的字符陣列/陣列串列,但這里的細節并不重要)。更少的記憶體使用,更少的復制字符。
對于少量的字串并不重要,但如果你的陣列很大,它應該很明顯。
uj5u.com熱心網友回復:
您的回圈沒有附加到字串,因此 usingStringBuilder不會提高性能。
我只會做兩件事:
- 將變數的宣告移到回圈中
- 僅獲取
catalogoDatos.getJSONObject(i)一次并將該參考存盤在區域變數中
這給出了以下代碼:
private void obtenerProfCita(JSONArray catalogoDatos) {
for (int i = 0; i < catalogoDatos.length(); i ) {
JSONObject o = catalogoDatos.getJSONObject(i);
String areaConsumer = o.get("area_consumerid").toString();
String resourceConsumer = o.get("resource_consumerid").toString();
String activityConsumerid = o.get("activity_consumerid").toString();
if (StringUtils.isNotBlank(areaConsumer) && StringUtils.isNotBlank(resourceConsumer) && StringUtils.isNotBlank(activityConsumerid)) {
log.error("REFERENCIA TUOTEMPO:\nModulo: " i "\nCONSUL: " areaConsumer "\nIDPROF: " resourceConsumer);
TuotempoDAO.guardarActivityId(o);//Guardar en BBDD el Activity_ID
}
}
}
StringBuilder.append()關于以某種方式解決以下需求的想法toString():
您認為如何StringBuilder.append()附加物件的字串表示形式?
大驚喜:它在toString()內部使用。
實際上,如果您查看 的內部結構StringBuilder.append(Object):
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
它呼叫String.valueOf(obj)的是
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
實際上,兩者之間的唯一區別
stringBuilder.append(obj);
和
stringBuilder.append(obj.toString());
是第一個版本正確處理了objnull 的情況,而在第二種情況下它會拋出一個NullPointerException.
uj5u.com熱心網友回復:
stringbuilder 創建一個物件,但對于 ' ',每次使用都會創建一個新的 Stringbuilder 物件并使用一次 tostring()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488818.html
