从java

时间:2016-11-08 13:44:26

标签: java regex string memory stringbuilder

我有一个如下所示的字符串

12SELVASOFTWAREENGINEER................323

此字符串长度超过10000

此字符串的前两个字母是员工ID

所以我可以获得下面的员工ID

String empid = str.substring(0,2);

但是这个字符串为原始String创建了相同的空间,因此会发生内存泄漏。

如何避免这种情况?

他们的任何替代或有效方式是他们在java中获取字符串的一部分

任何帮助将不胜感激!!!

3 个答案:

答案 0 :(得分:5)

  

...但是这个字符串为原始字符串创建了相同的空间。因此会发生内存泄漏。

我认为你指的是旧版Java中String的行为,其中String.substring(...)创建了一个共享原始String对象的后备数组的对象。正如您所指出的那样,可能导致内存泄漏;例如如果原始字符串变得无法访问且子字符串没有。

相关代码可以在这里看到:

此问题已在Java 7中修复

在Java 7之前,标准的解决方法是执行以下操作:

   String empid = new String(str.substring(0, 2)); 

new String(...)创建一个不与原始字符串或子字符串共享其支持数组的字符串。)

但是,只有在以下情况下才建议这样做:

  • 您使用的是旧版Java,
  • 原始字符串可能很大,
  • 子字符串很可能是长寿的。

答案 1 :(得分:1)

如果您打算将原始String保留在内存中,仍然可以使用str.substring(0,2),因为它只会重复使用原始{{1}的支持数组所以它不会影响你的记忆

但是,如果您打算摆脱原来的String并希望消耗更少的内存,那么您可以从第一个({{}构建新的String实例1}})和原始String第二个charAt(0))字符作为下一个:

charAt(1)

答案 2 :(得分:1)

这应该非常有效:

String orig = "12SELVASOFTWAREENGINEER................323";

String empId = orig.substring(0, 2);

为什么会出现内存泄漏?

如果你的意思是orig所持有的记忆,你可以像以后那样重置orig:

orig = null;

这将允许垃圾收集器收集长字符串。 empId仍将保持其价值 - 万一你可能担心它也会被清除。