当前位置: 首页 > 知识库问答 >
问题:

字符串和字符串生成器之间的区别及其内部组织

严令秋
2023-03-14

这是一个非常基本的问题。我知道的答案的范围是字符串是不可变的。字符串生成器不是,因此您可以在末尾附加字符。

那么字符串构建器内部是如何组织的??字符串是一个字符数组。

字符串生成器也是一个字符数组吗?所以,我有一个字符串生成器MY_OBJ=“你好”。现在,如果我尝试将字符附加到MY_OBJ的末尾,这是否意味着您实际上正在创建一个新的数组对象并将所有这些字符复制到一个新对象中?如果是这样,它如何比字符串更有效?

我想到的另一个问题是,如何标记StringBuilder的结束?与C中一样,我们使用“/0”

共有3个答案

高溪叠
2023-03-14

如果您不打算更改值,StringBuilder并不比String更有效。如果您想在字符串中添加/删除字符,这样会更有效。

StringBuilder的默认构造函数将创建一个可以容纳16个char元素的数组。#append(String)使用String#getChars(int, int, char[], int)将字符串的字符复制到StringBuidler的数组中。只有当没有空间添加更多字符时,才使用Arrays.copyOf(char[], int)重新调整数组的大小。每次发生这种情况,数组的容量都会翻倍。通过计算数组中的字符数来标记结束。

在旧版本的Java中,或者当您在循环中连接字符串时,每个字符串与运算符的连接都会创建一个新的String对象。StringBuilder速度更快,因为它创建的对象更少。

如果您要保留字符串生成器实例,则可能需要在完成修改后调用字符串生成器#trimToSize()。它将尝试将阵列的容量减少到所需的最小值。

希望这能有所帮助。

郗浩言
2023-03-14

大多数字符串生成器实现来自抽象字符串生成器,在 Sun 的实现中,它是一个围绕 char 数组的包装器。没有标记字符串的末尾,该类本身包含一个计数变量,该变量表示字符串的实际大小。还有一个容量方法将告诉您实际数组的大小(以及一个 trimToSize 方法,用于将字符串生成器修剪为与当前存储的字符串一样大的数组)。

只有在达到当前字符串生成器容量时才会创建新的数组,并且此操作的成本并没有那么高,因为它使用arrayCopy方法,并且容量总是加倍,因此随着增长,达到限制的可能性会降低。如果事先知道字符串生成器的大小,也可以在其构造函数上定义,这样就不必将内容复制到新数组。

此外,此代码:

StringBuilder MY_OBJ= "Hello";

不工作。

但这一个是:

StringBuilder MY_OBJ= new StringBuilder("Hello");
曾成天
2023-03-14

我不知道。我们去看看:

  • http://www.docjar.com/html/api/java/lang/StringBuilder.java.html
72   public final class StringBuilder
73       extends AbstractStringBuilder
  • http://www.docjar.com/html/api/java/lang/AbstractStringBuilder.java.html
45        * The value is used for character storage.
46        */
47       char[] value;
48   
49       /**
50        * The count is the number of characters used.
51        */
52       int count;

===

StringBuilder也是字符数组吗?

显然,在这个特定的实现中。

所以,我有一个StringBuilder MY _ OBJ =“Hello”。现在,如果我试图在MY_OBJ的末尾添加字符,这是否意味着你实际上是在创建一个新的数组对象,并将所有这些字符复制到一个新的数组对象中?

不一定。数组不一定是满的(count

StringBuilder sb = new StringBuilder(20);
sb.append("Hello");
...
sb.append(" there");

我想到的另一个问题是,如何标记StringBuilder的结束?与C中一样,我们使用“/0”

你不在乎 - 字符串/字符串生成器将在内部处理它。

 类似资料:
  • 本文向大家介绍Java中的字符串缓冲区和字符串生成器之间的区别,包括了Java中的字符串缓冲区和字符串生成器之间的区别的使用技巧和注意事项,需要的朋友参考一下 字符串缓冲区和StringBuilder都是可变类,可用于对字符串对象执行操作,例如字符串的反向,压缩字符串等。我们可以在不创建字符串新对象的情况下修改字符串。字符串缓冲区是线程安全的,而字符串生成器不是线程安全的。因此,它比字符串缓冲区快

  • 问题内容: 这些声明之间有何不同? 每种情况下的内存分配如何? 问题答案: 要更正编译错误,请使用以下语句之一替换 下一节将以上陈述相互比较 字符串常量 “ MY PROFESSION”是一个常量,并存储在String池中 是不可变的,即完整的内容无法修改。 字符串的大小/长度是固定的(无法附加) 字符数组 保存String的基础数组的副本(通过)并存储在堆空间中 通过加载单个字符常量在堆栈框架中

  • 本文向大家介绍字符数组和字符串之间的区别,包括了字符数组和字符串之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解字符数组和字符串之间的区别。 字符串 他们是不可变的。 一旦它们被定义,就不能被更改。 它指的是一个字符序列,表示为单个数据类型。 它包含了substring()、charAt()等内置函数。 可以使用' + '操作符将字符串追加到一起,从而形成一个新的字符串。

  • 问题内容: 空字符串()和空字符串()有什么区别? 这就是我所拥有的: 这是什么意思? 问题答案: 表示将空值分配给。在这种情况下,与相同,将按预期产生。 表示将()或“完全没有值”分配给。因此,这与相同,它将产生一个,因为您无法在Java中对变量(指针或类似物)调用方法。 还有一点,声明 实际上具有与以下功能相同的效果: 鉴于 如前所述,是另一回事。

  • 问题内容: 字符串文字和字符串对象的添加有什么区别? 例如 为什么/ 不指向与相同的位置? 问题答案: 因为不是 常量表达式 ,由于和不是,因此其结果不会被插入,即创建另一个对象来表示它,因此引用比较产生。 JLS 3.10.5字符串文字 : 使用String.intern方法,对字符串常量(或更常见的是常量表达式的值(第15.28节)的字符串)进行“ interned”,以便共享唯一的实例。 J

  • 问题内容: 之间有什么区别 和 问题答案: 当你使用字符串文字时,可以将字符串嵌入,但是当你使用时,你将获得一个新的字符串对象。 在此示例中,两个字符串文字均引用相同的对象: 在这里,创建了2个不同的对象,它们具有不同的引用: 通常,应尽可能使用字符串文字表示法。它更易于阅读,并且为编译器提供了优化代码的机会。