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

Java中字符串池的底层机制?

狄阳华
2023-03-14
问题内容

我很好奇,为什么字符串可以在不调用创建new String(),作为API提到它是Objectclass java.lang.String

那么我们怎么能使用String s="hi"而不是String s=new String("hi")呢?

这篇文章阐明了利用==运营商和缺乏new
,并说这是由于String被文字 拘留 或由文字池拍摄JVM的,因此Strings是不可变的。

在看到诸如

String s="hi"

第一次 真正发生了什么?

  1. 是否JVM像这样替换它String s=new String("hi"),其中创建了一个对象并将"hi"其添加到 String文字池 ,因此随后的调用(例如String s1="hi"从池中进行)?

  2. 这是底层机制的运作方式吗?如果是这样,那么是

    String s=new String("Test");
    

    String s1=”Test”;

与…相同

    String s="Test";
String s1="Test";

在内存利用率和 效率方面

  1. 另外,是否可以通过任何方式访问字符串池以检查其中String存在多少文字,占用了多少空间等?

问题答案:
  1. String s="hi" 第一次真正发生了什么?

JVM是否像这样替换它String s=new String("hi"),其中创建了一个对象并将“
hi”添加到String文字池,因此从该池中获取了诸如String s1 =“ hi”之类的后续调用?

否。真正发生的是- 字符串字面 量在编译时 解析 ,并在类被 加载/初始化延迟 时进行 嵌入
(添加到String常量池中)。因此,它们可用于JVM中的类。请注意,即使您在Strings常量池中有一个带有value 的String,也会在堆上
创建 另一个String并返回其引用。 "hi"``new String("hi") __


 String s=new String("Test"); 
 String s1="Test";

与…相同

 String s="Test"; 
 String s1="Test";

在内存利用率和效率方面?

否,在第一种情况下,将创建2个“测试”字符串。一个将被添加到String常量池中(假设它在那里不存在),另一个将被添加到堆中。第二个可以被GCed。在第二种情况下,字符串常量池中仅存在一个字符串
文字 ,并且有2个对它的引用(ss1)。

  1. 另外,如果有什么方法可以访问字符串池,例如检查程序或任何监视工具中存在多少字符串文字,占用的空间等?

我认为我们看不到String常量池的内容。我们只能根据我们的假设来 假设确认 行为。



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

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

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

  • 本文向大家介绍Java中的字符串常量池是什么?,包括了Java中的字符串常量池是什么?的使用技巧和注意事项,需要的朋友参考一下 当您将字符串存储为 JVM会直接在一个单独的内存块(称为String常量池)中创建具有给定值的String对象。 每当我们尝试创建另一个String作为 JVM会验证String常量池中是否存在具有相同值的String对象,如果不是,JVM会创建新对象而不是创建新对象,而

  • 问题内容: 考虑以下代码: 使用new关键字时,Java会 再次创建吗?这将存储在常规堆还是池中?多少人在将s结尾池? 问题答案: 如果使用关键字,将创建一个新对象。请注意,对象始终在堆上-字符串池不是与堆分开的独立内存区域。 字符串池就像一个缓存。如果你这样做: 那么Java编译器是聪明足以让只有一个对象,并且将两者指的是同一个String对象。如果你这样做: 那么池中将有一个对象,该对象代表文

  • 我正在学习如何通过OCA考试,并坚持这个java字符串池的概念。 考虑以下几点: 和在字符串中是相同的,在对象中也是相同的,因为它是相同的字符串文本,所以JVM在编译时将字符串池和。 现在,是在运行时计算的,因此应该返回一个新字符串。因此,应该为false,但事实并非如此。为什么? 我的一个理论是方法首先检查是否有空白需要删除,如果没有,则简单返回本身。这可以解释为什么s1==s3,但我不确定。