在java中,当我们将一个字符串文本打印到终端上时,这个字符串文本是否也存储在字符串池中?

dgtucam1  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(380)

我知道,当我们将一个字符串文字初始化为一个变量时,jvm会将这个文字存储在字符串池中。考虑下面的代码。

System.out.println("This is a string literal");

引号中的字符串文字是否也存储在字符串池中(即使我没有将其初始化为变量)?

7fhtutme

7fhtutme1#

我将在回答这个问题之前说,深入理解java字符串池几乎没有实际意义。从实际的Angular 来看,你只需要记住两件事:
不要使用 == 比较字符串。使用 equals , compareTo ,或等效方法。
不要使用显式 String.intern 调用你的代码。如果要避免重复字符串的潜在问题,请启用现代JavaGCS中提供的字符串重复数据消除功能。
我知道,当我们使用'new'关键字或不使用'new'关键字初始化一个字符串文本时,这个文本将由jvm存储在字符串池中。
这是乱码。
首先,不“初始化”字符串文本。初始化变量。

String hi = "hello";  // This initializes the variable `hi`.

其次,您通常不/不应该将字符串文字用于 new .

String hi = new String("hello");  // This is bad.  You should write this as above.

使用 new 是这样的:

String hi = new String(arrayOfCharacters, offset, count);

事实上 String 与字符串文字相对应的对象,发生在第一次在表达式中使用文字时或更早的时间。确切的细节(即发生的时间)未指明,并且(我理解)与版本有关。
第一个用法可能是在变量初始化中,也可能是在其他地方;e、 g.方法调用。
所以对于你的问题:
考虑下面的代码:

System.out.println("This is a string literal");

引号中的字符串文字是否也存储在字符串池中(即使我没有初始化它)?
是的,是的。如果这是第一次使用文本,那么上面的代码可能就是触发这种情况的触发器。但这可能发生在以前;e、 g.如果上面的代码运行得更早。
作为后续行动,你问:
为什么字符串池收集的字符串文字不是存储在变量中,而是显示在控制台中?
因为jls 3.10.5要求 String 与字符串文字相对应的对象是内部对象:
此外,字符串文字总是引用类string的同一示例。这是因为字符串文字-或者更一般地说,字符串是常量表达式的值(§15.28)-被“实习”以便使用该方法共享独特的示例 String.intern (§12.5)."
你问:
字符串池的存在有助于优化程序。通过存储这样的文本(这实际上不是必需的,因为它只是在控制台中显示),这不是违背了它的全部目的(即优化)吗?
实习生和字符串池的最初想法是为了节省内存。这在25年前java语言被设计和最初被指定的时候是有意义的。如今,即使是低端的android手机也有1gb的ram,而将字符串文本插入内存以节省几千字节的内存是毫无意义的。只是jls说这必须发生。
但答案是否定的,这并不违背(最初的)目的。此声明:

System.out.println("This is a string literal");

可能会被处决很多次。你不想/不需要创建新的 String 每次执行它时,为文本创建一个对象。问题是jvm不知道会发生什么。
无论如何,实习必须发生,因为这是规范所说的。

相关问题