关于Java的几个小问题
Java语言有哪些特点?
Java 语言的特点有:
①面向对象,主要是封装,继承,多态
②平台无关性,“一次编写,到处运行”,因此采用 Java 语言编写的程序具有很好的可移植性。
③支持多线程。C++ 语言没有内置的多线程机制,因此必须调用操作系统的 API来完成多线程程序设计,而Java却提供了封装好多线程支持;
④支持 JIT 编译,也就是即时编译器,它可以在程序运行时将字节码转换为热点机器码来提高程序的运行速度。
JVM、 JDK 和 JRE 有什么区别?
JVM:也就是 Java 虚拟机,是 Java 实现跨平台的关键所在,不同的操作系统有不同的 JVM 实现。 JVM 负责将 Java字节码转换为特定平台的机器码,并执行。
JRE:也就是 Java 运行时环境,包含了运行Java 程序所必需的库,以及 JVM。
JDK:⼀套完整的 Java SDK,包括 JRE,编译器 javac、 Java 文档生成工具 javadoc、 Java 字节码工具 javap 等。为开发者提供了开发、编译、调试 Java 程序的⼀整套环境。
简单来说, JDK 包含 JRE, JRE 包含 JVM。
说说什么是跨平台?原理是什么
跨平台指的是java 语言写的程序,经过一次编译后,可以直接在多个操作系统运行。
原理是增加了个中间件 JVM,JVM 负责将 Java 字节码转为特定平台的机器码,并执行。
什么是字节码?采用字节码的好处是什么?
所谓的字节码,就是 Java 程序经过编译后产生的 .class 文件。
Java 程序从源代码到运行需要经过三步:
- 编译:将源代码文件 .java 编译成 JVM 可以识别的字节码文件 .class
- 解释:JVM 执行字节码文件,将字节码翻译成操作系统能识别的机器码
- 执行:操作系统执行二进制的机器码
为什么有人说 Java 是“编译与解释并存”的语言?
编译型语言是指编译器针对特定的操作系统,将源代码一次性翻译成可被该平台执行的机器码。
解释型语言是指解释器对源代码进行逐行解释,解释成特定平台的机器码并执行。
之所以有人说Java 是“编译与解释并存"的语言,是因为Java 程序需要先将Java 源代码文件编译字节码文件,再解释执行。
逐行解释会不会太慢了,Java 为此还有什么优化?
JVM 执行字节码有两种方式:
- 解释执行(Interpreter):字节码指令逐条解释成目标机器的机器码来执行。
- 即时编译(JIT,Just-In-Time Compiler):为了提高效率,JVM 会把一些热点代码(执行频繁的部分)直接编译成本地机器码,下次再运行时就不用解释了,而是直接执行机器码。
基础语法
Java 有哪些数据类型?
Java 的数据类型可以分为两种: 基本数据类型和引用数据类型
基本数据类型:
默认值以及大小:
数据类型 | 默认值 | 大小 |
---|---|---|
boolean | false | 1 字节或 4 字节 |
char | ‘\u0000’ | 2 字节 |
byte | 0 | 1 字节 |
short | 0 | 2 字节 |
int | 0 | 4 字节 |
long | 0L | 8 字节 |
float | 0.0f | 4 字节 |
double | 0.0 | 8 字节 |
引用数据类型:
- 类(class)
- 接口(interface)
- 数组(
[]
)
boolean 数据类型占用多少字节?
boolean 占用 1 个字节和 4 个字节都有可能。
在官网文档中,说的是 boolean 数据类型表示 1bit 的信息,但是他的 size 没有被精确定义。也就是说,不管他占用多大的空间,只有 1 个 bit 的信息是有意义的。
事实上,boolean 类型数据到底占用多大空间,完全取决于 Java 虚拟机本身的设计。
Java 虚拟机规范提议:
- 如果 boolean 是 “单独使用”:boolean 被编译为 int 类型,占 4 个字节
- 如果boolean 是以 “boolean 数组” 的形式使用:boolean 占 1 个字节,Java 虚拟机直接支持 boolean 数组,通过
**<font style="color:rgb(246, 84, 1);background-color:rgba(27, 31, 35, 0.05);">newarray</font>**
指令创建 boolean 数组,然后通过 byte 数组指令**<font style="color:rgb(246, 84, 1);background-color:rgba(27, 31, 35, 0.05);">baload</font>**
和**<font style="color:rgb(246, 84, 1);background-color:rgba(27, 31, 35, 0.05);">bastore</font>**
来访问和修改 boolean 数组
具体还要看虚拟机是否按照规范来,所以 boolean 占用 1 个字节或者 4 个字节都有可能。