用Java替换字符串的内存有效方法

时间:2016-06-27 01:13:04

标签: java regex memory jvm heap

我们即将发布一个网站,一次最多可显示500张图像,这些图像存储在亚马逊上。由于网址使用“http”而不是“https”存储在我们的数据库中,因此每次检索到图像网址时,我都需要用“https”替换“http”。这是当前的代码:

static Pattern p = Pattern.compile("http");

Matcher m = p.matcher(urlSmall);;
String secureUrlSmall = m.replaceFirst("https");
return secureUrlSmall;

我担心的是,通过创建如此多的String对象,我将占用Java堆空间。例如,有没有更好的解决方案涉及StringBuilder?

3 个答案:

答案 0 :(得分:3)

除了考虑java字符串池维护之外,还有几种解决方案。由于基于专家意见,我们无法做很多事情。建筑指导一直是通过使用适当的建模来避免对数据进行过度处理。

我不认为Java的改进是可行的,但如果我遇到这个问题,我会尝试以下方法:

我问自己一个问题 - 这些网址是否正确建模?如果要求将http或https附加到' Main'不同情况下的部分(域名/完整URL)。我宁愿存储' Main'分别在数据库中的URL的一部分,并在选择期间将http / https附加到它们。可以有多种方法来做到这一点。

如果此时无法更改数据库模型, 在选择查询期间将http替换为https的其他方法。

答案 1 :(得分:2)

使用正则表达式可能相对昂贵。如果你经常调用它,那么普通的字符串操作可以快得多

if (urlSmall.startsWith("http:"))
   return "https:" + urlSmall.substring(5);
if (urlSmall.startSwith("https:"))
   return urlSmall;
// error
  

我担心的是,通过创建如此多的String对象,我将占用Java堆空间。

你会创建大量垃圾,但是你只需从数据库中获取原始urlSmall就会产生更多垃圾。

除非你要将数据库缓存在内存中,否则我会接受使用数据库的速度可能足够快而不是尽可能快。

答案 2 :(得分:0)

如果要创建大量字符串,我建议创建一个字符串池。它将有助于内存管理,因为你可以控制一次可以存在的最大字符串数量,也可以更有效地使用它们,因为它们在不使用时可以重复使用。