为什么Thread类中的setName分配给一个字符数组?为什么不是一个String?

kik*_*kik 6 java

当我在Java中处理线程概念时,我已经看到了Thread.java源文件.我注意到,当setName()方法将字符串分配给一个名为的字符数组时"name[]".Java具有String数据类型的特性,那么它们为什么使用字符数组.

在源文件中,它初始化为,

private char name[]; // why not "private String name;"
Run Code Online (Sandbox Code Playgroud)

setName()方法中,

public final void setName(String name) {
    checkAccess();
    this.name = name.toCharArray();
    }
Run Code Online (Sandbox Code Playgroud)

请帮我.提前致谢.

Ale*_*lov 9

此名称是从本机代码访问的,因此与使用Java类型的mangle相比,它更容易处理char数组.在core-lib-devs邮件列表上讨论这个问题前一段时间,这里有一个链接从线到一个邮件.最初的问题表明"相当多的时间进入Thread.setName调用,我认为其中很大一部分是进行新的char分配和复制char数组等".引用答案:

这种方式在2002年底有一个RFE:

4745629(thread)Thread.setName执行不必要的字符串分配(不要使用char [])

2002年的最初评估表明:

"我无法想象这会严重影响任何真实程序的性能.此外,由于此类与VM的密切关系,更改Thread中的字段是有问题的.也就是说,在上下文中可能值得解决这个问题.一些线程代码清理."

然后在2005年,它被关闭为"不会修复":

"在JVM中,名称表示依赖于char数组,必须严格拒绝此RFE."

  • 你可以用一些参考或其他东西来支持吗?我没有看到`Thread.java`或`Thread.c`任何东西(在`native`树),使得本机代码访问的名称.如果它是从本机代码访问的,我希望最后看到一个空字符.这似乎是猜测. (2认同)