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

在java中从字符串中获取部分内容的最佳方法,java,regex,string,memory,stringbuilder,Java,Regex,String,Memory,Stringbuilder,我有一根像下面这样的线 12SELVASOFTWAREENGINEER................323 String empid = str.substring(0,2); 此字符串长度大于10000 此字符串的前两个字母是员工Id 所以我可以像下面这样获得我的员工id 12SELVASOFTWAREENGINEER................323 String empid = str.substring(0,2); 但是这个字符串为原始的字符串创建了相同的空间,因此会发生内

我有一根像下面这样的线

12SELVASOFTWAREENGINEER................323
String empid = str.substring(0,2);
此字符串长度大于
10000

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

所以我可以像下面这样获得我的员工id

12SELVASOFTWAREENGINEER................323
String empid = str.substring(0,2);
但是这个字符串为原始的
字符串
创建了相同的空间,因此会发生内存泄漏

如何避免这种情况

在java中获取字符串部分的方法是否有其他选择或有效


任何帮助都将不胜感激

如果您打算在内存中保留原始
字符串
,使用
str.substring(0,2)
仍然可以使用,因为它只重用原始
字符串的备份数组,因此不会影响您的内存占用

但是,如果您打算删除原始的
字符串
,并希望消耗更少的内存,则可以从原始
字符串的第一个
charAt(0)
)和第二个
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仍将保持其值,以防您担心它也会被清除

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

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

相关代码可在此处查看:

这个问题在Java 7中得到了解决

在Java 7之前,标准的解决方法是这样做:

   String empid = new String(str.substring(0, 2)); 
(新字符串(…)
创建的字符串不与原始字符串或子字符串共享其支持数组。)

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

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

Does
String empid=新字符串(str.substring(0,2))完成你想要的?你能解释一下“为原始字符串创建相同的空间。所以会发生内存泄漏”吗?你说的是什么内存泄漏
str.substring(0,2)
返回一个新字符串,该字符串是
str
的子字符串。新字符串将只有2个字符长。是的,我同意它创建新字符串,但为该字符串分配的空间与原始字符串相同,对吗?
子字符串
的内存泄漏问题已在Java 7中解决。您使用的是什么版本的Java?感谢您对substring方法的清晰解释。