本文主要是介绍面试(1-3年)求职者总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
毕业至今已有4年的时间,近两年期间陆续面试了不少的求职的前(JAVA)、后(WEB)端开发人员,包括实习生、应届毕业生、一两年工作经验的、也有三四年工作经验的,也算见过了比较多的开发人员,想在这里做个总结,本次主要讲一讲面试和后端(java)相关的东西;
关于面试准备
先推荐一个写的不错的博客,专门关于面试的,比较详尽仔细:关于面试。我在这里简单总结几点:
1、简历要用心准备好,个人信息,特别是联系方式一定要清晰明确,自身掌握的技能要完成清晰,项目经历最好按照时间顺序,说明本人在项目中的职责,完成的工作,有什么样的提升或收获;
2、一般面试流程是电面=》HR现场面=》技术面=》结果,并不是每一个面试结果就能立马有结果,所以当面试官说回去等消息的时候,并不代表没有机会,有时候需要讨论筛选才能最终确定人选。
3、关于自我介绍,最好简明扼要,能体现自身的特点,表达流畅、自信,提前最好准备;
4、准备好扎实的基础知识,以及对经历过的项目要有足够的认识,每一个项目都是一次学习、提升的机会,一般JAVA集合类是考察的重点;
5、一般好一点的面试官会顺着知识点逐渐深入或者逐渐扩展,所以对于知识点的掌握最好全面深入,不要走马观花式的学习;
6、当遇到一些设计类的问题时,一般面试官考察的是你的思路,对问题的应变能力,对于事物观察的点;
JAVA基础(答案仅供参考,如有不对之处请批评指正)
1、HashMap源码,实现原理,JDK8以后对HashMap做了怎样的优化。
答:HashMap是基于哈希表的Map接口的非同步实现,提供所有可选的映射操作,并允许使用null值和null键,不保证映射的顺序;HashMap是一个“链表散列”的数据结构,即数组和链表的结合体;它的底层就是一个数组结构,数组中的每一项又是一个链表,每当新建一个HashMap时,就会初始化一个数组;
可参考博客:彻底搞懂JAVA集合HashMap,HashTable,ConcurrentHashMap之关联
而在JDK8中引入了红黑树的部分,当存入到数组中的链表长度大于(默认)8时,即转为红黑树;利用红黑树快速增删改查的特点提高HashMap的性能,其中会用到红黑树的插入、删除、查找等算法。本文不再对红黑树展开讨论,想了解更多红黑树数据结构的工作原理可以参考http://blog.csdn.net/v_july_v/article/details/6105630。
2、HashMap的扩容是怎样扩容的,为什么都是2的N次幂的大小。
答:可以参考上文 JAVA8系列之重新认识HashMap 有详细的讲解
3、HashMap,HashTable,ConcurrentHashMap的区别
答:
a、HashMap是非线程安全的,HashTable是线程安全的。
b、HashMap的键和值都允许有null值存在,而HashTable则不行。
c、因为线程安全的问题,HashMap效率比HashTable的要高。
HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。
Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似,不同的是它承自Dictionary类,并且是线程安全的,任一时间只有一个线程能写Hashtable,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。
4、极高并发下HashTable和ConcurrentHashMap哪个性能更好,为什么,如何实现的。
答:当然是ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁,而HashTable则使用的是方法级别的锁;因此在新版本中一般不建议使用HashTable,不需要线程安全的场合可以使用HashMap,而需要线程安全的场合可以使用ConcurrentHashMap;
5、HashMap在高并发下如果没有处理线程安全会有怎样的隐患,具体表现是什么。
答:可能造成死循环,具体表现链表的循环指向;
6、JAVA中四种修饰符的限制范围。
private:修饰的成员只能在同类中别访问,而在同包、子类和其他包中都不能被访问
public:修饰的成员在同类、同包、子类(继承自本类)、其他包都可以访问
protected:修饰的成员在同类、同包、子类中可以访问,其他包中不能被访问
default:修饰的成员在同类、同包中可以访问,但其他包中不管是不是子类都不能被访问
7、Object中的方法
构造函数
hashCode():用户获取对象的hash值,用于检索
queals():用于确认两个对象是否相等;补充,哈希值相同的对象不一定equals(),但equals()的两个对象,hash值一定相等
toString():返回一个String对象,用来标识自己
getClass():返回一个class对象,打印的格式一般为 class package.name.xxx,经常用于java的反射机制
clone():用来另存一个当前存在的对象
finalize():垃圾回收的时候回用到,匿名对象回收之前会调用到
wait():用于让当前线程失去操作权限,当前线程进入等待序列
wait(long)、wait(long,int):用户设定下一次获取锁的距离当前释放锁的间隔时间
notify():用于随机通知一个持有对象锁的线程获取操作的权限
notifyAll():用于通知所有持有对象锁的线程获取操作权限
8、接口和抽象类的区别
答:一个类可以实现多个接口,但只能继承一个抽象类;抽象类可以包含具体的方法,接口所有的方法都是抽象的(JDK8开始新增功能接口中有default方法);抽象类可以声明和使用字段,接口则不能,但可以创建静态的final常量;抽象类的方法可以是protected、public、private或者默认的package,接口的方法都是public;抽象类可以定义构造函数,接口不能;接口被声明为public,省略后,包外的类不能访问接口;
9、动态代理的两种方式,以及区别
答:jdk动态代理和cglib动态代理;
JDK动态代理只能对实现了接口的类生成代理,而不能针对类;cglib是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,因为是继承,所以该类或方法最好不要声明称final,final可以阻止继承和多态;
10、java序列化的方式
答:实现Serializable接口、实现Externalizable接口(一般只希望序列化一部分数据,其他数据都使用transient修饰的话有点麻烦,这时候可以使用externalizable接口,指定序列化的属性)
11、传值和传引用的区别,java是怎么样的,有没有传值传引用
答:首先,java中是没有指针的,只存在值传递;而我们经常看到对于对象的传递似乎有点像引用传递,可以改变对象中的某个属性的值,请不要被这个假象蒙蔽了双眼,实际上这个传入函数的值是对象引用的拷贝,即传递的是引用的地址值,所以还是按值传递;
传值调用时,改变的是形参的值,并没有改变实参的值,实参的值可以传递给形参,但是这个传递是单向的,形参不能传递会实参;
传引用调用时,如果参数是对象,无论是对象做了何种操作,都不会改变实参对象的引用,但是如果改变了对象的内容,就会改变实参对象的内容;
12、@transactional注解在什么情况下会失效,为什么。
答:一个目标对象的方法调用改目标对象的另外一个方法时,即使被调用的方法已使用了@Transactional注解标记,事务也不会有效执行;Spring的官方说明在代理下(默认或者配置为proxy-targer-class=“true”),只有当前代理类的外部方法调用注解方法时代理才会被拦截。
这篇关于面试(1-3年)求职者总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!