当前位置: 首页 > 面试题库 >

为什么在字符串后附加“”会节省内存?

公良骁
2023-03-14
问题内容

我说了一个变量,里面有很多数据String data。我想通过以下方式使用此字符串的一小部分:

this.smallpart = data.substring(12,18);

经过数小时的调试(使用内存可视化工具),我发现objects字段smallpart记住了的所有数据data,尽管它仅包含子字符串。

当我将代码更改为:

this.smallpart = data.substring(12,18)+"";

..问题解决了!现在我的应用程序现在只占用很少的内存!

那怎么可能?谁能解释一下?我认为this.smallpart一直在引用数据,但是为什么呢?

更新:那 我怎么清除大字串?data = new String(data.substring(0,100))会做这件事吗?


问题答案:

执行以下操作:

data.substring(x, y) + ""

创建一个新的(较小的)String对象,并丢弃对substring()创建的String的引用,从而实现对此的垃圾回收。

重要的是要实现substring()现有 String
的窗口,或者说是原始String下方的字符数组的窗口。因此,它将消耗与原始String相同的内存。在某些情况下这可能是有利的,但是如果您想获得一个子字符串并处置原始String(如您所知),则会遇到问题。

查看JDK String源中的substring()方法以获取更多信息。

编辑:要回答您的补充问题,从子字符串构造一个新的String将减少您的内存消耗, 只要 您将对原始String的任何引用都进行装箱。

注意(2013年1月)。在Java 7u6中,以上行为已更改。flyweight模式不再使用,substring()将按您期望的那样工作。



 类似资料:
  • 问题内容: 我是iOS新手。我目前正在使用Objective-C和Swift学习iOS。 要在Objective-C中附加字符串,我使用以下代码: 有人请指导我。 问题答案: 非常简单: 对于ObjC: ForSwift: 对于ObjC AppendString: 对于Swift AppendString: 结果: 在Swift中完成代码:

  • 问题内容: 我正在使用一个返回字节字符串的库,我需要将其转换为字符串。 尽管我不确定有什么区别-如果有的话。 问题答案: 假设使用Python 3(在Python 2中,这种区别的定义不太明确)-字符串是字符序列,即unicode码点;这些是一个抽象概念,不能直接存储在磁盘上。毫无疑问,字节字符串是字节的序列- 可以 存储在磁盘上的东西。它们之间的映射是一种 编码 -其中有很多(并且无限可能)-并

  • 问题内容: 我有以下课程: 这是编译结果; 为什么我的输出中包含数字? 问题答案: 在第二种情况下,它将两个字符(G-71和o-111)的unicode码相加并打印总和。这是因为被视为数字类型,因此在这种情况下,运算符是通常的求和。

  • 问题内容: Oracle Java Community网站上的一篇文章提供了以下方法作为示例(对于JPA Converter,但这并不相关): 将String y强制转换为String val有什么用?有正当的理由吗? 原始文章:JPA的新增功能 问题答案: 这样的转换是完全没有必要的。我可以想象那是以前 但是后来参数类型更改为,而作者只是忘了删除强制类型转换。

  • 问题内容: 此代码打开url并在末尾附加,然后打开页面并将字符串打印到: 但是我得到这个结果: 如果我将字符串更改为(“ JD”,“哥伦比亚法学院” ....),那么我得到 我在文档中找不到如何指定分度符。 如果尝试使用,则会出现此错误: 谢谢您的帮助。 问题答案: 它需要一个字符串序列(例如:列表或元组)。您给它一个字符串。一个字符串也恰好是一个字符串序列,但是它是一个由1个字符串组成的序列,这

  • 问题内容: 我可以解析JTextPane的内容,而不会遇到HTML中的任何问题: 这导致 你好! 但是每当我尝试将字符串附加到textPane时,使用 (如该问题所示),我的输出是 你好! (不带空格)-跳过html格式。 如何在我的JTextPane对象上附加一个字符串,并保持添加部分的HTML格式? 问题答案: 使用例如 要么 如果要插入段落/表格或其他分支元素,则使用该方法