========= 基础 =========
1、封装、多态和继承
封装:为了安全、私有化属性、提供 get/set方法对外访问
继承:复用代码,继承父类的方法和属性,也可以自己扩展
多态:可维护性和扩展性强,条件是重写和继承
2、final class 和 static
3、抽象类和接口
https://www.zhihu.com/question/20149818
相同:都有抽象方法、都不能被实例化
不同:
4、Java 虚拟机、GC算法
5、数据结构:数组、集合、堆栈、一对一(链表、队列)、一对多(树)、多对多(图)
https://blog.fundebug.com/2018/08/27/code-interview-data-structure/
6、方法重写和重载
7、并发和并行
8、Java 的数据类型
基本类型 + 引用类型
9、Java Map 、List 、Set区别
10、String 、 StringBuffer 和 StringBuider 的区别
(1)STRING的长度是不可变的,STRINGBUFFER的长度是可变的。
(2)如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
(3)StringBuffer 线程安全,StringBuider线程不安全,但是快
11、多线程实现方式
3种:Thread、Runable和 Callable
12、如何避免 hashCode为负值
与16进制的最高位为0 的数据做 & 计算
13、i++ 和 ++i 的区别
14、Java Comparable 和 Comparator
15、属性添加 transient
@Transient表示该属性字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化
16、位运算
17、Java IO
mkdir和mkdirs有什么区别
18、写字节文件和写字符文件使用的流,举例一个
(1)写字符文件
new BufferedWriter(new FileWriter(filePath,false)).write("---------")
(2)写字节文件
当Eden已满时,在Eden上运行次要GC,并将从Eden和Survivor 1中存活的物件复制到Survivor 2。Survivor区域被交换。如果对象足够旧或Survivor2已满,则将其移至Old。最后,当Old接近满时,将调用完整的GC
20、Java 查看年轻代、老年代内存的命令
jmap -heap [pid]
jstat -gc pid 毫秒 次数
jstat -gcutil pid
========= 进阶 =========
1、== 和 equals的区别
- == 针对 基本数据类型比较
- equals 针对 引用类型的比较,在内存中的地址是否相同,值是否相同
2、 final/finally/finalize的区别
- final 用于声明属性,方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承.
- finally 是异常处理语句结构的一部分,表示总是执行.
- finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等. JVM不保证此方法总被调用.
3、反射机制
http://wiki.jikexueyuan.com/project/java-interview-question/java/reflection.html
JAVA反射机制是在运行状态中
- 对于任意一个类, 都能够知道这个类的所有属性和方法;
- 对于任意一个对象, 都能够调用它的任意一个方法和属性;
- 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.
主要作用有三
- 运行时取得类的方法和字段的相关信息。
- 创建某个类的新实例(.newInstance())
- 取得字段引用直接获取和设置对象字段,无论访问修饰符是什么。
用处如下
- 观察或操作应用程序的运行时行为。
- 调试或测试程序,因为可以直接访问方法、构造函数和成员字段。
- 通过名字调用不知道的方法并使用该信息来创建对象和调用方法。
4、类加载过程
加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载
5、JVM 组成
6、实现单例模式
饿汉、懒汉、登记模式,一般使用 懒汉式
7、List、Map和 Set 的遍历方式
8、Java 装箱和拆箱