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

为什么String.intern()是本机方法?

太叔鹏云
2023-03-14

让这种方法原生化背后的逻辑是什么?

与仅使用哈希图制作内嵌字符串池相比,有什么优势?

它看起来有点奇怪,但在非本机代码中似乎很容易做到:

import java.util.HashMap;

public class String {

    // ...

    private final static HashMap<String, String> pool = new HashMap<>();

    public String intern() {

        if (pool.containsKey(this))
            return pool.get(this);

        synchronized (pool) {
            if (pool.containsKey(this))
                return pool.get(this);
            pool.put(this, this);
            return this;
        }

    }

    // ...

}

那么为什么是本机代码呢?

共有1个答案

楚宏胜
2023-03-14

在非本机代码中似乎很容易做到...

你错了。根据规范,<代码>字符串。intern()必须与常量池进行交互,以满足“所有文本字符串都是interned”的要求。这不能从Java代码中完成。

 类似资料:
  • 问题内容: 在有人质疑使用的事实之前,我先说一下,出于内存和性能的原因,我需要在特定的应用程序中使用它。[1] 因此,到目前为止,我一直使用并假定这是最有效的方法。但是,自古以来我就注意到它是软件的瓶颈。[2] 然后,就在最近,我试图用一个巨大的映射替换,在该映射中放置/获取字符串,以便每次获得唯一的实例。我以为这会慢一些…但是事实恰恰相反!它快得多了!通过推送/轮询地图(实现完全相同)来替换,可

  • 问题内容: 我知道有两种在Java中创建String的方法: 通过第一种方式,Java一定会在字符串池中创建一个String对象并对其进行引用。(假设“ aaa”以前不在池中。) 使用第二种方法,将在堆中创建一个对象,但是jvm还会在字符串池中创建一个对象吗? 在这篇关于Java的字符串池的问题中,@ Jesper说: 如果您这样做: 那么池中将有一个String对象,一个代表文字“ abc”的>

  • 问题内容: 我检查了类的源代码,发现其中的方法声明为 并且的声明是 为什么这两个方法是类中的方法,如何获得这些方法的源代码? 问题答案: 您可以在此处找到本机方法的完整源代码。 希望这对您有用。 这些是本机方法,因为它必须与机器进行交互。这里机器相关的代码被写入在C语言中,这是不与源包或在未来的的所述的位置Java运行时环境(JRE)。 成为本地用户的另一个原因可能是出于性能方面的考虑。由于C级编

  • 本文向大家介绍虚拟机栈和本地方法栈为什么是私有的?相关面试题,主要包含被问及虚拟机栈和本地方法栈为什么是私有的?时的应答技巧和注意事项,需要的朋友参考一下 - 虚拟机栈:**每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。 - **本地方法栈:**和虚拟机栈所发挥的

  • 问题内容: 如果String对象是不可变的(因此显然不能改变其长度),为什么要使用方法而不是简单地像数组中那样呢? 它仅仅是一个getter方法,还是进行某种计算? 只是想看看背后的逻辑。 问题答案: Java是一种标准,而不仅仅是一种实现。只要遵守标准,不同的供应商就可以以不同的方式许可和实现Java。通过对字段进行标准调用,这毫无理由地严重限制了实现。 而且,就类的未来而言,方法要灵活得多。除

  • 问题内容: 这是一个Java代码段: 而且它根据不同的JDK表现不同 在Oracle JDK 1.7中的输出是: 在OpenJDK 1.6中的输出也是: 但是在Oracle JDK 1.6中,输出为: 如此方法的JavaDoc所指示 输出: 应该可以预期,但是三个JDK都不会产生这种情况。以及Oracle JDK1.6为什么提供: 结果是? 我认为在OracleJDK 1.7和openJDK 1.