一.Java基础面试题:基本概念,基本语法,基本数据类型
1.JAVA语言的特点
2.JVM,JDK和JRE是什么
3.字节码是什么,字节码的好处
4.JIT和AOT的模式
5.JAVA编译与解释并存
6.JAVA和C++的区别
1.标识符和关键字的区别是什么
2.continue,break和return的区别
3.变量
4.方法
1.JAVA几种基本数据类型
2.基本类型和包装类型的区别
3.包装类型的缓存机制
4.自动装箱机制和拆箱机制
5.超过long的最大数值应该如何表达
6.浮点数运算为什么会有精度丢失
7.如何解决浮点数精度丢失问题
一.Java基础面试题:基本概念,基本语法,基本数据类型
1.JAVA语言的特点
- ①面向对象:封装多态继承
- ②java语言支持多线程,支持网络编程
- ③java语言编译与解释并存,jvm虚拟机有平台无关性。
2.JVM,JDK和JRE是什么
- ①JVM:能够运行字节码的虚拟机。
- ②JDK:java开发环境包,包含了JRE+编译器。
- ③JRE:java运行环境包,包含了jvm+基础类库。
3.字节码是什么,字节码的好处
- 字节码是什么?
能够让jvm运行的代码就叫字节码。 - 字节码的好处是?
- ①字节码不针对特定的机器,只针对jvm虚拟机,一次编译处处运行。
- ②字节码解决了传统的解释型语言效率低的问题,同时保留了解释型语言的可解释性。
4.JIT和AOT的模式
- JIT模式(运行时)
JIT运行时与jvm交互,将合适的字节码直接编译为机器码并缓存,下次直接使用。 - AOT模式(运行前)
不支持动态代理反射等特性。
5.JAVA编译与解释并存
- ①编译:编译一次性成为机器码(c,c++)
- ②解释:一句一句解释为机器码(python)
- java先编译生成字节码,再将字节码解释执行。
6.JAVA和C++的区别
- ①C++提供指针直接访问内存,java不提供。
- ②C++的类为多继承结构,而java为单继承。
- ③c++不仅有方法的重载,还有运算符的重载。而java只有方法的重载
- ④java有垃圾回收机制,不用手动释放。
1.标识符和关键字的区别是什么
- ①标识符:我们为类或接口,变量方法起的名字
- ②关键字:JAVA语言赋予了特殊含义的字符串
2.continue,break和return的区别
- ①continue:跳出当前循环。
- ②break:跳出整个循环体。
- ③return
结束方法。
返回具体的一个特定值。
3.变量
- ①成员变量和局部变量
语法:成员变量用封装,static,final。局部变量只能用final修饰。
存储方式:成员变量存储在方法区(static)或堆(非static)。局部变量存在栈内存。
生存时间:成员变量随类(static)或对象(非static)消亡而消亡。局部变量随方法调用结束而消亡。 - ②静态变量
被所有类共享,且所有类对象共享一份静态变量。 - ③字符型常量和字符串常量。
字符型常量:用单引号修饰,一个字符,(相当于一个整型ASCII码)
字符串常量:用双引号修饰,若干个字符,(相当于一个地址值在内存中存放位置)
4.方法
- ①方法种类
有参有返回,有参无返回,无参有返回,无参无返回。 - ②静态方法和实例方法
修饰符:静态方法用static修饰,实例方法不用static
调用:静态方法可以用类.或者对象.,而实例方法只能对象.调用。
访问权限:静态方法只能访问静态成员,实例方法可以访问静态成员和非静态成员。 - ③重载和重写(方法名都相同)
范围:重载同一个类,重写子类。
参数:重载参数不相同,重写参数相同。
返回值:重载返回值可以不相同,重写返回值可以相同或者为其子类。
异常:重载异常可以不相同,重写异常可以相同或者为其子类。
访问修饰符:重载可以不相同,重写访问权限可以相同或者比原权限大。 - ④可变长参数
等同于数组。
只能放在参数列表的最后一个。
优先匹配固定参数。
1.JAVA几种基本数据类型
- 整型:byte(1),short(2),int(4),long(8)
- 浮点型:float(4),double(8)
- 字符型:char(2)
- 布尔型:boolean(1位)
2.基本类型和包装类型的区别
- 默认值:成员变量不赋值即包装类型为null,基本类型不为null但是有默认值
- 泛型:包装类型可用泛型,基本类型不可用泛型
- 存储:成员变量未被static修饰则无论包装类型还是基本类型都存在堆中,局部变量的包装类型存在堆中而基本类型存在栈中。
3.包装类型的缓存机制
- ①Byte,Short,Integer,Long默认创建数值在-128,127之间的缓存数据。Character创建0,,127之间的缓存数据。
- ②直接赋值才会缓存到方法区的常量池中,创建对象只会放到堆中。(同字符串)
4.自动装箱机制和拆箱机制
- 自动装箱:Integer i = 10(Integer.valueOf(10))
- 自动拆箱:int n = i(i.intValue())
5.超过long的最大数值应该如何表达
- 使用BigInteger来表示,内部使用int[]类型的数组来存储整型数据(分割为32位一组的形式存在数组中)
6.浮点数运算为什么会有进度丢失
- 计算机底层用二进制存储小数(宽度有限,超出宽度后只能截断)
7.如何解决浮点数精度丢失问题
- 用BigDecimal来解决浮点数精度丢失问题。
- BigDecimal可以用double来初始化(无法精确构造一个BigDecimal),也可以用String来初始化(截断后面的小数位)
BigDecimal用double初始化时,把double转换为了BigDecimal,存在精度损失风险,而用string初始化,会按double实际表达的精度对尾数进行截断。 - BigDecimal等值比较要用compareTo而不是equals。
equals不仅会比较数值,还会比较精度,如1和1.0不相等用equals