本帖最后由 逆风TO 于 2018-5-8 14:22 编辑
公司名称:西安中烟新商盟有限公司
公司地址:陕西省西安市高新区软件新城天谷八路528号国家电子商务示范基地西区501室
公司规模:100-499人
主要业务:正在研发自己的产品中烟新商盟官网
公司环境:如下图所示
面试之前:
调整好自己的底气状态,熟悉自己的简历。
首先人事面:
Q:同理,基本都是一位漂亮的小姐姐迎面走来,你好! A:你好! Q:你之前了解我们公司吗? A:嗯,了解(解读,能说不了解吗,一定要说了解啊,不然你干嘛来公司面试啊),我之前在网站看了贵公司的产品,主要是在做中烟新商盟商城,我之前做的也是一款公司自主研发的广告推广产品,里面的大部分技术和贵公司需求中使用到的技数大都差不多,所以,来贵公司上班可以很快的上手项目。 Q:你之前和团队是怎么沟通的? A:一般因为我们每个周都有部门例会,如果是项目中的问题,我们有问题服务器,开发人员需要每天去服务器看自己负责模块的问题,及时的去解决 Q:你觉得给之前的公司创造了多大的利润? A:哈哈..这个我没办法去估量,我只能给你描述我之前负责的模块全部做完了,至于创造了多少利润,我不知道 Q:你打算在西安待多久? A:我家也在西安这边,所以我肯定是要这边落地生根的。 Q:好了,我觉得你还行,稍等一下我联系一下我们的技术,让他给你面试
A:嗯,好的,谢谢!
笔试题:
1.修饰接口interface的关键字
都有public,static,final
2.ssh搭建的应用框架,各层的注入顺序(主要熟悉持久层)
Controll层注入service层接口对象,service层注入dao层接口对象,dao层注入sessionFactory对象链接数据库。
3.常用的一些java类,接口,包(各五个)
类:Math,String,Object,Date,File
接口:Comparble,Collection,Seriazable,Map,List
包:java.long.*,io,util,sql,math
4.开启多线程的常用方法
集成thread类,或者实现runnable接口
5.冒泡排序
for(int i =0;i < score.length - 1;i++){
for(int j = 0;j < score.length - 1-i;j++){
if(score[j] < score[j+1])
{
int temp = score[j];
score[j] = score[j+1];
score[j+1] = temp;
}
}
}
6.JVM加载类的机制
大概有五个步骤吧,加载,验证,准备,解析,初始化
面试题:只见一位大神缓缓走来......(不过放轻松,不用太屌,嘿嘿)
Q:你好
A:你好
Q:咱们先聊聊java基础怎么样?
A:嗯,好的,你说了算。
Q:你给我说说常用的集合?
A:一般常用的集合都有Set集合,List集合,Map集合,set和list集合都是属于单列集合,他俩的区别就是list必须保持元素特定的存储顺序,元素也可重复,而set集合是不能有重复元素存在的,一般应用场景就是为了去重。map是属于双列集合的,是以一组键值对存在的对象。
Q:能简单说说equals和hashCode有什么区别?
A:equals我们一般是来判断两个对象是否相等,一般来说比如在根据equals()方法比较两个对象是相等的,那么调用这两个对象中的hashCode方法都肯定会产生同样的整数结果。与之相反,如果比较后是不相等的,那么调用这两个对象的hashCode方法,就不一定会产生相同的整数结果了。
Q:还不错,那你对线程了解吗,能说说吗?
A:线程的话一般有四种实现方式Thread, Runnable, 线程池,Callable。
Q:那你说说他们具体怎么实现的?
A:首先一个类集成thread类,或者实现runnable接口,并且都要重写其run方法。如果配置线程池的话,一般都是为了减少线程创建和销毁的次数,保证现成的重复利用以及同时执行多个任务的话,才会考虑。当然在使用时,可以根据系统的承受能力去调整线程的数量及大小。
Q:谈谈重定向和转发的区别?
A:转发是一次request,地址栏不会改变。而重定向是两次request,地址栏会发生改变的。
Q:那么你知道怎么防止表单的重复提交?
A:就拿我上家的公司产品来说,我们使用的是令牌机制,是通过session实现的,就是存一个uuid到session中,再在表单里设置一个隐藏input,把这个uuid也存进去,提交表单后,在后台做判断,看看session中的值和这个隐藏表单中的input值是否一样,一样就是第一次提交,可以让通过。
Q:你知道过滤器和拦截器有什么区别?
A:(1)拦截器intercepter不依赖与servlet容器,而过滤器是依赖servlet容器的。(2)拦截器只是针对action的请求起作用,而过滤器则可以对几乎所有的请求起作用。(3)在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。(4)还有一个很重要的点,就是拦截器可以获取IOC容器中的各个bean,而过滤器就不行,比如在拦截器里注入一个service,可以调用业务逻辑。
Q:说说struts2的执行流程(从接收请求到响应)?
A:首先用户发送一个请求,这个请求会经过一个struts的核心过滤器StrutsPrepareAndExecuteFilter,在web,xml中配置的。过滤器在进行处理请求时,会根据Filter的配置找到FilterDispatcher,并且获取到FilterDispatcher的实例对象。FilterDispatcher对象会将该用户请求发送给ActionMapper,如果需要struts2进行处理的话ActionMapper就会通知FileterDispatcher,需要处理这个请求了,这个时候FileterDispatcher就会停止过滤器链后面的部分,然后建立一个ActionProxy实例。这个ActionProxy实例就会通过ConfigurationManager询问框架的配置文件找到需要调用的Action类,于此同时创建一个ActionInvocation实例,在由ActionInvocation实例调用Action的execute方法。最后,Action执行完毕后ActionInvocation根据struts.xml配置找到对应的返回结果。
Q:你能再说说springmvc与structs2相比较的优点吗?
A:首先呢spring mvc 本身在性能上会稍微比struts2快。其次spring MVC和Spring是在整合上几乎是实现了无缝衔接。从这个也就说明项目的管理和安全上也比Struts2高。还有就是spring mvc用的是独立的AOP方式实现,而struts2有自己的interceptor机制,这样导致了struts2的配置文件量又比spring mvc大。
Q:说说sql存储过程及它有哪些好处?
A:sql存储过程一般是在一些高效率或者规范性要求比较高的项目或者算法要求比较高时,才会采用存储过程。(1)存储过程能够实现较快的执行速度,如果某一操作包含大量的Transaction-SQL 代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的执行计划。而批处理的Transaction- SQL 语句在每次运行时都要进行编译和优化,因此速度相对要慢一些。(2)存储过程还能够减少网络流量,对于同一个针对数据数据库对象的操作(如查询、修改),如果这一操作所涉及到的 Transaction-SQL 语句被组织成一存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,否则将是多条SQL 语句,从而大大增加了网络流量,降低网络负载。(3)存储过程可被作为一种安全机制来充分利用,系统管理员通过对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的限制,避免非授权用户对数据的访问,保证数据的安全。
Q:谈谈你上个项目中商城秒杀这块都遇到了哪些问题?
A:当时我们在做的时候,遇到了一些问题,当时为了减库存操作,需要考虑到两个问题:首先若是用户成功秒杀商品,我们记录了其购买明细,却没有减库存。会导致商品的超卖。还有就是减了库存却没有记录用户的购买明细,导致商品的少卖。对于上边两个问题,最后想到用MySQL内置的事务机制进行处理,它可以准确的帮我们完成减库存和记录用户购买明细的过程。并且在针对高并发优化,使用了redis缓存数据库解决,使用Redis优化地址暴露接口,在dao包下新建一个cache包,然后创建一个RedisDao.java函数,在spring-dao.xml中配置redisdao构造器。
Q:你对公司还有其他的问题要问吗?
A:嗯,没什么问题,我来之前对咱公司已经了解过了,咱公司的文化、待遇、制度我都是蛮向往的。(这块根据个人不同情况,针对性回答,只要表达出对公司的向往及做好随时进公司开敲(嘿嘿),即可)
面试总结:
整体来说面试问到的都是一些比较扎实的问题,但是我们要本着一个原则,凡是知道的东西一定要比较清楚的表达出来,现在社会是个快节奏的社会,很多时候都是“酒香也怕巷子深”,所以表达能力也是比较重要的一环。
|