从 java 中的字符串中获取部分内容的最佳方法

Best way to get part of content from string in java

我有如下字符串

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

这个字符串长度超过10000

该字符串的前两个字母为员工编号

所以我可以像下面这样得到我的员工 ID

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

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

如何避免这种情况?

他们是否有任何替代方法或有效方法是获取 java

中的字符串部分

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

如果您打算在内存中保留原始 String,仍然可以使用 str.substring(0,2),因为它只会 重用原来String所以它不会影响你的内存占用

但是,如果您打算摆脱原来的 String 并希望消耗更少的内存,那么您可以从 first[=27] 构建一个新的 String 实例=] (charAt(0)) 和你原来 Stringsecond (charAt(1)) 字符如下:

String sub = new String(new char[]{s.charAt(0), s.charAt(1)});

这应该工作得很好:

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

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

为什么会出现内存泄漏?

如果你指的是 orig 持有的内存,你可以像这样重置 orig 之后:

orig = null;

这将允许垃圾收集器收集长字符串。 empId 仍将保留其值 - 以防您担心它也被清除。

... but this string creates the same space for original string.so memory leak will happen.

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

相关代码可以看这里:

此问题已在 Java 7.

中修复

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

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

new String(...) 创建的字符串不与原始字符串或子字符串共享其后备数组。)

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

  • 您使用的是 Java、
  • 的旧版本
  • 原字符串可能比较大,
  • 子字符串可能是长期存在的。