作者:Moved__小哲ヽ
链接:https://www.nowcoder.com/discuss/32723?type=0&order=0&pos=21&page=1
来源:牛客网
上午交叉面,下午已回绝。四面挂,心痛。分享面经,为后面校招攒人品。
一面:(8月1号上午:电话面试:80分32秒)
1.自我介绍?
2.做过哪些项目?项目中遇到哪些难点,你是怎样解决的?单点登录系统说一下?分布式缓存的使用场景?(说好的基础呢,上来就是项目,毫无准备,导致好多东西都记不起来了。面试官还说“那你说一个你记得的项目”,手动无奈。。。)
3.你实习的时候JDK用的是那个版本,这个版本有什么新的特性?
4.G1回收器和其他回收器有什么区别?
5.垃圾回收为什么会停顿?哪些对象可能作为GCRoots?
http://www.importnew.com/15311.html 虚拟机栈(栈帧中的本地变量表)中引用的对象,方法区中静态属性引用的对象,方法区中常量引用的对象,本地方法栈中JNI(即一般说的Native方法)引用的对象。
6.垃圾回收分代收集算法?为什么会有两个Survivor区?new一个对象会保存在哪里?
基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。https://my.oschina.net/shootercn/blog/15393
7.Java内存模型?volatile关键字,使用场景?原子性的理解?先行发生原则?
内存模型描述的是程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节。对象最终存储在内存中,但编译器、运行库、处理器或缓存可以有特权定时地在变量的指定内存位置存入或取出变量值。http://www.cnblogs.com/dolphin0520/p/3920373.html
8.场景题:现在有三个线程,同时start,用什么方法可以保证线程执行的顺序,线程一执行完线程二执行,线程二执行完线程三执行?
9.你是怎么理解线程安全的?HashMap是线程安全的么?如果多个线程同时修改HashMap时会发生什么情况?
某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。
不安全
remove与put都是一样的,由于大家拿到的不是最新链头,只要大家在Entry数组的index相同时(经过hash后的index),就有可能出现后一个覆盖前一个的操作,即前一个的操作无效。
可能产生的现象会是:
1)put进行的data有可能丢失了
2)一些通过remove(Object key)删除掉的元素(返回删除成功)又出来了。
3)多线程检测到HashMap容量超过负载因子时会进行多次的resize,由于要rehash,所以消耗的性能也是巨大的。
10.ConcurrentHashMap底层原理?每个版本的实现上有什么区别?
11.静态代理和动态代理的区别?动态代理是怎么实现的?
静态代理由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。
具体步骤是:
a. 实现InvocationHandler接口创建自己的调用处理器
b. 给Proxy类提供ClassLoader和代理接口类型数组创建动态代理类
c. 以调用处理器类型为参数,利用反射机制得到动态代理类的构造函数
d. 以调用处理器对象为参数,利用动态代理类的构造函数创建动态代理类对象
12.深拷贝和浅拷贝的区别?
浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。
深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。这个方式称为深拷贝
也就是说浅拷贝只复制一个对象,传递引用,不能复制实例。而深拷贝对对象内部的引用均复制,它是创建一个新的实例,并且复制实例。
对于浅拷贝当对象的成员变量是基本数据类型时,两个对象的成员变量已有存储空间,赋值运算传递值,所以浅拷贝能够复制实例。但是当对象的成员变量是引用数据类型时,就不能实现对象的复制了。
13.你做过hadoop的项目,为什么要用hadoop?你们处理的文件是什么格式的?写了几个mapper几个reducer?
14.zookeeper你们用了几台,用来干什么的?一般情况下都是奇数台,那么如果一台挂了,偶数台如何实现master选举?zookeeper的两种启动模式?
15.TCP首部?TCP为什么是可靠的?三次握手四次挥手?
http://www.xjweb88.com/thread-99-1-1.html
16.Solr是如何建立索引的? Lucene的底层原理?
17.你平时喜欢做什么?看过哪些书?最近在看什么书?(这里有个段子,我:最近在看《HTTP权威指南》。面试官:什么?HTTP潜规则?我:???)
二面: (8月2号晚上:视频面试:47分钟)
1.你那边怎么有点黑啊?(我靠,我也想说啊,暑假寝室集中供电,然而我们寝室没有电。发面经也不忘吐槽学校,简直坑啊。。。抱着台灯瑟瑟发抖。。。)
2.现在在哪里实习?实习主要做些什么?
3.说一下Java里面你最感兴趣的一个部分?
4.熟悉Java的哪些框架?用了Spring的哪些东西?Spring现在最新的版本是多少?
5.讲一下MVC设计模式,有什么框架用到了这个模式?
6.场景题:一个Controller调用两个Service,这两Service又都分别调用两个Dao,问其中用到了几个数据库连接池的连接?
7.安全方面:如何防止 SQL注入?如何防止用户删除其他用户的信息?表单提交可以跨域么?自己写的接口如何防止被其他人恶意调用?
- 严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害。
- 检查输入的数据是否具有所期望的数据格式,严格限制变量的类型,例如使用regexp包进行一些匹配处理,或者使用strconv包对字符串转化成其他基本类型的数据进行判断。
- 对进入数据库的特殊字符('"\尖括号&*;等)进行转义处理,或编码转换。Go 的
text/template
包里面的HTMLEscapeString
函数可以对字符串进行转义处理。 - 所有的查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中,即不要直接拼接SQL语句。例如使用
database/sql
里面的查询函数Prepare
和Query
,或者Exec(query string, args ...interface{})
。 - 在应用发布之前建议使用专业的SQL注入检测工具进行检测,以及时修补被发现的SQL注入漏洞。网上有很多这方面的开源工具,例如sqlmap、SQLninja等。
- 避免网站打印出SQL错误信息,比如类型错误、字段不匹配等,把代码里的SQL语句暴露出来,以防止攻击者利用这些错误信息进行SQL注入。
8.zookeeper偶数选举问题?(感觉很重视zookeeper啊)
9.hadoop为什么要将文件分块并且复制三份,复制两份不行么?这样不浪费空间么?namenode脑裂问题?zookeeper如何管理全局配置文件?你们的Hadoop 项目用到了几台机器,每个机器的作用?
10.Servlet是线程安全的么?
Servlet不是线程安全的。
当Tomcat接收到Client的HTTP请求时,Tomcat从线程池中取出一个线程,之后找到该请求对应的Servlet对象并进行初始化,之后调用service()方法。要注意的是每一个Servlet对象再Tomcat容器中只有一个实例对象,即是单例模式。如果多个HTTP请求请求的是同一个Servlet,那么着两个HTTP请求对应的线程将并发调用Servlet的service()方法。
11.创建一个对象的详细过程?其中发生了些什么?
12.Java NIO你了解么?讲一讲你最熟悉的部分?
- 事件驱动模型
- 避免多线程
- 单线程处理多任务
- 非阻塞I/O,I/O读写不再阻塞,而是返回0
- 基于block的传输,通常比基于流的传输更高效
- 更高级的IO函数,zero-copy
- IO多路复用大大提高了Java网络应用的可伸缩性和实用性
13.你在生活中有没有遇到什么神奇的事情,可以分享一下么?比如洒水车为什么老是在阴天或者快下雨的时候洒水?还有我和我老婆经常吵,阳台的花是早上浇好呢,还是晚上浇好呢?(我靠,这是什么套路)
14.你认为你身边的同学怎么样?如果你正在打游戏,你想让同学帮忙带瓶水,你觉得有多少人会帮你带?(这又是什么套路?让我去送水?)
15.你还有什么想问的?
三面:(HR面,8月4号下午:视频面试:22分钟)
1.7岁一个阶段,说一说每一个阶段对你影响最大的一个人或事?
2.说一下你大学阶段做了些什么?
3.你感觉你前两个面试官怎么样?
4.春招的时候为什么没有去bat实习?
5.你当初准备暑期实习的话,是想学到些什么?现在感觉自己有哪些进步?
6.你还有什么想问的?(当然是万能的培养计划和晋升机制)
四面:(交叉面,8月16号上午:电话面试:30分钟)
1.自我介绍?
2.说一下最能代表你技术水平的项目吧?
3.maven如何进行依赖管理,如何解决依赖冲突?
Maven采用“最近获胜策略(nearest wins strategy)”的方式处理依赖冲突,即如果一个项目最终依赖于相同artifact的多个版本,在依赖树中离项目最近的那个版本将被使用。
4.maven的源和插件了解哪些?maven的生命周期?
5.如何保证分布式缓存的一致性?分布式session实现?
6.spring的bean的创建时机?依赖注入的时机?
7.你们的图片时怎么存储的,对应在数据库中时如何保存图片的信息的?
8.单点登录系统的实现?
9.项目中用到的JDK的哪些特性?
10.java8流式迭代的好处?
11.多线程如何在多个CPU上分布?线程调度算法有哪些?
12.线程调度和进程调度的区别?
13.项目中用到了哪些集合类?
14.说一下TreeMap的实现原理?红黑树的性质?红黑树遍历方式有哪些?如果key冲突如何解决?setColor()方法在什么时候用?什么时候会进行旋转和颜色转换?
15.你有什么想问的?