![122621d1e4535bec6e15015f67fc0f90.png](https://i-blog.csdnimg.cn/blog_migrate/14fcda280b55da1e7e41f407ab6ecf35.jpeg)
对于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一起用于异常的处理。finally块一定会被执行,无论在try块中是否有发生异常。
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及 order by 涉及的列上建立索引;(2)应尽量避免在where子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描;(3)尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了;(4)任何地方都不要使用 select * from t,用具体的字段列表代替“*”,不要返回用不到的任何字段;(5)避免频繁创建和删除临时表,以减少系统表资源的消耗。
以上是本次关于中级java工程师面试题,看完上面题目的朋友可以发现这10道中级java工程师面试题既有中等难度的,也有java基础性知识,因为即使是面试中级java工程师的岗位,面试官也会对你的java基础知识和素养进行考察,所以应聘中级java工程师的伙伴们一定要记得回顾好java基础知识。希望今天这篇文章整理的中级java工程师面试题可以帮助到大家,最后顺利通过面试。