我有一个很大的String
,我需要在其中替换一些字符串路径。
我编写了如下代码,并且在部署的环境中获得了非常大的内存使用量。
我已经在网上阅读了,看看是否有任何更优化的方法可以重写,但找不到决定性的答案。
任何人都可以对下面的代码给出任何建议。
String response = "@very #large & string % STUFF";
System.out.println(response);
String[] SPECIAL_CHARACTERS = {"&","%","#","STUFF"};
for(int count = 0;count<SPECIAL_CHARACTERS.length;count++)
{
if(response.contains(SPECIAL_CHARACTERS[count]))
{
response = response.replace(SPECIAL_CHARACTERS[count],"");
}
}
System.out.println(response);
我有一个很大的
String
,我需要替换几个字符。
我会避免陷入这种情况。 流式传输您的数据! (为什么数据库中存储了一个"非常大"的字符串? 这听起来不太好。
如果不能,这是执行您正在执行的操作的最节省内存的方法:
int len = response.length();
for (int i = 0; i < len; i++) {
char ch = response.charAt(i);
switch (ch) {
case '&': case '%': case '#': case '@':
break;
default:
System.out.print(ch);
}
}
System.out.println();
在某些情况下,最好使用StringBuilder
,以便可以执行单个写入操作。
int len = response.length();
StringBuilder temp = new StringBuilder(len);
for (int i = 0; i < len; i++) {
char ch = response.charAt(i);
switch (ch) {
case '&': case '%': case '#': case '@':
break;
default:
temp.append(ch);
}
}
System.out.println(temp.toString());
但这会分配更多的内存。
我会通过从输入中读取数据包并将它们附加到输出来解决此类问题。所以,假设非常大的String
被称为input
,我总是会从input
读取易于管理的数据包到temp
,执行替换temp
的算法,然后将temp
附加到output
,应该在循环之前初始化为空String
。
您遇到的问题是您总是在更换整个String
。因此,与其每次都替换响应,不如对较小的数据包进行所有替换,并将结果添加到String
变量中。