在Thread.java,第146行,我注意到作者使用char[]
而不是String
作为名称字段。有没有我不知道的性能原因?在返回名称之前,getName()
也会将字符包装在字符串中。使用String
不是更好吗?为什么使用char []而不是String?
回答
一般来说,是的。出于性能方面的原因,我怀疑char[]
被用于Thread
,在Java这样的事情需要尽一切努力才能获得不错的表现的时候。随着现代JVM的出现,这种微型优化早已变得不重要,但它只是留下了这种方式。
在旧的Java 1.0时代的源代码中有很多怪异的代码,我不会太在意它。
我也怀疑过。但后来我在ThreadGorup中看到'String name',我很困惑。感谢你的回答。 –
我打算接受这个答案,因为很多人认为没有什么好的理由。 –
字符串是不可改变的,所以这就是为什么他使用它。有效的Java 2end版本说:“总是尽可能使用字符串替代方法”作者:Josha Blouch –
很难说。也许他们有一些优化的想法,也许编写这段代码的人更习惯于C风格的字符串数组char*
,或者在写这段代码的时候,他们不确定字符串是否是不可变的。但是通过这段代码,任何时候调用Thread.getName()
,都会创建一个新的char数组,所以这个代码实际上比GC更重要,而不仅仅是使用字符串。
+1这是关于GC的。 –
也许原因是安全保护?字符串可以用反射来改变,所以作者想要在读写时进行复制。如果你这样做,你可以使用char数组来加快复制速度。
- 1. 为什么std :: runtime_error :: what()返回const char *而不是std :: string const&
- 2. 为什么fstream.read和fstream.write使用char而不是unsigned char?
- 3. Java:为什么这个程序使用char而不是int?
- 4. 在C++中使用<string,string>或<string,char>映射而不是<char, char>
- 5. 为什么在jenkins扩展点中,ConsoleLogFilter是否使用OutputStream而不是String?
- 6. 为什么使用HTML而不是HAML?
- 7. 为什么,而不是使用回调
- 8. 为什么使用classmethod而不是staticmethod?
- 9. 为什么使用TCPDF而不是mpdf
- 10. 为什么使用leal而不是incq?
- 11. 为什么使用iconv_strpos而不是strpos?
- 12. 为什么使用s:Line而不是mx:HRule?
- 13. 为什么使用uImage而不是zImage
- 14. 为什么使用DataSource而不是XADataSource?
- 15. 为什么使用结构,而不是
- 16. 为什么使用registerDefaults:而不是setValue:forKey:?
- 17. 为什么使用追加()而不是+
- 18. 为什么使用Number.parseInt而不是parseInt()?
- 19. 为什么使用TagBuilder而不是StringBuilder?
- 20. 为什么如果C不使用char
- 21. 为什么不在String中使用Java?
- 22. ALTER语句:为什么VARCHAR2(50 BYTE)而不是VARCHAR2(50 CHAR)?
- 23. 为什么MYSQL的Desc命令显示char而不是nchar?
- 24. 为什么在C++中使用char数组而不是int数组
- 25. 为什么JavaScript中的语法regex.test(string)而不是string.test(regex)?
- 26. 为什么String类是final?
- 27. 什么是char *?
- 28. Java为什么char = char^char与char^= char不同?
- 29. 为什么SWITCH ... CASE没有使用'char'?
- 30. 为什么File.Copy(string,string,bool)不覆盖?
调用String。{getChars,getBytes,toLowerCase,...}都返回作为原始字符串副本的新对象。如果您使用大字符串或多次调用其中一种方法。您最终可能会收到不必要的额外垃圾回收。例如,想象在任何节拍上出于任何原因调用OutputStream.write(epochTimeString.getBytes())的HTTP心跳。如果您使用Mobile JVM,则必须更经常地担心这些细节。 – eSniff