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

Java字符串何时被冻结?

裘安阳
2023-03-14
问题内容

受到关于这个问题)的评论的启发,我很确定Java
String在运行时而不是在编译时就被内生了—当然,事实是类可以在不同的时间进行编译,但仍会在运行时指向相同的引用。

我似乎找不到任何证据来支持这一点。谁能证明这一点?


问题答案:

优化在两个地方都发生(或至少可以发生):

  • 如果对同一字符串常量的两个引用出现在同一类中,则我希望该类文件仅包含一个常量池条目。为了确保在JVM中仅创建一个对象,并非严格 要求 这样做String,但这显然是一种优化。实际上,这实际上不是内部的-只是不断的优化。
  • 加载类时,该类的字符串池将添加到内部池中。这是“真实的”实习。

(我有一个模糊的回忆,Java 7围绕“小型jar文件”所做的工作之一包括为整个jar文件提供一个字符串池……但是我可能错了。)

编辑:JVM规范的第5.1节“运行时常量池”详细介绍了这一点:

为了派生字符串文字,Java虚拟机检查由CONSTANT_String_info结构给出的字符序列。

* 如果先前在String类的实例上调用了String.intern方法,该实例包含与CONSTANT_String_info结构所给定的Unicode字符序列相同的字符串,则字符串文字派生的结果是对该类String的该实例的引用。

* 否则,将创建一个新的String类实例,其中包含由CONSTANT_String_info结构给出的Unicode字符序列;该类实例是字符串文字派生的结果。最后,新的String实例的intern方法被调用。



 类似资料:
  • 目前再做一个接口请求,postman已经调试成功,但是用java模拟的时候出现一个奇怪的问题. 两张图片base64加密后的字符串put进一个jasonobject中.本来很长的字符串被截断成993(显示1000是因为有个key的长度)长度.导致请求失败.想问问有大佬知道是为什么吗?png](/img/bVdba5a) 在网上查了好久没有相关的错误..

  • 当我尝试用分隔符“|”拆分字符串时,它似乎拆分了每个字符。 这是我的线,导致了问题:

  • 我的问题是对称解密。而不是非对称解密。所以正确的答案是在这里只在Java中用密码短语解密PGP加密的文件 我使用gpg加密“Hello”:

  • 问题内容: 因此,这里的问题非常简单:是否可以判断Java中是否存在Interin?我的猜测不是,但是我想知道是否有人知道更好。 问题答案: 找出a 是否被拘禁的唯一方法是调用并检查其是否返回: 显然,这有一个缺点,那就是以前没有进行过intern的时间。 部分去题外话,有办法做“定制”与使用显式泳池实习接口的番石榴(利用暴露的实现类)。这样做的好处是,当不再引用自身(因此也就是池)时,便可以对其

  • 我有以下JSON字符串: 我只想要和。我试过这样的方法: 但我得到了以下错误: 我只使用过几次JSON。有人能帮我吗? 对我来说最好的例子是这样的,我在另一个例子中做过: 可能吗? 现在我已经做到了: 我试着这样做: 然后: 但现在当我做一个Prtinout时,我会得到和以前一样的错误:

  • 在 Java 基本数据类型一节中,我们已经知道 Java 中有两大数据类型:一个是基本数据类型,另一个是引用数据类型。 字符串(String)便属于引用数据类型。字符串在 Java 程序中无处不在,其实我们在第一个 Java 程序中就已经使用过了字符串,打印语句中双引号中的Hello World就是一个字符串:System.out.println("Hello World"); 本小节我们将介绍字