Java常见面试题,Java基础部分
Java基础面试题
下面是学习过程中接触的Java基础部分的面试题
- JVM、JRE 和 JDK 的关系
- 什么是跨平台性?原理是什么?
- &和&&的区别?
- 用最有效率的方法计算 2 乘以 8
- 在没有使用临时变量的情况如何交换两个整数变量的值?
- short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
- float f=3.4;是否正确?
Java基础面试题解答(不足修改)
1.JVM、JRE 和 JDK 的关系
JVM概述
JVM 全称Java Virtual Machine,可以理解成一个可运行 Java 字节码的虚拟计算机系统:
- 它有一个解释器组件,可以实现 Java 字节码和计算机操作系统之间的通信
- 对于不同的运行平台,有不同 的 JVM。
JVM 屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”。
JRE概述
JRE全称Java Runtime Environment,Java 运行时环境。它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm 来说,多出来的是一部分的 Java 类库。
JDK 概述
JDK 全称 Java Development ToolKit,是 Java 语言开发工具包。JDK 是整个 JAVA 的核心,包括了 Java 运行环境(Java Runtime Environment),一堆 Java 工具(javac/java/jdb 等)和 Java 基础的类库(即 Java API 包括rt.jar)。
它不提供具体的开发软件,它提供的是无论你用何种开发软件写 Java 程序都必须用到的类库和 Java 语言规范。
简单来说就是JDK包含JRE,JRE包含JVM的关系
JDK、JRE、JVM的区别与联系
JVM不能单独搞定class的执行,解释class的时候JVM需要调用解释所需要的类库lib。在JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
JVM+Lib=JRE。总体来说就是,我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。
a.JDK和JRE区别:在bin文件夹下会发现,JDK有javac.exe而JRE里面没有,javac指令是用来将java文件编译成class文件的,这是开发者需要的,而用户(只需要运行的人)是不需要的。JDK还有jar.exe, javadoc.exe等等用于开发的可执行指令文件。这也证实了一个是开发环境,一个是运行环境。
b.JRE和JVM区别:JVM并不代表就可以执行class了,JVM执行.class还需要JRE下的lib类库的支持,尤其是rt.jar。
2.什么是跨平台性?原理是什么?
所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。
实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行java程序。(注意不是能在所有的平台上运行,关键是该平台是否能安装相应的虚拟机)。
总结:Java程序之所以能够实现跨平台运行,是因为它根本就不直接运行在任何底层平台上,而是需要在哪里运行,就在哪里(如Windows平台)事先准备好自己的Java平台,而这只是仅仅是安装和配置一个软件而已!
3.&和&&的区别?
1.&
(1)按位运算符; (2)逻辑运算符
作为按位运算符时:
当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01
作为逻辑运算符时:
&左右两端条件式有一个为假就会不成立,但是两端都会运行,比如(1+2)=4 &(1+2)=3;;1+2=4即使为假也会去判断1+2=3是否成立。
2.&&——逻辑运算符
&&也叫做短路运算符,因为只要左端条件式为假直接不成立,不会去判断右端条件式。
例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。
相同点:只要有一端为假,则语句不成立
4. 用最有效率的方法计算 2 乘以 8
2 << 3,
因为将一个数左移n 位,就相当于乘以了2 的n 次方,那么,一个数乘以8 只要将其左移3 位
即可,而位运算cpu 直接支持的,效率最高,所以,2 乘以8 等於几的最效率的方法是2 << 3。
5.在没有使用临时变量的情况如何交换两个整数变量的值?
int a = 3;
int b = 2
a = a + b;//此时 a = 5
b = a - b;//b = 5 - 2 = 3
a = a - b//a = 5 - 3 = 2
6.short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
short s1 = 1; s1 = s1 + 1;有错
s1是short型,s1+1是int型,不能显式转化为short型。可bai修改为s1 =(short)(s1 + 1) 。
short s1 = 1; s1 += 1正确。
7.float f=3.4;是否正确?
不正确。精度不准确,应该用强制类型转换,如下所示:
float f=(float)3.4 或float f = 3.4f
在java里面,没小数点的默认是int,有小数点的默认是 double;