1. JAVA语言基础
1.1 JVM、JRE和JDK的关系
JVM
Java Virtual Machine是Java虚拟机,是运行Java字节码的虚拟机,在JVM中不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。
什么是字节码?采用字节码最大的好处是什么?
字节码: Java源代码经过虚拟机编译器编译后产生的文件(即扩展为.class的文件)通俗的讲就是JVM可以理解的代码叫做字节码,它不面向任何特定的处理器,只面向虚拟机。
**采用字节码的好处:**Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。
Java程序从源代码到运行的过程:
强调一点的是,.class文件–>可执行的机器码,在这一步,JVM类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这只方式的执行速度相对比较慢,而且有些方法和代码块是经常需要被调用的,所以后面引进了JIT属于运行时编译,而JIT属于运行时编译,当JIT编译器完成第一次编译后,就会将字节码对应的机器码保存下来,下一次直接可以使用,而我们知道机器码的运行效率高于Java解释器的,这也解释了我们为什么经常会说Java是编译和解释共存的语言。
JRE
Java的运行环境,包括Java虚拟机,Java类库,Java命令和其他的一些基础组件,但时不鞥创建新程序,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
JDK
它是功能齐全的Java SDK,它包含JRE,还有编译器(javac)和工具(javadoc和jdb),它能够创建和编译程序。
JDK和JRE的区别
- JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
- JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。
具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。
JVM&JRE&JDK关系图
1.2 什么是自动装箱和自动拆箱
自动装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。 比如:把int转化成Integer,double转化成Double,等等。反之就是自动拆箱。
- 基本数据类型: boolean,char,byte,short,int,long,float,double
- 包装类型: Boolean,Character,Byte,Short,Integer,Long,Float,Double
//自动装箱
Integer total = 99;
//自动拆箱
int totalprim = total;
综上所述,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。
谈谈 int和Integer的区别
- Integer是int的包装类,int则是java的一种基本数据类型
- Integer变量必须实例化后才能使用,而int变量不需要
- Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
- Integer的默认值是null,int的默认值是0
延伸:
关于Integer和int的比较
由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。
Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j); //false
Integer变量和int变量比较时,只要两个变量的值是相等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)
Integer i = new Integer(100);
int j = 100;
System.out