昨天TX面试Java方向,自己感觉悲剧了。。。好多问题没有回答出来。不过也难怪,自己对Java了解的太不深入了,这次正好给自己上了一课。下面的是一些我不知道的问题,不能在同一个地方摔倒第二次了!
1.JVM如何加载一个class?
面试官一问到我这个问题我就傻了,学习Java前后才不长时间,哪接触过这么深入的问题!
Java中类的加载是通过ClassLoader实现的,它的目的是动态加载Java类和Resource。Class文件由编辑器生成,可以被任何一种JVM加载。
JVM使用类加载器加载类文件,并创建Class 对象,类加载器都是ClassLoader的子类实例。ClassLoader子类需要重载loadClass方法以实现用户自己的类加载方式。ClassLoader 其实就是读取文件,按照CLASSPATH配置的顺序。然后解析后转化为类。
loadClass方法中使用findLoadedClass方法检查类是否已经被加载,如果返回为null,则表示还没有被加载,于是在其Parent类加载器重寻找_parent.loadClass;如果仍然返回null,则要在系统中查找,findSystemClass;如果仍然没有,则抛出异常。也就是逐级检查是否加载。
2.ArrayList与LinkedList的区别?
这个问题让我囧了很久。。。就是最简单的数组与链表的区别嘛!当时我没有反应过来,加上自己没有多少底气,就没说出来!唉,告诫自己要多加学习啊!
Java中ArrayList和LinkedList都是继承自List类的,前者是数组,后者是链表。
ArrayList是动态的增长数组,适合总长度未知情况下使用;LinkedList优点在于可以方便插入删除操作,且提供额外的get,remove,insert方法在LinkedList的首部或尾部。
3.快速排序和堆排序的区别?
这个我能说出各自的排序过程,但是不知道总结二者有什么区别。。。。
只能说快排每次是最高效地选择范围,而堆排序是每次肯定不是在正确的范围选择,因为每次都得进行堆调整。
还有一些问题下次再列出来。
加油!