陆金所面试题
今天下午去陆金所面试java。问得是java基础与框架,但是自己没有背面试宝典,很多都回答不好。
1.hashmap 与 hashtable 的区别 以及 hashmap的实现原理
arraylist与LinkedList 的区别与原理
Comparable和Comparator接口是干什么的?列出它们的区别。
经典的java中return和finally问题!
网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的:
(1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。
(2)在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。
当然还有很多人探讨Finally语句的执行与return的关系,颇为让人迷惑,不知道finally语句是在try的return之前执行还是之后执行?我也是一头雾水,我觉得他们的说法都不正确,我觉得应该是:finally语句是在try的return语句执行之后,return返回之前执行。
最后总结:finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。
list 排序 去重 set
2.多线程:volatile 关键字与内存可见性 CAS 算法 同步容器类 ConcurrentHashMap锁分段机制
object 中 的wait sleep notify
写一个多线程的生产者与消费者的例子
3.jvm 模型 以及类加载机制 栈内存溢出 内存溢出
s0/s1 优缺点 缺点是浪费了一块存储空间 优点是方便了碎片整理 内存地址
当一个类加载器收到类加载任务,会先交给其父类加载器去完成,因此最终加载任务都会传递到顶层的启动类加载器,只有当父类加载器无法完成加载任务时,才会尝试执行加载任务。
采用双亲委派的一个好处是比如加载位于rt.jar包中的类java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个Object对象。
4.springMVC 模型原理
1. 用户发送请求到DispatcherServlet 控制器
2. DispatcherServlet 控制器根据请求路径到HandlerMapping映射器查询具体的handler处理器
3. HandlerMapping映射器根据用户请求查找与之对应的HandlerExecutionChain执行链再回传给DispatcherServlet控制器
4. DispatcherServlet控制器根据handler具体的实现方式调用HandlerAdapter适配器
5. HandlerAdapter适配器调用具体的handler处理器处理业务并返回ModelAndView到DispatcherServlet控制器
6. DispatcherServlet控制器将ModelAndView专递到ViewResolver视图解析器
7. ViewResolver视图解析器 返回具体的视图到DispatcherServlet控制器
8. DispatcherServlet控制器渲染视图后响应给用户
5.springIOC AOP 动态代理机制
l Jdk代理:基于接口的代理,一定是基于接口,会生成目标对象的接口类型的子对象。
l Cglib代理:基于类的代理,不需要基于接口,会生成目标对象类型的子对象。
6.mybatis原理 #、$ 的区别 分页 resulttype与resultmap的区别
resultType:sql语句的结果集封装类型
比如 : resultType="User"
看出来了吧,resultType和resultMap都映射到了User对象中
说说不同点吧,resultType 和restltMap
restulyType:
1.对应的是java对象中的属性,大小写不敏感,
2.如果放的是java.lang.Map,key是查询语句的列名,value是查询的值,大小写敏感
3.resultMap:指的是定义好了的id的,是定义好的resyltType的引用
注意:用resultType的时候,要保证结果集的列名与java对象的属性相同,而resultMap则不用,而且resultMap可以用typeHander转换
4.type:java 对象对应的类,id:在本文件要唯一column :数据库的列名或别名,property:对应java对象的属性,jdbcType:java.sql.Types
查询语句中,resultMap属性指向上面那个属性的标签的id
parameterType:参数类型,只能传一个参数,如果有多个参数要封装,如封装成一个类,要写包名加类名,基本数据类型则可以省略
5.一对1、一对多时,若有表的字段相同必须写别名,不然查询结果无法正常映射,出现某属性为空或者返回的结果与想象中的不同,而这往往是没有报错的。
6.若有意外中的错误,反复检查以上几点,和认真核查自己的sql语句,mapper.xml文件是否配置正确。
另外还有resultMap 元素,它是 MyBatis 中最重要最强大的元素,它能提供级联查询,缓存等功能
原sql语句:
在这里用到了#{},使用#时:
1、用来传入参数,sql在解析的时候会加上" ",当成字符串来解析 ,如这里 role_id = "roleid";
2、#{}能够很大程度上防止sql注入;
延伸:
1、用${}传入数据直接显示在生成的sql中,如上面的语句,用role_id = ${roleId,jdbcType=INTEGER},那么sql在解析的时候值为role_id = roleid,执行时会报错;
2、${}方式无法防止sql注入;
3、$一般用入传入数据库对象,比如数据库表名;
4、能用#{}时尽量用#{};
注意:
mybaties排序时使用order by 动态参数时需要注意,使用${}而不用#{};