Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么String.intern()是本机方法?_Java - Fatal编程技术网

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

Java 为什么String.intern()是本机方法?,java,Java,使这种方法成为本地方法背后的逻辑是什么 与只使用散列映射创建内部字符串池相比,有什么优势 这看起来有点奇怪,但似乎在非本机代码中很容易做到: import java.util.HashMap; public class String { // ... private final static HashMap<String, String> pool = new HashMap<>(); public String intern() {

使这种方法成为本地方法背后的逻辑是什么

与只使用散列映射创建内部字符串池相比,有什么优势

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

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;
        }

    }

    // ...

}
import java.util.HashMap;
公共类字符串{
// ...
private final static HashMap pool=new HashMap();
公共字符串实习生(){
if(池容器(本))
返回池。获取(此);
已同步(池){
if(池容器(本))
返回池。获取(此);
把(这个,这个);
归还这个;
}
}
// ...
}
那么为什么是本机代码呢

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


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

intern的内部逻辑非常复杂,以确保它在面对所有可能的并发场景时都能履行其契约。相信我,用C代码做这件事已经够难了。(请记住,本机方法与常规Java方法没有什么不同,只是它是用另一种语言实现的,并且可以访问JVM的内部工作。)(事实上,在JVM上,我处理的一些本机方法是用Java实现的,只是被赋予了特权。)@HotLicks我认为Java代码很简单,不过。那为什么要让它本土化呢?性能没有提高,。除非参与Java设计过程的人给出答案,否则您的问题可以以任何明确的方式回答。也许这个问题能有所帮助@jdpenix—我在IBMAS400/iSeries JVM中为
intern
编写了C代码。这很复杂,你可以用任何你喜欢的方式定义东西,但它不再是Java了。JLS需要编译器进行字符串文本常量池。就是这样。因为它必须由编译器完成,因为没有其他方法来定义“在没有开放语言的情况下,对各种各样的事情都没有意义。因此,编译时的字符串只能放在本机的某个地方,而您就有了它。仅仅因为需要interning,并不要求
intern
方法是本机的。毕竟,JVM可以调用
Runnable
对象的
run
方法
intern
是本机的,因为需要使用它才能访问所需的内部资源。