以下代码是否会导致内存泄漏?使用StringBuffer实际上会改善内存使用吗?
一点背景:一位同事一直在推动他关于内存泄漏的理论,这是他已经确定为代码问题的代码(没有进行任何类型的分析),他声称这可能导致内存泄漏。我不同意这一点,所以我想我会把它交给其他开发者来获得第三方意见。
List partCollection = new ArrayList()
String partKeyID = null;
String sPartNbr = null;
String partDescription = null;
while(rsPartRes.next())
{
partKeyID = rsPartRes.getString("PART_KEY_ID");
sPartNbr = rsPartRes.getString("PART_NBR");
partDescription = rsPartRes.getString("PART_DESC");
SomeValueObject someValueObject = new SomeValueObject();
someValueObject.setPartKeyID(partKeyID);
someValueObject.setSPartNbr(sPartNbr);
someValueObject.setPartDescription(partDescription);
partCollection.add(someValueObject);
}
假设rsPartRes是此代码中的ResultSet,可包含100多条记录。基本上,他担心的是因为我们循环遍历这个结果集并且没有使用StringBuffer(在这种情况下,我甚至不确定你将如何使用它),它可能导致内存泄漏。是否有人在这里看到这可能导致内存泄漏或性能问题......?
答案 0 :(得分:7)
据我所知,这里没有必要使用StringBuffer
。
使用StringBuffer
提高效果的唯一原因是,当您一遍又一遍地连接String
时。
String result = "";
while (condition) {
result += somethingElse;
}
或(StringBuilder
现在是StringBuffer
更好的替代品)
StringBuilder result = new StringBuilder();
while (condition) {
result.append(somethingElse);
}
第二段代码表现得更好。
答案 1 :(得分:4)
不,这不会导致内存泄漏。但是,在循环中声明变量会更清晰:
List partCollection = new ArrayList();
while(rsPartRes.next())
{
String partKeyID = rsPartRes.getString("PART_KEY_ID");
String sPartNbr = rsPartRes.getString("PART_NBR");
String partDescription = rsPartRes.getString("PART_DESC");
SomeValueObject someValueObject = new SomeValueObject();
someValueObject.setPartKeyID(partKeyID);
someValueObject.setSPartNbr(sPartNbr);
someValueObject.setPartDescription(partDescription);
partCollection.add(someValueObject);
}
为什么你根本不需要这些变量就不明显了:
while(rsPartRes.next())
{
SomeValueObject someValueObject = new SomeValueObject();
someValueObject.setPartKeyID(rsPartRes.getString("PART_KEY_ID"));
someValueObject.setSPartNbr(rsPartRes.getString("PART_NBR"));
someValueObject.setPartDescription(rsPartRes.getString("PART_DESC"));
partCollection.add(someValueObject);
}
(使用泛型也会更好,但那是另一回事......)
您的同事计划如何使用StringBuffer
?这里没有字符串操作...
答案 2 :(得分:0)
他认为泄漏了什么?
不确定StringBuilder如何帮助,因为您似乎没有构建(连接)任何字符串。除非SomeValueObject()
内部发生了什么