对于对于java面试,在面试前的准备中必须收集和学习面试问题,因为在招聘公司看来,对于java工程师职位最注重专业知识和技能水平的调查,因此程序员去公司面试不管怎么样先做一套面试题。对于不同层次的程序员职位,相应的面试问题必须有不同的难度。今天的文章总结了一些中级java工程师面试问题,想申请中级作为java工程师的朋友,可以看看以下面试题,希望能起到学习和查漏补缺的作用。
1、为什么要有不同类型的引用??
答:不像C语言,我们可以控制内存的申请和释放,在java有时我们需要适当的时间来回收控制对象,因此,不同类型的引用诞生了,可以说,不同类型的引用实际上是正确的GC回收时机不可控的妥协,有以下2一个使用场景可以充分说明:
一利用软引用和弱引用解决方案OOM问题:用HashMap保存图片路径与相应图片对象相关的软引用之间的映射关系。当内存不足时,JVM会自动回收这些缓存图片对象占用的空间,从而有效避免OOM问题。
二通过软引用实现java对象的高速缓存:例如,我们创建了一个如果Person的类别每次都需要查询一个人的信息,即使是几秒钟前刚查询过的,也要重建一个例子,这将导致很多Person对象的消耗,而且由于这些对象的生命周期相对较短,会引起多次GC影响性能。此时,高速缓存可以通过软引用和Hashmap的结合来构建,提供性能。
2、final、finalize和finally有什么区别?
答:final是一个可以修改变量、方法和类别的修改符。如果final修改变量,则意味着该变量的值在初始化后不能改变。finalize方法是在对象被回收之前调用的方法,给对象最后一个复活的机会,但不能保证什么时候调用finalize。finally是一个与try和catch一起用于异常处理的关键词。无论try块是否有异常,finally块都必须执行。
3、深拷贝和浅拷贝有什么区别?
答:浅复制:复制对象的所有变量都包含与原始对象相同的值,而所有对其他对象的引用仍然指向原始对象。换句话说,浅复制只复制被考虑的对象,而不复制被引用的对象。
深度复制:被复制对象的所有变量都包含与原对象相同的值,而引用其他对象的变量将指向被复制的新对象,而不是被引用的原对象。换句话说,深度复制再次复制被复制对象引用的对象。
4、编译器的常量是什么?使用它有什么风险?
答:公共静态不可变(public static final)这里的public可以选择变量,也就是我们所说的编译期常量。事实上,这些变量在编译过程中会被替换,因为编译器知道这些变量的值,并且知道这些变量在运行过程中无法改变。这种方法的一个问题是,您使用了内部或第三方库中的公共编译频率,但该值后来被其他人改变,但您的客户端仍在使用旧值,甚至您已经部署了一个新的jar。当您更新依赖JAR文件时,确保重新编译您的程序,以避免这种情况。
5、垃圾回收算法有哪些?
答:理论上很容易理解垃圾回收,具体方法有四种:(1)标记-清除;(2)标记-复制;(3)标记-整理;(4)分代回收
6、产生死锁的条件是什么?
答:(1)相互排斥条件:一个资源一次只能使用一个过程;(2)请求和维护条件:当一个过程因要求资源而被阻塞时,应保持已获得的资源;(3)不剥夺条件:过程获得的资源在最终使用前不能被强行剥夺;(4)循环等待条件:几个过程形成头尾相连的循环等待资源关系。
7、为什么wait?、nofity和nofityall不在Thread类别中
答:一个明显的原因是java提供的锁是对象级而不是线程级,每个对象都有锁,通过线程获得。如果线程需要等待某些锁,则调用对象中的wait()方法是有意义的。如果wait()方法定义为thread类,线程等待的锁不明显。简单来说,因为wait、notify和notifyall都是锁级操作,所以在object类中定义它们是因为锁属于对象。
8、什么是多线程上下文切换?
答:多线程的上下文切换是指CPU控制权从一个正在运行的线程切换到另一个正在就绪并等待获得CPU执行权的线程。
9、为什么要把堆和栈分开?
答:(1)从软件设计的角度来看,堆栈代表处理逻辑,堆叠代表数据。这种分离使处理逻辑更加清晰;(2)堆与栈的分离,使堆中的内容可以由多个堆共享。一方面,这种共享提供了一种有效的数据交互方式(如共享内存),另一方面,堆中的共享常量和缓存可以被所有堆栈访问,节省了空间;(3)堆栈需要划分地址段,如保存系统运行的上下文。因为堆栈只能向上增长,所以它会限制存储内容的能力。不同的是,堆中的物体可以根据需要动态生长。因此,堆栈和堆栈的拆分使动态生长成为可能。相应的堆栈只需记录堆中的一个地址(4)java面向对象这一核心特征。
10、msyql有哪些优化经验?
答:(1)优化查询,尽量避免全表扫描,首先要考虑where和where order by 在所涉及的列上建立索引;(2)尽量避免在where子句中使用!=或<>操作符,否则发动机将放弃使用索引进行全表面扫描;(3)尽量使用数字字段。如果只有数字信息的字段不设计为字符类型,则会降低查询和连接的性能,增加存储成本。这是因为发动机在处理查询和连接时会逐个比较字符串中的每个字符,而数字型只需要比较一次;(4)不要在任何地方使用 select * from t,用特定的字段列表代替“*”,不要返回任何未使用的字段;(5)避免频繁创建和删除临时表,以减少系统表资源的消耗。
以上是本次关于中级java工程师面试问题,看完以上题目的朋友可以发现这个10道中级java工程师面试题既有中等难度,也有java基础知识,因为即使是中级面试,作为java工程师,面试官也会对待你java基础调查知识和素养,所以申请中级java工程师的合作伙伴必须记住回顾java的基本知识。我希望本文整理的中级java工程师面试问题能对您有所帮助,最终顺利通过面试。