2011-11-21 120 views
9

Thread.java,第146行,我注意到作者使用char[]而不是String作为名称字段。有没有我不知道的性能原因?在返回名称之前,getName()也会将字符包装在字符串中。使用String不是更好吗?为什么使用char []而不是String?

+3

调用String。{getChars,getBytes,toLowerCase,...}都返回作为原始字符串副本的新对象。如果您使用大字符串或多次调用其中一种方法。您最终可能会收到不必要的额外垃圾回收。例如,想象在任何节拍上出于任何原因调用OutputStream.write(epochTimeString.getBytes())的HTTP心跳。如果您使用Mobile JVM,则必须更经常地担心这些细节。 – eSniff

回答

6

一般来说,是的。出于性能方面的原因,我怀疑char[]被用于Thread,在Java这样的事情需要尽一切努力才能获得不错的表现的时候。随着现代JVM的出现,这种微型优化早已变得不重要,但它只是留下了这种方式。

在旧的Java 1.0时代的源代码中有很多怪异的代码,我不会太在意它。

+0

我也怀疑过。但后来我在ThreadGorup中看到'String name',我很困惑。感谢你的回答。 –

+0

我打算接受这个答案,因为很多人认为没有什么好的理由。 –

+0

字符串是不可改变的,所以这就是为什么他使用它。有效的Java 2end版本说:“总是尽可能使用字符串替代方法”作者:Josha Blouch –

2

很难说。也许他们有一些优化的想法,也许编写这段代码的人更习惯于C风格的字符串数组char*,或者在写这段代码的时候,他们不确定字符串是否是不可变的。但是通过这段代码,任何时候调用Thread.getName(),都会创建一个新的char数组,所以这个代码实际上比GC更重要,而不仅仅是使用字符串。

+0

+1这是关于GC的。 –

1

也许原因是安全保护?字符串可以用反射来改变,所以作者想要在读写时进行复制。如果你这样做,你可以使用char数组来加快复制速度。

相关问题