面试 Java 基础八股文十问十答 第一期
作者:程序员小白条
从今天开始,将会更新我自己收集和总结的八股文。有需要面试的小伙伴可以收藏一下这个系列,一定会有所帮助!
⭐点赞⭐收藏⭐不迷路!⭐
内容概览:
1.JDK和JRE有什么区别?
答:
- 首先要了解中文名称
- JDK(Java Development Kit) Java开发工具包
- JRE (Java Runtime Environment) Java运行环境
- JVM (Java virtual machine) Java虚拟机
JDK = JRE +Java开发工具(比如你用的Javac.exe 编译源码 转化成字节码)
JRE = JVM + Java的核心类库(比如awt javaFx(界面) )
2.Java的重要特点说几个
答:
- 面向对象(OOP)
- 健壮、强类型机制(Java静态语言,像JS,PHP,Python动态语言,不用指明类型,声明的时候简单,但优点也是缺点,所以JS->TS,用泛型会更加安全,在多态的向上传型和向下转型的过程中也会减少类型转化次数)、异常处理机制(try catch finally(可以省略),注意trc catch 块中有return 阻挡不了fianlly执行)、垃圾自动收集(system,gc(),弱引用,软引用,强引用,虚引用之类的问题)
- 跨平台性(指的是编译后的字节码文件是跨平台性的,比如windows->Linux OR mac) 因为操作系统(OS)是在硬件上的第一层软件
- 解释性语言,编译性语言比如:c/c++,解释性语言JS,PHP,Java,解释性语言编译后不能直接被机器执行,需要一个环境(解释器JVM),Java既可以说是解释性又可以说是编译性,解释性主要是跨平台性,编译性主要是Java代码需要编译才能运行,主流说法还是解释性语言。
3.Java的基本数据类型有哪些?
- byte、short、char、int、long、float、double、boolean
补充:类,接口类,数组,枚举.注解,字符串都属于引用类型
- 存储位置的区别:
- 如果在方法中定义的基本数据类型,是在栈中存放,因为都听说过方法栈,在方法中定义的引用类型,它的内存地址值放在栈中,而该变量所指向的对象放在堆中,感觉和string为什么是不可变的差不多,底层维护的private final char value[] 单个字符内容可变,但是数组的引用地址不可变。
- 如果是全局变量,那么不管是引用类型还是基本数据类型都放在堆中
4.==和equals的区别是什么?
- == 可以判断基本数据类型和引用类型
- == 判断基本数据类型,比较的是值是否相等
- == 判断引用类型,比较的地址是否相等
- equals是Object类中的方法,Object类还有clone()克隆,创建对象的一种方式,toString()全类名+@+哈希值的十六进制,notify()随机唤醒线程配置synchornized使用,wait()线程等待,释放当前锁,hashCode(),getClass()等等。equals只能用于比较引用类型
- 当你想比较两个对象中的内容是否相等,记得重写equals,不然判断的是两个的地址,肯定不同,判断的是对象的内容
5.final在Java中有什么引用?
- 修饰基本数据类型,表示常量,比如CACHE_SIZE = 10
- 修饰引用数据类型,比如对象,数组,则该对象,数组本身内容可以修改,但地址的引用不能改变
- 修饰全局变量时必须在定义时,赋初值,当然赋初值有很多位置,比如:定义时候、构造器(构造函数)、代码块,当然final+static 一起的话,构造器就不能进行赋初值了,静态的类加载相关的,构造器是对象实例哦,跟this,super差不多
- 修饰方法,表示不被重写,当然重写肯定是父类和子类,也不必多说,重载是一个类中
- 修饰类,表示不可继承类,比如String
- 别把fianl修饰类,和实例化挂钩,final只是不能继承,不是抽象类的概念哦
- 已经是final类,就没有必要用fianl修饰方法,因为方法重写是在继承的基础只上的
- final+static 效率更高,可以从接口那块看出来,默认常量,public static fianl 编译器底层做了优化
6.Math.round、Math.ceil、Math.floor用法
- round可以用+0.5,然后向下取整(小于等于)
- 比如Math.round(-11.3) = -11,Math.round(-11.8)= -12
- floor:向下取整 Math.floor(11.3) = 11;Math.floor(-11.3) = -12;
- ceil: 向上取整 Math.ceil(11.3) = 12; Math.ceil(-11.3) = 11;
- ceil是天花板的意思,floor是地板,应该很容易记忆
7.String两种创建对象的区别
- 方法一: 直接赋值: String s = “xiaobaitiao”
- 方法二:调用构造器: String s2 = new String (“xiaobaitiao”)
- 方法一过程; 先从常量池查看是否有"xiaobaitiao",如果有,直接指向,如果没有,重新创建,然后指向,S最终指向的是常量池的空间地址 创建0或1个对象
- 方法二过程: 先在堆中创建空间,里面维护了一个value属性,指向常量池的xiaobaitiao空间,如果常量池没有"xiaobaitiao",重新创建,如果有,通过value指向,S2最终指向的是堆中的空间地址 创建1或2个对象
- 补充: intern()方法,会查看常量池是否包含此字符串用equals方法确定,返回的是常量池的地址对象
8.抽象类和普通类的区别在哪里?
- 抽象类不能被实例化
- 抽象类可以(可以没有)有抽象方法,没有方法体
- 有抽象方法,一定是抽象类
- abstract只能修饰类和方法
- 抽象类的子类必须实现抽象类中的所有抽象方法,除非子类也是抽象类
- 抽象方法不能使用private,final和静态来修饰,因为与重写相违背
9.接口和抽象类有什么区别和联系?
- 联系
- 接口和抽象类都不能被实例化
- 接口和抽象类都阔以包含抽象方法
- 区别
- 接口是可以被一个类实现多个,而抽象类因为Java是单继承机制,只能直接继承一个
- 抽象类可以定义普通成员变量和静态常量,接口中只能定义静态常量,不能定义普通成员变量
- 抽象类,说到底还是一个类,可以与构造器完成初始化操作,接口不能包含构造器
- JDK1.8接口中可以有方法体,因为添加了静态方法和默认方法,JDK1.9添加私有方法
10.BIO、NIO、AIO有什么区别?
- BIO是同步阻塞的 (JDK1.4之前)
- NIO同步非阻塞 (JDK1.4)
- AIO异步非阻塞 (JDK1.7)
- 异步和同步的区别:在于调用者,如果是同步,调用者调用接口,需要等到接口返回数据,才做其他工作,如果是异步,调用者调用接口后,直接做其他工作,不用等待接口返回数据。
- 阻塞和非阻塞区别:在于被调用者,如果是阻塞:被调用者做完调用者给的任务后给出反馈,这是阻塞,如果是非阻塞,被调用者直接给出反馈,然后再干活,这是非阻塞。