Java高频面试题(基础篇)
Java基础
1.1 什么是Java虚拟机
java虚拟机简单来说就是一个虚拟的机器,对于Java来说java编译后生成字节码文件,是通过虚拟机来运行字节码文件,将字节码文件转换为机器语言,不同的系统的java虚拟机不同,编译后的字节码文件时一致的,保证了java的跨平台功能,即为我们常说的“一次编译,到处执行。”
1.2 为什么Java被称为是“平台无关的语言”
因为Java在编译后生成的是字节码文件,计算机是无法直接运行的,Java的字节码文件是依赖于JVM来运行的,在不同的系统中,JVM是不同的,但是源文件以及编译后的字节码文件是一致的,所以我们无需考虑平台是否能执行Java源文件,所以程序员也不用因为操作系统不一致去重新修改或重新编译Java源文件。
1.3 JDK和JRE的区别是什么?
JDK是完整的Java软件开发包,JDK是包含JRE与JVM的,我们只要安装了JDK,就可以实现Java的开发、编译、运行。
JRE是Java程序的运行环境,它包含了JVM(Java虚拟机),他是为java提供一些标准类库,当我们不需要进行Java开发只需要进行编译运行的时候,JRE就可以满足
1.4 Java语言有什么特点
Java语言的特点有:开源、跨平台、高效、面向对象的高级语言。
Java是编译型与解释型的高级语言
Java是一个支持并发、基于类、面向对象的一种高级语言。
代码开发模块化,易于维护与修改(我们笨想想,我们把一个整体分为一些小部分,当我们需要维护和修改时只需要操作我们需要的那一部分不就可以了)
代码复用(继承),增强代码的可靠性和灵活性(泛型),增强代码可读性(泛型)
1.5 Java的基本数据类型有哪些
整型:
- byte 1字节 8位 2^8 默认0
- short 2字节 16位 2^16 默认0
- int 4字节 32位 2^32 默认0
- long 8字节 64位 2^64 默认0
浮点型:
- float 4字节 (比long长) 默认0.0
- double 8字节 默认0.0
布尔型
- boolean 默认false
字符型
- char 2字节 8位 2^8 \u0000
1.6 什么是自动拆箱与自动装箱
因为Java的本质是面向对象的,但是Java还存在一类数据类型那就是基本数据类型,他们不属于类的范畴,对于一些方法只能使用类,那么基本数据类型就没有办法去操作了,产生了很大的局限性,在Java中我们提供了包装类,来解决这个问题,基本数据类型自动转换为包装类就是自动装箱,反之则是自动拆箱
int Integer
byte Byte
short Short
long Long
boolean Boolean
char Character
float Float
double Double
1.7 String StringBuffer StringBuilder三者的区别
String:底层是final修饰的char[]数组,长度是不可变的,String不适合于频繁修改的字符串上,String一般使用+作为字符串拼接,String类型修改变的是引用,也 就是指向常量池中的引用。
StringBuffer:底层是char[]数组,长度可变,线程安全,效率低,一般用于多线程保证线程同步, 使用append()作为字符串的追加
StringBuilder:底层是char[]数组,长度可变,线程安全,效率高,一般用于单线程, 使用append()作为字符串的追加
1.8 ==和equals比较有什么区别
==
对于基本数据类型来说,比较的值
对于引用数据类型来说,比较的是其在栈内存中保存在堆内存中的地址值
equals
无法比较基本数据类型,因为equals是Object类中的一个方法
对于没有重写equals的类来说,底层就是==
对于重写equals的类来说,就是按重写的equals方法来进行比较的。
1.9 & |和&& ||
&&和||是短路运算符
何为短路运算符,我们从名字上就可以知道
- 对于&&来说,当我们第一个条件表达式为假的时候,就不需要判断第二个条件了,直接返回false
- 对于||来说,当我们第一个条件表达式为真的时候,就不需要判断第二个条件了,直接返回false
对于&和|来说,两个条件表达式都要进行判断
1.10 Java中垃圾回收的主要目的?
当在虚拟机堆内存中,没有栈内存指向其地址,就为垃圾,垃圾回收的主要目的就是,识别这些垃圾并释放这些垃圾所占有的内存。
1.11 System.gc()于Runtime.gc()会做什么事情?
这两个方法都是用来提醒JVM要进行垃圾回收,但是立刻执行还是延后执行是取决于JVM的。
1.12 finalize()方法什么时候被调用
finalize方法是在JVM进行垃圾回收时被调用,在释放对象占用内存之前,垃圾回收器会调用对象的finalize方法。一般建议在该方法中释放对对象所持有的资源。
1.13 堆和栈的区别,类和对象
堆内存:保存的是对象的具体信息,在程序中堆空间的开辟是通过new来完成的
栈内存:保存的是一块堆内存的地址,即,通过地址找到堆内存,然后再找到对象内容
1.14 垃圾空间
所谓的垃圾空间就是在堆内存中没有被栈内存所指向的空间,即为垃圾空间,所有垃圾将被GC定期进行回收并会自动进行垃圾处理,如果我们产生过多的垃圾空间,会造成垃圾回收频繁,一定会影响到GC的处理性能,从而会降低程序运行效率,所以我们应该避免过多的垃圾空间产生。
1.15 主方法分析
public static void main
public:是权限修饰符代表访问权限,主方法是一切的开始点,开始点一定是公共的
static:程序的执行是通过类名完成的,所以表示此方法是由类直接调用
void:因为主方法是开始,起点一旦开始就没有返回的可能了
main:是一个系统定义好的方法名称
String args[]:字符串数组,可以实现程序启动参数的接收。
1.16 Object类
在Java中唯一没有父类也就是不存在集成关系的类就是Object类,在所有类的默认情况下都是Object的子类
在Object类设计的时候考虑到了所有的继承问题,所该类提供了无参构造方法,所以子类不会出现构造方法调用失败的错误
如果一个程序的方法要求可以接收所有类的对象的时候就可以利用Object来实现处理。