一、JDK 和 JRE 有什么区别?
JDK (Java Development Kit),java 开发工具包
JRE (Java Runtime Environment),Java 运行环境
JDK 中包含JRE,JDK 中有一个名为 jre 的目录,里面包含两个文件夹 bin 和 lib bin 就是JVM ,lib 就是 JVM 工作所需要的类库
二、== 和 equals 的区别?
== 既可以比较基本数据类型,也可以比较引用数据类型:
基本数据类型:比较的是值
引用数据类型:比较的是地址
equals 只能用于比较引用数据类型:
如果没有重写 equals方法,equals 相当于 ==
如果重写了equals方法,equal比较的是对象的内容
三、final 关键字的作用?
(1)用来修饰类:
被 final 修饰的类为最终类,不能被继承
(2)用来修饰方法:
被 final 修饰的方法为最终方法,不能被重写,但可以被继承
(3)用来修饰变量:
被 final 修饰的变量为常量,不能重新赋值
四、普通类和抽象类有什么区别?
(1)抽象类不能被实例化
(2)抽象类可以有抽象方法,只需声明,无需实现
(3)有抽象方法的类一定是抽象类
(4)抽象类的子类必须实现抽象类中的所有抽象方法
(5)抽象方法不能声明为静态,不能被 static 、final 修饰
五、接口和抽象类有什么区别?
(1)接口:
1.接口使用 interface 修饰
2.接口不能实例化
3.类可以实现多个接口
4.java8之前,接口中的方法都是抽象方法,省略了 public abstract ,java 8之后,接口中可以定义静态方法,静态方法必须有方法体,普通方法没有方法体,需要被实现
(2)抽象类
1.抽象类使用 abstract 修饰
2.抽象类不能被实例化
3.抽象类只能单继承
4.抽象类中可以包含抽象方法和普通方法,普通方法需要有方法体
5.如果一个类继承了抽象类:
如果实现了所有的抽象方法,子类可以不是抽象类
如果没有实现所有的抽象方法,子类仍然是抽象类
六、 java 中的 IO 流分为几种?
(1)按流划分:可以分为输入流和输出流
(2)按单位划分:可以分为字节流和字符流
字节流:inputStream 、outputStream
字符流:reader 、writer
七、BIO 、BIO 、AIO 有什么区别?
(1)BIO:同步阻塞IO
一个连接一个线程
BIO就是我们平常使用的传统IO,它的特点是模式简单,使用方便,并发处理能力底
客户端在请求数据的过程中,保持一个连接,不能做其它事情
(2)NIO:同步非阻塞IO
一个请求一个线程
NIO是传统IO(BIO)的升级,客户端和服务端通过 Channel (通道)通讯,实现了多路复用
客户端在请求数据的过程中,不用保持一个连接,不能做其他事情
(3)AIO:异步非阻塞IO
一个有效请求一个线程
AIO是 BIO 的升级,实现了异步非阻塞
客户端在请求数据的过程中,不用保持一个连接,可以做其他事情
八、什么是反射?
反射就是将类的各个组成部分封装对象的过程
(1)把类 - 封装为 class 类的对象
(2)把成员变量 - 封装为 Field 类的对象
(3)把构造方法 - 封装为 Constructor 类的对象
(4)把成员方法 - 封装为 Method 类的对象
好处:
(1)可以在程序运行的过程中,获取一个类的所有信息,并操作这些对象
(2)可以解耦,提高程序的可扩展性
九、深拷贝和浅拷贝的区别?
(1)浅拷贝是指:只会拷贝基本数据类型的值,以及实例对象的引用地址,并不会拷贝引用地址所指向的对象,也就是浅拷贝出来的对象,内部的属性指向的是同一个对象
(2)深拷贝是指:即会拷贝基本数据类型的值,也会拷贝实例对象的引用地址所指向的对象,深拷贝出来的对象,内部的属性指向的不是同一个对象
十、throw 和 throws 的区别?
(1)throw:作用在方法内,表示抛出具体异常,由方法体内的语句处理,一定抛出了异常
(2)throws:作用在方法声明上,表示抛出异常,由调用者来进行异常处理,可能出现异常,不一定会发生异常
十一、String 、StringBuilder 、StringBuffer 的区别?
(1)String 是不可变的,如果尝试去修改,会生成一个字符串对象,StringBuilder 和 StringBuffer 是可变的,StringBuilder 和 StringBuffer 都是在原对象的基础上操作
(2)StringBuilder 是线程不安全的,StringBuffer 是线程安全的,所以在单线程环境下,StringBuilder 的效率更高
(3)对于操作的效率而言,StringBuilder > StringBuffer >String
十二、 Java 中的异常体系?
(1)java 中的所有异常都来自顶级父类 Throwable
(2)Throwable 下有两个子类 Exception 和 Error
(3)Error 是程序无法处理的错误,一旦出现这个错误,则程序将被迫停止运行
(4)Exception 不会导致程序停止,又分为两个部分 RuntimeException 运行时异常和 CheckedException 检查异常
(5)RuntimeException 常常发生在程序运行过程中,会导致程序当前线程执行失败
(6)CheckedException 常常发生在程序编译过程中,会导致程序编译不通过
十三、final 、finally 、finalize 有什么区别?
(1)final 可以修饰类、变量、方法,修饰的类不能被继承,修饰的变量不能重新赋值,修饰的方法不能被重写
(2)finally 需配合 try catch 使用,用于异常的处理,finally 代码块中的语句无论是否发生异常都会执行,常用于关闭资源
(3)finalize 是 Object 类中的方法,用于垃圾回收,一般情况下不需要我们重写
十四、List 和 Set 的区别?
(1)List :有序,按对象进入的顺序保存对象,可重复,允许多个 Null 元素对象,可以使用 Iterator 取出所有元素,在逐一遍历,还可以使用 get ( int index ) 获取指定下标的元素
(2)Set :无序,不可重复,最多允许有一个 Null 元素对象,取元素时只能用 Iterator 接口取出所有元素,在逐一遍历各个元素
十四、队列 和 栈是什么?有什么区别?
队列 和 栈 是两种不同的数据结构,都是用来存储数据的
区别:
(1)操作的名称不同:队列的 插入 称为 入队,队列的 删除 称为 出队。栈的插入 称为 进栈,栈的删除 称为 出栈
(2)可操作的方向不同:队列是在队尾入队,队头出队,即两边都可操作,而栈的进栈和出栈都是在栈顶进行,无法对栈底直接进行操作
(3)操作的方法不同:队列是 先进先出(FIFO),而栈为先进后出(FILO)
十五、方法重载和方法重写的区别?
(1)重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和权限修饰符可以不同,发生在编译时
(2)重写:发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,权限修饰符范围大于等于父类,如果父类方法的权限修饰符为 private 则子类就不能重写该方法
十六、Java 中有哪些类加载器?
JDK 自带有三个类加载器:BootstrapClassLoader ExtClassLoader AppClassLoader
(1)BootstrapClassLoader 是 ExtClassLoader 的父类加载器,默认负责加载 %JAVA_HOME%lib 下的 jar 包和 class 文件
(2)ExtClassLoader 是 AppClassLoader 的父类加载器,默认负责加载 %JAVA_HOME%lib/ext 文件夹下的 jar 包 和 class 类
(3)AppClassLoader 是自定义类加载器的父类,负责加载 claspath 下的类文件
十七、