final在Java中有什么作用?
- final修饰类,表明此类不能被继承
- final修饰方法,表示此方法不能被子类重写
- final修饰变量,表示不可修改
普通类和抽象类有哪些区别?
- 抽象类必须用abstract来修饰,且不能被实例化
- 抽象类的子类必须实现抽象类中的所有抽象方法,否则子类仍然是抽象类
- 有抽象方法的类一定是抽象类
- 抽象方法不能声明为静态、不能被static、final修饰
Java中IO流分为几种?
- 按流划分,可以分为输入流和输出流(inputStream、outputStream)
- 按单位划分,可以分为字节流和字符流(reader、writer)
BIO、NIO、AIO有什么区别?
- BIO:同步阻塞,一个连接一个线程
- NIO:同步非阻塞,一个请求一个线程
- AIO:异步非阻塞,一个有效请求一个线程
Java实现序列化的作用?
Java序列化需要实现Serializable
接口或者Externalizable
接口
- 方便在远程调用时对象的解码与编码
- 为了在程序中能直接以对象的形式进行保存、直接进行调用
平常实体类没有实现Serializable接口,为何也能存进数据库?
是因为在声明变量的时候,如String、int、Boolean时,数据类型已经实现了序列化
其他:子类实现序列化而父类没有实现序列化,在序列化子类时,子类的属性状态会被写入而父类的属性状态不会被写入
什么情况下需要克隆?
想对一个对象进行复制,而又需要保留原有对象
如何实现对象克隆?
- 实现Cloneable接口,重写clone方法
- 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深克隆
- BeanUtils,apache和Spring都提供了bean工具,只是这都是浅克隆
深拷贝和浅拷贝区别是什么?
- 浅拷贝:仅仅克隆基本类型变量,不克隆引用类型变量,拷贝对象的更改会影响原有对象
- 深克隆:既克隆基本类型变量,又克隆引用类型变量,拷贝对象的更改不会影响原有对象
throw和throws的区别
- throw作用在方法内,表示抛出具体的异常,由方法体内的语句处理
- throws作用在方法上,表示抛出异常,由调用者进行处理
String、StringBuilder、StringBuffer
- String是不可变对象,每次更改都会产生新的对象
- StringBuilder是可变对象,效率高,但是线程不安全,多用于单线程
- StringBuffer是可变对象,效率不如StringBuilder,但线程安全,多用于多线程
StringBuilder和StringBuffer底层使用的是char数组,支持扩容,避免了对象的创建。两者的默认初始容量都是16
Java中的引用类型
- 强引用:默认的引用类型,如果对象不为null,垃圾回收器将永远不会回收被引用的对象
- 软引用:在内存足够时软引用不会被回收,内存不足时,系统才会回收软引用对象
- 弱引用:进行垃圾回收时,弱引用就会被回收
- 虚引用:Java虚拟机不负责清理虚引用,但是它会把虚引用放到引用队列里