目录
声明
JVM功能说明
功能1:实现Java程序的跨平台性
功能2:自动内存管理(内存分配、内存回收)
相关面试题
关键字和保留字
相关面试题
变量和数据类型
自动类型提升
强制类型转换
基本数据类型转换成字符串
使用String类的valueOf方法:
使用基本数据类型对应的包装类的toString方法:
相关面试题
浮点数比较
运算符
浮点数取模求余
Lambda运算符号
编码
声明
此文档不包括Java基础语法,仅是Java关键特性和部分底层细节的概述,包含一些八股文面试题。用于快速复习Java。
JVM功能说明
JVM(J
ava V
irtual M
achine ,Java虚拟机):是一个虚拟的计算机,是Java程序的运行环境。JVM具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。
功能1:实现Java程序的跨平台性
功能2:自动内存管理(内存分配、内存回收)
-
Java程序在运行过程中,涉及到运算的
数据的分配
、存储
等都由JVM来完成 -
Java消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间。
-
GC的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上
减少了
因为没有释放空间而导致的内存泄漏
。
相关面试题
面试题:
Java程序还会出现内存溢出和内存泄漏问题吗?
答案: Yes!
关键字和保留字
相关面试题
说明:
关键字一共
50个
,其中const
和goto
是保留字
(reserved word)。
true
,false
,null
不在其中,它们看起来像关键字,其实是字面量,表示特殊的布尔值和空值。
变量和数据类型
自动类型提升
规则:将取值范围小(或容量小)的类型自动提升为取值范围大(或容量大)的类型 。
-
(1)当将存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给存储范围大的变量时,通常会发生隐式类型转换(implicit type conversion)或称为自动类型转换(automatic type conversion)。
-
(2)当存储范围小的数据类型与存储范围大的数据类型变量一起混合运算时,会按照其中最大的类型运算。
-
(3)当byte,short,char数据类型的变量进行算术运算时,按照int类型处理。
强制类型转换
规则:将取值范围大(或容量大)的类型强制转换成取值范围小(或容量小)的类型。
自动类型提升是Java自动执行的,而强制类型转换是自动类型提升的逆运算,需要我们自己手动执行。
-
(1)当把存储范围大的值(常量值、变量的值、表达式计算的结果值)强制转换为存储范围小的变量时,可能会
损失精度
或溢出
。 -
(2)当某个值想要提升数据类型时,也可以使用强制类型转换。这种情况的强制类型转换是
没有风险
的,通常省略。 -
(3)声明long类型变量时,可以出现省略后缀的情况(可以省略后缀"L"或"l"。)。float则不同。当声明float类型变量时,必须在数字面量后面添加"f"或"F"后缀,以指示该数字为float类型,否则编译器会将其默认解释为double类型。
基本数据类型转换成字符串
使用String类的valueOf方法:
String类的valueOf方法可以将任何类型的数据转换成字符串。例如,将int类型的数据转换成字符串可以使用以下代码:
int num = 123; String str = String.valueOf(num);
使用基本数据类型对应的包装类的toString方法:
基本数据类型对应的包装类(如Integer、Double、Boolean等)都提供了
toString方法,可以将对应类型的数据转换成字符串。例如,将double类型的数据转换成字符串可以使用以下代码:
double num = 3.14; String str = Double.toString(num);
相关面试题
问答:为什么标识符的声明规则里要求不能数字开头?
//如果允许数字开头,则如下的声明编译就可以通过: int 123L = 12; //进而,如下的声明中l的值到底是123?还是变量123L对应的取值12呢? 出现歧义了。 long l = 123L;
浮点数比较
在Java中,当我们需要比较两个浮点数(double或float)是否相等时,不能直接使用等于号(==)进行比较。
这是因为浮点数在计算机中是以二进制表示的,二进制数的精度是有限的,可能存在精度误差。
正确的比较方法是使用Java提供的Math.abs(double1 - double2)
方法,该方法返回两个double数值的绝对值之差。
较两个浮点数是否相等,只需要判断它们的差的绝对值是否小于一个极小的数值(如0.0001),若小于该数值,则认为两个浮点数相等。
double a = 1.23456789; double b = 1.23456788; double epsilon = 0.0001; if (Math.abs(a - b) < epsilon) {System.out.println("a equals b"); } else {System.out.println("a does not equal b"); }
运算符
浮点数取模求余
当a是小数时,取模运算的公式是:a - (int)(a/b) * b
Lambda运算符号
待完善