如果append()调用不在循环中,我们一个接一个地追加不同的字符串——这些字符串完全不同,因此不使用字符串池——那么会在内存中创建新字符串吗?或者它们会直接转换为字符并附加到StringBuilder内部维护的字符数组中吗?
所以如果我写这个。。
StringBUilder sb = new StringBuilder( );
sb.append("Where there is is a will.. ");
sb.append("there is a way!");
sb.append("~ Some wise man!");
sb.toString();
问题-在堆内存中为上述代码创建了多少字符串文字?字符串参数是否像“哪里有遗嘱...”分配的内存空间?
注意:请在您将此问题标记为重复之前阅读此内容-在循环中使用追加调用时存在问题,在这种情况下,每个循环的String部分都是相同的,在这种情况下,该部分将从String池中拾取当然。
检查了append()的代码,因为它接受一个字符串,所以必须先创建字符串,然后创建它,然后从中取出字符,然后将它们附加到内部char[]值。
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
问题内容: 我有一个接受File作为参数的函数。我不想创建/写入新文件(我没有对文件系统的写访问权)以便将字符串数据传递给该函数。我应该补充说字符串数据在文件中不存在(所以我无法从文件中读取数据)。 我可以使用流并将其“广播”到文件对象吗? 问题答案: 没有; 类的实例表示文件系统中的路径。因此,您只能将该功能与文件一起使用。但是,也许有一个过载需要替代?
我知道在Kotlin中,用于声明常量,用于只读属性。然而,我想知道在以下情况下,哪一个更适合使用。 假设我有一个片段,它需要一个用于和的键。我想知道以下两个选项中哪一个更好: 我更喜欢#选项2,因为它清楚地表明是一个常量,值是在编译时确定的。然而,由于它是在顶层声明的,它需要在编译后的java代码中创建一个类,即(假设文件名是)。在#选项1中,没有生成额外的类,尽管的值将在运行时分配,而不是恒定的
问题内容: 我的长字符串不适合屏幕的宽度。例如。 为了使阅读更容易,我想到了用这种方式编写它- 但是,我意识到第二种方法使用字符串连接,并会在内存中创建5个新字符串,这可能会导致性能下降。是这样吗 还是编译器足够聪明,以至于我只需要一个字符串就可以了?我如何避免这样做? 问题答案: 我意识到第二种方法使用字符串连接,并将在内存中创建5个新字符串,这可能会导致性能下降。 不,不会。由于这些是字符串文
问题内容: 有没有办法从Java中的String变量创建新类? 另外,如果可能,生成的对象是否必须为Object类型? 也许有更好的方法,但是我希望能够从XML文件中检索值,然后实例化以这些字符串命名的类。这些类中的每一个都实现相同的接口,并从相同的父类派生,因此我将能够在该类中调用特定的方法。 问题答案: 这是你想做的: 请注意,newInstance方法不允许使用参数化的构造函数。(请参阅Cl
我读过很多关于创建字符串时内存分配的相互矛盾的文章。一些文章说new operator在堆中创建一个字符串,String literal在String Pool[heap]中创建,而一些文章说new operator在堆中创建一个对象,在String Pool中创建另一个对象。 为了分析这一点,我写了下面的程序,打印字符串字符数组和字符串对象的hashcode: 此程序打印以下输出: 从这个输出中
问题内容: 我一直在尝试实现单例,以用作我从网络上传到我的iOS应用的照片的缓存。我在下面的代码中附加了三个变体。我试图使版本2正常工作,但是它导致了我不理解的编译器错误,并希望就我做错的事情寻求帮助。变体1进行缓存,但我不喜欢使用全局变量。变体3并没有进行实际的缓存,我相信这是因为我在赋给var ic = ....的赋值中获得了副本,对吗? 任何反馈和见解将不胜感激。 谢谢Zvi 问题答案: 标