记第一次校招面试
面试流程
2021.5到广州某小型公司面试,总共两面,第一轮技术面,第二轮人力资源面试。面试官还是比较容易沟通,五人面Java,单独面。技术面问的比较基础,如基本数据类型,反射原理,如何通过反射获取类对象,synchronized的两种实现方式,栈堆的区别以及特点,抽象类的具体实现(能否在抽象类中定义一个抽象方法与普通方法),相关排序算法的实现(冒泡排序)以及equals与==的区别,最后问相关项目涉及到的实现流程(拦截器)。最细节问到SpringMVC的yml配置文件如何写注释!
1、Java八大基本数据类型
基础:byte(位)、short(短整数)、int(整形)、long(长整型)、float(单精度)、double(双精度)、boolean(布尔值)、char(字符)
2、反射原理
首先,什么是放射?
在运行状态中,对于任意一个类,都能够知道这个类的属性和方法;
反射的作用?
如果给定一个类名,就可以通过反射机制来获取类的所有信息,也可以动态的创建对象和编译;
反射的原理?
Java语言在编译之后会生成一个class文件,反射就是通过字节码文件找到其类中的方法和属性等;
3、synchronized的两种实现方式
后续补充
4、栈堆的区别以及特点
栈主要是先进后出,堆主要是先进先出。
5、三次握手的流程
第一次握手: 客户端给服务器发送一个 SYN 报文。
第二次握手: 服务器收到 SYN 报文之后,会应答一个 SYN+ACK 报文。
第三次握手: 客户端收到 SYN+ACK 报文之后,会回应一个 ACK 报文。
6、个人认为是地址内存解析
面试官主要手写 两个Integer包装类变量
Integer a = 1000;
Integer b = 1000;
问两个变量相等吗?
可以先在IDEA中演示一下,答案是false,还是得回到源码,
你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。
如果值的范围在-128到127之间,它就从高速缓存返回实例。
结论就不言而喻了!
7、启用线程什么时候用start,什么时候用run?
线程不管是实现runnable接口还是调用thread来新建线程,都是用start来进行线程启动,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。当cpu分配给它时间时,才开始执行run()方法(如果有的话)。
8、冒泡排序实现原理
-
比较相邻的两个元素。如果第一个比第二个大则交换他们的位置(升序排列,降序则反过来)。
-
从列表的开始一直到结尾,依次对每一对相邻元素都进行比较。这样,值最大的元素就通过交换“冒泡”到了列表的结尾,完成第一轮“冒泡”。
-
重复上一步,继续从列表开头依次对相邻元素进行比较。已经“冒泡”出来的元素不用比较(一直比较到结尾也可以,已经“冒泡”到后面的元素即使比较也不需要交换,不比较可以减少步骤)。
-
继续从列表开始进行比较,每轮比较会有一个元素“冒泡”成功。每轮需要比较的元素个数会递减,一直到只剩一个元素没有“冒泡”时(没有任何一对元素需要比较),则列表排序完成。
9、抽象类能否被实现,能否重写抽象类中的普通方法?
一、抽象方法和抽象类
抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法。
抽象方法和抽象类的规则如下:
①抽象类和抽象方法必须使用abstract修饰符来修饰。
②抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例,抽象类里不包含抽象方法
③抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。
④含有抽象方法的类(包括直接定义了一个抽象方法;或直接继承了一个抽象父类,但没有完全实现父类包含的抽象方法;或实现了一个接口,但没有完全实现接口包含的抽象方法三种情况)只能被定义成抽象类。
注意:归纳起来,抽象类可用“有得有失”4个字来描述。“得”指的是抽象类多了一个能力:抽象类可以包含抽象方法;“失”指的是抽象类失去了一个能力:抽象类不能被实例化。
所以说抽象类只能被继承,接口才是实现。
10、总结
觉得第一次面经问的较多是基础,项目问的少,公司环境不错,面试官的发亮还是有滴看
参考文章:
https://blog.youkuaiyun.com/OREO_GO/article/details/52095550