Java版本与JVM之间的区别究竟在哪里?
我问的是因为最近有一个关于java.io.BufferedInputStream
的默认缓冲区大小的SOpedian的'教育'评论主题,我看到它是8192.(它一直是8192吗?)当考虑到时API,很明显是什么。但是使用java.*
类的实现 ...我只是不知道。
这导致了两个衍生问题:
BufferedInputStream
的Java版本之间的默认缓冲区大小是否会发生变化?BufferedInputStream
的默认缓冲区大小可能不同吗?(当然还有其他类似的例子,比如各种集合的实现。)
答案 0 :(得分:6)
由于the API specification of BufferedInputStream
未指定值,因此完全由实现选择一个。
这意味着默认缓冲区大小可以在Java版本之间以及相同Java规范的不同实现之间更改。
在其他方面几乎相同:真正的规范是文档(即JLS,JVM规范和API规范,或者更确切地说是相应的JCP)。
其他所有内容(即从查看源代码可以看到的所有内容)都是一个实现细节,具体取决于它是一个错误。
答案 1 :(得分:2)
“Java”是一种语言和API规范。 JVM由完全不同的规范覆盖,该规范描述了类文件的格式以及字节码的工作方式。
要称为“Java”,实现必须通过Sun和JCP定义的一系列测试。这些测试没有提及API或JVM的内部实现。
API的实现可以并且确实在修订之间发生变化,以响应错误报告和一般清理。
答案 2 :(得分:1)
基本上该行是规范,主要在Java doc中。该规范概述了API的合同,并且实施必须遵守该合同。合同未指定的内容取决于实施。
当然,在实践中,没有规范是完美的,所以即使没有指定,仍然有依赖的实用细节。 Joel Spolsky有一个good article,虽然在Java中比W3C要好得多。
答案 3 :(得分:-1)
Java是语言。有一个规范。
JVM是一个可以执行Java字节码的软件。有一个规范。
JVM有许多实现(Sun,IBM和各种手机迷你版本等),并且有许多Java实现。
Java语言可以编译为字节码,但它不必,它可以编译为IL(用于.Net CLR)或本机代码或其他任何东西。
JVM不必运行Java应用程序,例如参见Jython和JRuby以及许多其他示例