一、项目
1.1.知道你的项目到底是做什么的,有哪些功能。
1.2.知道你做的模块在整个项目中所处的位置及作用,并能清晰的阐述模块间的调用关系。
1.3.知道你项目的整体架构和使用到的中间件,并对中间件的原理有一定的了解。
1.4.能流畅阐述的自己在项目中解决过的比较复杂的问题(重点)。
1.5.自我介绍
二、Java基础知识
2.1.栈和队列的区别
2.2.接口和抽象类的区别
首先,接口和抽象类的共同点是都不可以直接实例化,接口和抽象类的实现类只有实现了两者中的方法才能进行实例化。
接口是公开的,不能有私有的方法或变量,接口中的所有方法都没有方法体
,通过关键字interface
实现。Java1.8之后,接口中default的方法也可拥有方法体
了。
抽象类是可以有私有方法或私有变量的,通过把类或者类中的方法声明为abstract
来表示一个类是抽象类,被声明为抽象的方法不能包含方法体
。
实现接口的关键字为implements
,继承抽象类的关键字为extends
。Java中是单继承、多实现模式。
接口强调特定功能的实现,而抽象类强调所属关系。接口被用于常用的功能,便于日后维护和添加删除,而抽象类更倾向于充当公共类的角色,不适用于日后重新对立面的代码修改。功能需要累积时用抽象类,不需要累积时用接口。
2.3.int和Integer的区别,以及自动拆箱/装箱的相关问题
int是我们常说的整形数字,是基本类型,Java的原始数据类型之一。
Integer是int对应的包装类,是引用类型,它有一个int类型的字段存储数据,并且提供了基本操作,比如数学运算、int和字符串之间转换等。
在Java1. 5中,引入了自动装箱和自动拆箱功能(boxing/unboxing),Java可以根据上下文,自动进行int和Integer类型转换,极大地简化了相关编程。
在int到Integer的自动装箱操作中,会调用Integer的静态工厂方法 valueOf(int i) 方法,在调用它的时候会利用一个缓存机制,带来了明显的性能改进。Integer中有一个IntegerCache内部类,valueOf()方法先判断了变量i的值是否在这个缓存范围内,也就是[-128,127],在这个范围内直接返回创建好的对象,并不会重新创建对象。
JVM调优:IntegerCache缓存类的上下限,下限不可以配置,上限可以通过JVM参数进行配置。调高后可以避免创建更多的Integer对象节省内存。
valueOf()方法:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache内部类:
private static class IntegerCache {
//下限-128
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// 默认上限127
int h = 127;