从 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)
) 和你原来 String
的 second (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、
的旧版本
- 原字符串可能比较大,
- 子字符串可能是长期存在的。
我有如下字符串
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)
) 和你原来 String
的 second (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、 的旧版本
- 原字符串可能比较大,
- 子字符串可能是长期存在的。