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

有关Java的字符串池的问题

丁业
2023-03-14
问题内容

考虑以下代码:

String first = "abc"; 
String second = new String("abc");

使用new关键字时,Java会abc String再次创建吗?这将存储在常规堆还是String池中?多少人String在将s结尾String池?


问题答案:

如果使用new关键字,String将创建一个新对象。请注意,对象始终在堆上-字符串池不是与堆分开的独立内存区域。

字符串池就像一个缓存。如果你这样做:

String s = "abc";
String p = "abc";

那么Java编译器是聪明足以让只有一个String对象,s并且p将两者指的是同一个String对象。如果你这样做:

String s = new String("abc");

那么String池中将有一个对象,该对象代表文字"abc",并且池中将有一个单独的String对象(不在池中),其中包含池对象的内容的副本。由于StringJava中是不可变的,因此你无法从中获得任何收益。调用new String("literal")Java中从没有意义,并且效率低下。

请注意,你可以调用intern()一个String对象。String如果该对象尚不在池中,则会将其放入池中,并返回对池字符串的引用。(如果它已经在池中,则只返回对已经存在的对象的引用)。有关更多信息,请参见该方法的API文档。



 类似资料:
  • 问题内容: 这与Java字符串常量池有关。在我的一个程序中,我正在解密数据库的密码并将其存储在字符串中。我听说Java字符串将存储在Constant池中,并且不会被VM重新启动或加载了String Quits的ClassLoader破坏。 如果是这种情况,我的密码将存储在字符串池中。我非常关心这个问题。还有其他方法可以销毁这些文字或我可以做的其他任何事情。 请对此提出建议, 问候,阳光明媚。 问题

  • 当我写下面的代码时,我遇到了一个问题 然后我运行我的代码,控制台打印这个 这让我很困惑。为什么第二次打印是真的,而第一次打印是假的??在我对String文字池的理解中,当定义一个字符串时,JVM将检查池中是否包含该字符串,如果不包含,则将该字符串放入池中。 在我的代码中,变量Hello存在于字符串池中,“Helo”和“lo”也在池中,我的问题是 如果池中存在Helo和lo串联的结果。 关于str5

  • 问题内容: 我对Java中的StringPool感到困惑。我在阅读Java中的String一章时遇到了这个问题。用外行的术语,请帮助我了解StringPool的实际作用。 问题答案: 打印(即使我们不使用方法:比较字符串的正确方法) 当编译器优化你的字符串文字时,它会看到两者s和t具有相同的值,因此你只需要一个字符串对象。这是安全的,因为在中是不可变的。 结果,两者和都t指向同一个对象,节省了一些

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

  • 问题内容: 我很好奇,为什么字符串可以在不调用创建,作为API提到它是的 那么我们怎么能使用而不是呢? 这篇文章阐明了利用运营商和缺乏 ,并说这是由于被文字 拘留 或由文字池拍摄的,因此是不可变的。 在看到诸如 第一次 真正发生了什么? 是否像这样替换它,其中创建了一个对象并将其添加到 String文字池 ,因此随后的调用(例如从池中进行)? 这是底层机制的运作方式吗?如果是这样,那么是 Stri

  • 本文向大家介绍Java 中的字符串常量池详解,包括了Java 中的字符串常量池详解的使用技巧和注意事项,需要的朋友参考一下 Java中的字符串常量池 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");,这两种方式我们在代码编写时都经常使