我们即将发布一个网站,一次最多可显示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?
答案 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)
如果要创建大量字符串,我建议创建一个字符串池。它将有助于内存管理,因为你可以控制一次可以存在的最大字符串数量,也可以更有效地使用它们,因为它们在不使用时可以重复使用。