嘟嘟是个新手,嫩的像韭菜的那种
因为经济原因,Java放下了两个月
目前刚刚稳定下来,6天以前刚刚刷新的简历。。。。(自己写的两年工作经验),不到5分钟,来了个电话,上来第一件事儿就是声明他们不是培训机构,是做银行ATM机程序的,主要用SSM和SSH框架,
不然嘟嘟就真心以为是培训机构了。
但是嘟嘟这边上着班儿(没钱了,打打工吃口饭饭,这个班儿上一天休息一天还算是清闲,一个月还能给我4500块),面试的前四天,上了三天的班儿,最后一天只复习了四道题
1.单例模式,2.工厂模式,3.装饰者模式,4.装饰者模式的UML图,发现已经晚上八点多了(这个复习速度很佛系吧)。
嘟嘟想起了曾经某位武学宗师说过,无招胜有招方能见招拆招。那行,反正是第一次面试,实在不行我就全招了。
两天以前到达面试地点,是个大厂子,看着身边悠哉悠哉的上班人,心中竟然有一丝神往。妈的只恨自己复习那天太佛系
小公司不大,先前给我打电话的那个大哥说让我先做三张面试题。我真心想紧张,但是可能因为什么都没准备,就跟平时吃瓜的心情一样,紧张不起来
嘟嘟安然入座,顺便给各位看官奉上面试题(因为自己也要复习,所以答案就顺带粗浅的整理一下)
第一题:请写6个你平时常用的JDK的包
1、java.lang:Java语言包
2、java.util:Java实用包
3、java.awt:Java窗口工具包
4、javax.swing:轻量级的窗口工具包,JavaGUI程序设计包
5、java.io:Java读写包
6、java.net:网络函数包
(常不常用我布吉岛,但是它是网友整合的包)
第二题:JDK中哪些类不能继承
当时我写的是用finall修饰的类,面试官没打我就不错了。
1.java.Util.Arrays
工具类,没用过,构造函数是私有的,剩下的所有方法都是static的,你要是extends它,idea会提示你:There is no default constructor available in 'java.util.Arrays'
至于Arrays这个类为什么不用final修饰,而是用私有构造方法,嘟嘟实在是没有时间去掰扯了,以后有时间再搞吧
2.String,StirngBuilder,StringBuffer
3.基本类型包装类
个人感觉笔试的话回答这些个就够了吧
第三题:String是最基本类型吗??
不是,它是一个final类
第四题:short s1=1 s1=s1+1 对不对 short s1=1 s1+=1对不对
第一个错,因为1是int 型 等号左边是short 必然报错
第二个对 ,short s1=1 s1+=1 会转换为 s1=(short)(s1+1)
第五题:写几个线程安全的,不安全的,支持排序的类名
支持排序的。。。。。。。。。。就是在考集合吗???
Ø线程安全类:Vector、Hashtable、Stack。
Ø线程不安全的类:ArrayList、Linkedlist、HashSet、TreeSet、HashMap、TreeMap等。
Ø支持排序的类有HashSet、LinkedHashSet、TreeSet等(Set接口下的实现都支持排序)(来自百度知道)
(笔试的时候嘟嘟写的是synchronized的线程安全,非synchronized的线程不安全,面试官没打我)
嘟嘟找了一下,确实关于线程安全的集合,进行集合操作的方法都被synchronized修饰了(比如Hashtable的 查看大小,查看是否为空啥的)。
第六题Spring IOC AOP 是什么,有什么用?
IOC 叫做控制反转,意思就是把创建实例的权利交给spring管理,重要的作用有两个,一个是解耦,一个是对象的生命周期管理。
AOP 叫做面向切面编程,算是一种思想吧,能够让我们在不影响原有功能的前提下,为软件横向扩展 功能 .
网上有个哥们总结过一句话:那些广为人所运用的框架无非就两个目的
1.软件开发期(写代码,测试,上线)内,让开发人员用更少的代码完成同样的功能实现.
2.软件上线后的维护升级器,让让开发人员用更少的代码完成同样的功能实现。
AOP底层采用代理模式,作用嘛,通过声明的方式,将相同的功能写成通知,让其重复的利用,减少好多的代码量
AOP在哪里用,包括1.权限判断:在执行方法前,判段是否有足够权限 2.日志:在执行前进行日志处理 3.异常处理等等。
第七题:Spring整合myBatis过程
配置上的整合:
1.配置SqlSessionFactoryBean,为的是构建SqlSessionFactory
并且注入dataSource数据源等相关信息(SqlSessionFactoryBean 里面有啥你想注入都行)
至于能注入的东西太多了,嘟嘟也不会,可以看看DruidDataSource的父类里面有初始化的相关信息
还有就是把mapper交给Spring管理 (就是第一张图的那个mapperLocations)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
但是面试官可能当时的意思是让我回答Spring内部是怎么把MyBatis加载进来的(包括加载mapper)
如果是手动加载MyBatis的话:
1.l通过SqlSessionFactoryBuilder 的build方法,使用InputStream(从xml文件中获取)加载配置信息来创建SqlSessionFactory。l
2.通过SqlSessionFactory来创建Session
3.通过Session获取mapper
而Spring框架使用到的是SqlSessionFactoryBean 这个类
1.通过AfterPropertiesSet()方法
继续跟进buildSqlSessionFactory()方法
说实话嘟嘟翻腾了很久,最后脑门一凉
意思就是说,如果该有的配置信息你都有,我就跟你手动创建一个SqlSessionFactory是的,一样的。
总结一下吧Spring整合MyBatis只需要将SqlSessionFactoryBean的相关配置弄好,Spring会根据你的配置信息,通过afterPropertiesSet()方法,
先自己new一个SqlSessionFactoryBuilder ,再调用build方法(将配置信息传入) ,与手动差不多。也许这就是控制反转的好处吧,不需要你手动去new Spring自己帮你new 出来
接下来就是吧Mappers注入到Spring容器来管理
配置MapperScannerConfigurer
由于过程十分墨迹,嘟嘟在这里就简单的说一下这个MapperScannerConfigurer
basePackage 指定项目中的dao那个包
指定工厂名
以上两个是最主要的
执行流程:
1.Spring先扫描basePackage下所有的候选对对象 Sacnner.scan()方法扫描配置文件中basePackage下所有文件
2.findCandidateComponents(basePackage)寻找候选对象
3.判断是否符合候选人条件
这里ClassPathMapperScanner 继承ClassPathBeanDefinitionScanner 其中的方法:
覆盖了isCandidateComponent方法,如果是独立的(非内部的),并且是接口,就认定其实一个mapper接口
所有的候选组件筛选完毕,就被存入beanDefination中 (嘟嘟觉得能答道这里嘟嘟就心满意足了,关于Spring整合MyBatis的全过程嘟嘟会在以后详细整理之后再跟他家探讨)
第八题:预处理死锁
产生死锁的四个必要条件:互斥,循环等待,占有且等待,不可抢占
预防死锁:1.采用某种方式,限制并发进程对资源的请求
2.在分配资源的时候判断是否会出现死锁,只有在不会出现死锁的时候才分配资源
第九题:如何获得数据库自增主键
方法1.在插入标签中中添加useGeneratedKeys="true" keyProperty="id"
方法2.在插入标签中添加子标签(语句之前)selectKey keyProperty=“id” resultType="...."
第十题:用过的前端框架
Bootstrap ,jQuery(不会千万别多写,这是在为之后面试挖坑)
第十一题: jQuery中的 $.get() 和 $.post 区别
相同点:都是异步请求的方式来获取服务端的数据
异同点:
1、请求方式不同:$.get() 方法使用GET方法来进行异步请求的。$.post() 方法使用POST方法来进行异步请求的。
2、参数传递方式不同:get请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给Web服务器的,这种传递是对用户不可见的。
3、数据传输大小不同:get方式传输的数据大小不能超过2KB 而POST要大的多
4、安全问题: GET 方式请求的数据会被浏览器缓存起来,因此有安全问题。
load 方法怎么用
load 方法可以在一个页面动态加载另一个页面,传统页面查询页面会闪动,体验性不好,使用jQuery的load方法可以解决这个问题
load 方法可以接收三个参数:第一个是URL,这个参数是必选的,另二个参数是可选的。第二个参数是:参数,也就是查询条件,必须封装成JSON格式的参数。
而第三个参数就是回调函数
jQuery是如何操作样式的
1.操作样式类:$("选择器”).addClass("类名“)
$("选择器”).removeClass("类名“)
$("选择器”).hasClass("类名“)
$("选择器”).toggleClass("类名“)
2.操作css属性:$(".div1").css({"backgroundColor":"green","border":"1px solid red"});
至此嘟嘟这次面试的所有笔试题就都完毕了,嘟嘟答的时候非常的吃力,该蒙蒙该猜的猜该空白的空白。但是没想到,面试官看着我的笔试题,还是把他们的项目总监叫来要面我。。。。
可能是嘟嘟Spring AOP 和IOC 回答的挺多吧。
过了一阵面试官和项目总监坐到了我的对面,嘟嘟想紧张,但是就紧张不起来,对于第一次什么都没准备就找工作的我来说,这二位确实待我不薄
自我介绍都没介绍,就开始了,先是核对了一下我的简历和智联招聘的信息是否符合,发现不符合,嘟嘟就开始忽悠
什么曾经就职于什么什么公司(连特么年份都是现编的)
然后就针对我笔试题开始给我纠正错误了
我除了没写的他挑出来两个毛病:switch 筛选条件为什么不能是long类型,我回答:”太长了“ 他乐了,说也对,因为会造成精度丢失
还有就是问我有没有预防死锁的经验,我都没有项目经验我预防个屁屁,我就简单给他解释了一下死锁的原理(我自己总结的)
让后他问那如何解决死锁问题,我一想死锁就憋死了也解不开,我就回答面试官说只能预防死锁,然后他问我怎么预防。(笔试题上面那个)
进而转到了说我的项目以前就没有过处理多线程的经历吗??我假装想了好半天,然后乖乖的摇了摇头。
然后问了我:spring是如何整合MyBatis的,可惜了可惜了,老子连sqlSessionFactory是啥都特么忘了。。。。
面试官很有耐心,进而问我,你以前没自己搭建过项目吗?我说那肯定搭过啊。那你是怎么配置的?我想半天,两个月的时间好像让我换了个大脑,一点印象都没有啊
然后又问我看你AOP IOC回答的挺多的,然后。。。就没问我spring的这两个东西
写过前端吗??介绍几个前端框架可好??哈哈哈哈,前端还有框架吗.....
。。。。。。。。。(嘟嘟一直在摇头)
面试官最后终于忍不住放出了那个大招,你们以前的那个项目,周期多长时间,又少人,怎么分配的
行了行了嘟嘟招了全招了,就跟面试官开始说,那我重新介绍一下我自己好了。。。。。。。。。。嘟嘟自学java4个多月,因为生计问题荒废键盘两个半月,前两天才终于稳定下来
刚刷新完简历就是一个电话让我去面试。(当时我连哭的心都特么有了,哪知道这公司这么靠谱办事这么利索,连准备准备面试题的机会都没有)。。。。。
也不知道这个面试官儿脾气为啥这么好依然不住点头听我在那墨迹,旁边的项目总监好像很不高兴,但是也没说啥反正。
嘟嘟当时问了一句面试官:都说目前程序员行情特别不好,问一下您把,程序员是饱和了吗??
面试官摇了摇头说,也不是。那你能接受的最低薪资是多少?
我当时想了想,毕竟还年轻,钱那东西能够生活就好,我就一咬牙说:5000够活(各位看官千万别打我,我知道我自己要高了,我有罪)
面试官:那你还有什么想了解的吗?关于我们公司?
其实面试以前嘟嘟就知道这回面试基本要凉凉儿了。所以嘟嘟当时很难过的说,其实我想要的你们已经给不了我了,我想要贵公司的项目文档
因为嘟嘟听说上班前一星期需要了解项目文档,而且今天的表现我猜测二位很不满意(特么基本上什么都没有答上)所以,就算了吧。
之后又是一顿互相寒暄(欸,客道话。。。)
嘟嘟记得当时走出去的时候还挺轻松,但是这次面试给我的感觉还是挺可惜的,公司小但是不错,而且涉及到的项目我也特别感兴趣。
不过走的时候把面试题的重要的东西抄了下来写下了这个我准备第一次发出去的博客。
没啥的,想起某位曾经的故人说过,来北京谁都要度过一段特别难熬的日子。况且现在我在北京还能活。