我说,我使用了一个包含大量数据的变量String data.我想以下列方式使用此字符串的一小部分:
this.smallpart = data.substring(12,18);
Run Code Online (Sandbox Code Playgroud)
经过几个小时的调试(使用内存可视化器)后,我发现对象字段smallpart记住了所有数据data,尽管它只包含子字符串.
当我将代码更改为:
this.smallpart = data.substring(12,18)+"";
Run Code Online (Sandbox Code Playgroud)
..问题解决了!现在我的应用程序现在使用很少的内存!
怎么可能?有谁能解释一下?我认为这个小部分一直在引用数据,但为什么呢?
更新: 如何清除大字符串呢?data = new String(data.substring(0,100))会做什么吗?
如果你有两个String实例,并且它们是相同的,那么在Java中它们将共享相同的内存.这是如何在引擎盖下实施的?
编辑:我的应用程序使用大量的String对象,其中许多是相同的.使用Java String常量池的最佳方法是什么,以避免创建自定义flyweight实现?
据说substring String类中的方法会导致内存泄漏.这是真的吗?怎么样?有什么替代方案吗?
特别是在寻找答案,
在java中可能导致内存泄漏的所有其他事情是什么?这将有助于我在编码时保持谨慎.
我想遍历String中的每个字符,并将String的每个字符作为String传递给另一个函数.
String s = "abcdefg";
for(int i = 0; i < s.length(); i++){
newFunction(s.substring(i, i+1));}
Run Code Online (Sandbox Code Playgroud)
要么
String s = "abcdefg";
for(int i = 0; i < s.length(); i++){
newFunction(Character.toString(s.charAt(i)));}
Run Code Online (Sandbox Code Playgroud)
最终结果必须是String.那么任何更快或更高效的想法?
我一直以为如果我这样做String s = "Hello World".substring(0, 5),那么我就得到一个新的字符串s = "Hello".Java API文档中也记录了这一点:"返回一个新字符串,它是该字符串的子字符串".
但当我看到以下两个链接时,我开始怀疑.
Java中表达"new String(...)"的目的是什么?
基本上,他们说如果我使用String s = "Hello World".subString(0, 5),我仍然得到一个String,其中包含"Hello World"的char数组.
为什么?Java是否真的以这种方式实现了子串?为什么这样?为什么不返回一个全新的更短的子串?
我有一个像下面的字符串
12SELVASOFTWAREENGINEER................323
Run Code Online (Sandbox Code Playgroud)
这个字符串长度超过 10000
此字符串的前两个字母是员工ID
所以我可以得到我的员工ID如下
String empid = str.substring(0,2);
Run Code Online (Sandbox Code Playgroud)
但是这个字符串为原始字符创建了相同的空间String,因此会发生内存泄漏.
怎么避免这个?
他们的任何替代或有效方式是他们在java中获取字符串的一部分
任何帮助将不胜感激!!!