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

当我们可以创建字符串s=“abc”时,字符串s=新字符串(“abc”)需要什么

丘华翰
2023-03-14

据我了解

String s=new String(“abc”)将创建两个对象-

  1. 一个在String常量池中(如果"abc"不在常量池中)
  2. 内存中的一个

虽然对于实际创建多少对象以及在何处创建对象,人们的理解并不多。

不管怎样,我有以下问题-

  1. 为什么在String类的java文档中没有提到要创建多少对象以及在哪里创建

编辑

java docs forintern()方法显然谈到了常量池,但在String(String)中没有这样说。

共有2个答案

邢修明
2023-03-14

字符串s=新字符串(“abc”)将创建两个对象:

  • 字符串常量池中的一个(如果“abc”不在常量池中)

没有。它在恒定池中。它是编译器放在那里的。

正确。

虽然对于实际创建多少对象以及在何处创建对象,人们的理解并不多。

许多误解:只有一个正确的理解。

为什么String类的java文档中没有涉及到将创建多少对象以及在哪里?

这个问题的前提是不正确的。它被覆盖了。不可能以“创建了多少字符串”的确切形式出现,但在过去20年中,这个问题被问了数百万次,答案并不完全是秘密。或者不应该。

如果String是不可变的,为什么在String类中提供新的String(String)?。

所以你可以创建一个新的。

还可以假设由String s=“abc”或String s=new String(“abc”)创建的所有字符串将在字符串常量池中可用吗?

没有。常量池中只有字符串文字和String.intern()的结果。这也是有据可查的。

用于创建或附加在StringBuilder或StringBuffer中的String文字,它们是否也进入String常量池或仅保留在堆内存中。

编译器将所有字符串文本放入常量池中。

曹理
2023-03-14

为什么String类的java文档中没有涉及到将创建多少对象以及在哪里?

它被一系列的文档所覆盖

String类表示字符串。Java程序中的所有字符串文本(如“abc”)都作为此类的实例实现。字符串是恒定的;它们的值在创建后无法更改。字符串缓冲区支持可变字符串。因为字符串对象是不可变的,所以它们可以共享。例如:

 String str = "abc";

相当于:

 char data[] = {'a', 'b', 'c'};
 String str = new String(data);

来自Java语言规范

String对象具有常量(不变)值。

String文字(§3.10.5)是对String类实例的引用。

以及来自JSL#3.10.5。字串

此外,字符串文字总是引用类String的相同实例。这是因为字符串文字——或者更一般地说,常量表达式的值(§15.28)——被“驻留”,以便使用S方法共享唯一的实例tring.intern.

...

如果字符串是不可变的,为什么在String类中仍然提供新字符串?。还可以假设由String s=“abc”或String s=new String(“abc”)创建的所有字符串将在字符串常量池中可用吗?

由于String是对象,声明的有效方式是

String s = new String("abc");

但其中String s=“abc” 是出于其他原因设计的

Java的设计者决定在面向对象语言中保留原语类型,而不是将所有东西都变成对象,以提高语言的性能。

由于它是最有用的类出于性能原因,Java的String被设计成介于基元和类之间。

用于创建或附加在StringBuilder或StringBuffer中的String文字,它们是否也进入String常量池或仅保留在堆内存中。

考虑这个例子

StringBuilder sb = new StringBuilder("abc");

常量池中可用的文本“abc”,以及堆中创建的对象sb

给我一个机会阅读我的旧答案:如何使用“”初始化字符串?

 类似资料:
  • 本文向大家介绍不是说字符串是不可变的吗?string s="abc";s="123"不就是变了吗?相关面试题,主要包含被问及不是说字符串是不可变的吗?string s="abc";s="123"不就是变了吗?时的应答技巧和注意事项,需要的朋友参考一下 String是不可变的在这段代码中,s原先指向一个String对象,内容是 "abc",然后我们将s指向"123",那么s所指向的那个对象是否发生了

  • 问题内容: 我是学习Java的C ++人。我在读《有效的Java》,使我有些困惑。它说永远不要写这样的代码: 因为它创建了不必要的String对象。但是应该这样写: 到目前为止还可以…但是,考虑到此类: 为什么第一个陈述可以?不是吗 我如何使行为像这样,使上面的语句可以正常运行(带有和不带有)?字符串到底有什么用,它能够像这样传递文字就可以了吗?据我了解,Java中没有“复制构造函数”的概念吗?

  • 问题内容: 字符串池是什么意思?以下声明之间有什么区别: JVM存储这两个字符串之间有什么区别吗? 问题答案: 字符串池是JVM对字符串实习概念的特定实现: 在计算机科学中,字符串保留是一种仅存储每个不同的字符串值的一个副本的方法,该值必须是不变的。内部字符串使某些字符串处理任务更加节省时间或空间,但代价是在创建或嵌入字符串时需要更多时间。不同的值存储在字符串内部存储池中。 基本上,字符串内部存储

  • 对性能是否有影响? 不同Java版本的行为是否有差异?

  • 当使用关键字 new 创建字符串时,它使用采用 String 文本的构造函数创建新的 String 对象。我想知道在调用 String 构造函数之前,文本是否存储在常量池中。 我这么问的原因是,在《OCA Java SE 7程序员I认证指南》中,Mala Gupta写道: 她在第一行表示,new创建的String对象不会存储在常量池中。这很好,但不清楚的是,第一行构造函数中的字面“Summer”是

  • 在这个问题之前,我先要说明一个事实,那就是我学习编程才一个月,而这个学校的作业却把我难住了。具体地说,它是摩尔斯电码到英语翻译器(反之亦然)...这是我被困住的部分: