亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果在 Java 中使用 toString 修改字符串時 StringBuilder 的效率

如果在 Java 中使用 toString 修改字符串時 StringBuilder 的效率

Helenr 2021-05-31 18:51:05
我的任務是優化使用 Cognos SDK 開發的應用程序,該應用程序在內容存儲庫中查詢所有包,然后將它們寫入 SQL 數據庫。該應用程序由我的前任編寫,并做了一些有趣的事情......它有幾個我禁用的手動 system.GC 調用,以及一個循環中的 System.wait(2000)。它目前在服務器架構上運行速度要快得多,但如果嘗試在普通客戶端上運行它,它將由于堆錯誤而崩潰。所以深入挖掘,我發現里面有成噸的弦。顯而易見的答案是更改為 StringBuilder,但如果我不得不在其中使用大量“toString”,我真的節省了內存嗎?理論上,這些字符串運算符中的每一個都應該有一個方法,但是我 我有點不愿意弄亂應用程序上的一些邏輯,我不得不查找如何具體地做每一個。抱歉,如果之前有人問過這個問題,但是在環顧了一個小時后我找不到一個。(順便說一句:整個方法的認知復雜度為 174,但其中相當一部分是 cognos 特定的,我不知道從哪里開始減少它。)這是我更改的示例(此循環在 ~450000 行輸入上運行多次)。此外,我在 for 循環之前不久將“express”更改為初始值為“”的 StringBuilder,這是其中的一部分:                        if (element.hasAttribute("expression") && element.getAttribute("expression") != "") {                        formula = element.getAttribute("expression");                        for (int k = 0; k < formula.length(); k++) {                            if (formula.charAt(k) == '<')                                exSearch++;                            if (exSearch == 0)                                express.append(formula.charAt(k));                            if (formula.charAt(k) == '>')                                exSearch--;                        }                        express.replace(0, express.length(),express.toString().replaceAll("\\s", ""));                        express.replace(0, express.length(),express.toString().replaceAll("&gt;", "<"));                        express.replace(0, express.length(),express.toString().replaceAll("&lt;", ">"));                        express.replace(0, express.length(),express.toString().replaceAll("&apos;", "'"));                        express.replace(0, express.length(),express.toString().replaceAll("&amp;", "&"));                    }                        if (express.length() > 1000) {                        express.replace(0, express.length(),express.toString().substring(0, 995) + "..." );                    }                    table = "CALCULATION";                    tableLoc = "CALCULATION";                    inBrackets = false; 
查看完整描述

2 回答

?
慕少森

TA貢獻2019條經驗 獲得超9個贊

是的,用 StringBuilder 替換字符串算術會對內存和性能產生影響。但是您的新代碼仍然使用所有 toString().replaceAll 和 toString().split 和 toString().substring() 調用進行大量字符串運算。擺脫所有這些。它們都是昂貴的并且完全沒有必要。

不要對字符串進行任何操作,而是在單個 StringBuilder 實例上進行所有操作。

至于內存不足,大多數這些字符串都是垃圾收集的,所以不清楚這會解決內存問題。但它肯定會改善情況。


查看完整回答
反對 回復 2021-06-02
?
莫回無

TA貢獻1865條經驗 獲得超7個贊

請為上帝的愛變換


  express = express.replaceAll("\\s", "");

  express = express.replaceAll("&gt;", "<");

  express = express.replaceAll("&lt;", ">");

  express = express.replaceAll("&apos;", "'");

  express = express.replaceAll("&amp;", "&");

進入


express = express.replace("\\s", "").replace("&gt;", "<").replace("&lt;", ">").replace("&apos;", "'").replace("&amp;", "&")



查看完整回答
反對 回復 2021-06-02
  • 2 回答
  • 0 關注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號