1. Java四大域
ServletContext域(Application域): 整个WEB应用
HttpSession域(Session域):一次会话
ServletRequest域(Request域):整个请求链(请求转发也存在)
PageContext域(Page域):整个JSP页面,是四大作用域中最小的一个
2. 集合
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
3. Map遍历
(1) 通过Map.keySet遍历key和value
for (Integer in : map.keySet()) { //map.keySet()返回的是所有key的值 String str = map.get(in);//得到每个key多对用value的值 System.out.println(in + " " + str); }
(2) 通过Map.entrySet使用iterator遍历key和value
Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<Integer, String> entry = it.next(); System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); }
(3) 通过Map.entrySet遍历key和value
for (Map.Entry<Integer, String> entry : map.entrySet()) { //Map.entry<Integer,String> 映射项(键-值对) 有几个方法:用上面的名字entry //entry.getKey() ;entry.getValue(); entry.setValue(); //map.entrySet() 返回此映射中包含的映射关系的 Set视图。 System.out.println("key= " + entry.getKey() + " and value= "+ entry.getValue()); }
(4) 通过Map.values()遍历所有的value,但不能遍历key
for (String v : map.values()) { System.out.println("value= " + v); }
4. 排序
内部排序
├插入排序
│├直接插入排序
│└希尔排序
├选择排序
│├简单选择排序
│└堆排序
├交换排序
│├冒泡排序
│└快速排序
├归并排序
└基数排序
外部排序(内外部结合)
链接:https://blog.csdn.net/happy_wu/article/details/51841244
5. 实现堆排序
若想升序则建立大根堆,若想降序,则建立小根堆
其中每个节点的值小于等于其左、右孩子的值,这样的堆称为小根堆;
其中每个节点的值大于等于其左、右孩子的值,这样的堆称为大根堆;
6. Arrays类中sort方法源码是用什么排序实现的
对于传入的数组长度在不同的阈值内,分别对应这个不同的排序方法,主要是有归并排序、快速排序、插入排序、计数排序。特别注意的是计数排序,主要分为两种情况:
(1)byte array 字节数组长度大于29,则计数排序优先于插排;
(2)short or char array 短整型或者字符数组长度大于3200,则计数排序优先于快速排序。
7. Session与Cookie的区别(面试官:你这边为什么用Session而不用Cookie)
(1) Cookie数据存放在客户的浏览器上,Session数据放在服务器上。
(2) Cookie不是很安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗(考虑到安全应当使用Session)。
(3) Session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能(考虑到减轻服务器性能方面,应当使用COOKIE)。
(4) 单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie。
个人建议:将登陆信息等重要信息存放为Session,其他信息如果需要保留,可以放在Cookie中。
8. 拦截器与过滤器
过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符。
拦截器,是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
区别:
(1) 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
(2) 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
(3) 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
(4) 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
(5) 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
9. 拦截器运用
(1) Serlvlet实现实现Filter接口
(2) Struts2拦截器defaultStack,自定义实现Interceptor接口
(3) SpringMVC实现HandlerInterceptor接口
10. Mybatis与Hibernate的区别
(1) Hibernate是全自动,而Mybatis是半自动
(2) Hibernate数据库移植性远大于Mybatis
(3) Hibernate拥有完整的日志系统,Mybatis则欠缺一些
(4) Mybatis相比hibernate需要关心很多细节
(5) SQl直接优化上,Mybatis要比Hibernate方便很多
Mybatis:小巧、方便、高效、简单、直接、半自动
Hibernate:强大、方便、高效、复杂、绕弯子、全自动
Mybatis:
(1) 入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
(2) 可以进行更为细致的SQL优化,可以减少查询字段。
(3) 缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
(4) 二级缓存机制不佳。
Hibernate:
(1) 功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。
(2) 有更好的二级缓存机制,可以使用第三方缓存。
(3) 缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。