大学期间的学习已经结束了,现在阶段最重要的事情就是找一个专业相关的实习工作,因此在这里总结一下平时面试的时候遇到的难题和跟朋友讨论到的平时没有注意到的知识点。
1:java的基本类型和作用域
java的基本类型:
作用域:
java的作用域有4个,pageContext,ServletRequest,HttpSession,ServletContext
pageContext域:作用范围为整个jsp页面,是作用范围最小的一个作用域,生命周期是当对JSP的请求时开始,当响应结束时销毁。
ServletRequest域:作用范围是整个请求链(请求转发也存在);生命周期是在service方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束。
HTTPSession域:作用范围为一次会话。生命周期是第一次调动request.getSession时启动,服务器会检测是否存在对应的session,如果没有的话则创建session并返回,一段时间内session没有使用(30分钟),则销毁该session,如果服务器非正常关闭也会销毁session。调用session的invalidate,可以立即销毁session。
ServletContext域:作用范围为整个web应用。当服务器关闭或web项目被移除时,才会销毁ServletContext对象
2.数据结构
数据结构分为逻辑结构和物理结构,其中逻辑结构分为(集合,线性结构,树形结构,图形结构);物理结构分为(顺序存储结构,链式存储结构)。线性结构中有(栈,队列,串,多维数组):栈的特点(后入先出),队列的特点(先入先出)。树形结构里有一种特殊的结构叫做二叉树,特点是每个结点最多只能有两棵子树,又存在特殊的二叉树结构叫做完全二叉树和满二叉树。图形结构分为(有向图,无向图),他们都有两种存储结构,邻接表和邻接矩阵。
3.算法
几种简单的排序算法:
选择排序、插入排序、冒泡排序、堆排序、归并排序、基数排序、快速排序、计数排序、桶排序、希尔排序。
几种简单的查找算法:
顺序查找,折半查找,分块查找。平均查找长度:折半<分块<顺序。存储结构:顺序查找和分块查找对向量和线性链表结构都适用,折半查找仅对向量存储结构适用。
4.数据库的基本查找语句
1.在一个无序表中查找第31-40条记录:
select * from table limit 30,10
2.在一个无序表(name,age)中查找name重复3次以上的数据:
select * from test group by name having count(name)>3
3.在一个无序表中查找前6条记录
select * from test limit 6
4.举个例子来使用左连接的sql语句
select * from A left join B on A.aId = B.bId
5.& 与&&的区别
&与&&都称为逻辑与,&&称为短路与,虽然双方都是需要判断两边的公式都为true才能返回true,但&&还具有短路的功能,在使用中,先判断&&运算符左边的表达式,当表达式返回值为true时,再判断右边的表达式,当返回值为false时,右边的表达式则不会再判断。例如,对于if(str!=null&&!str.equals(“”)),当str为null时,不会对&&右边的表达式进行运算,否则会出现空指针异常。
6.简单举例你所知道的几种设计模式
1.工厂模式:提供一个通用的接口来创建对象,还可细分为简单工厂,工厂,抽象工厂。
2.单例模式:无论程序如何运行,采用单例模式设计的类,永远只有一个实例化对象产生。
3.观察者模式:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
7.SSM框架和SSH框架的区别
1.SpringMVC和Struts:SpringMVC的控制交互是方法级别,入口是servlet,Struts的控制交互是action级别,入口是filter
2.MyBatis和Hibernate:两者相同的地方为,可以通过SessionFactoryBuilder由xml文件创建SessionFactory,都支持JDBC和JTA事务处理。不同的地方为:
MyBatis更容易掌握,优化减少查询字段,可以进行更细致的sql查询,但是需要维护sql和结果映射,不同的数据库需要去写不同的sql语句,所以优化方便
Hibernate则门槛较高,不过DAO层开发简单,对对象的维护和缓存好,对增删查改的对象维护方便,不过因为自动生成sql语句,而且屏蔽了数据库差异,所以优化困难,应对数据库变化能力较弱。
8.简单的描述一下集合
集合有一个常用的接口(connection),许多集合都会去实现这个接口,然后常用的集合有List,Set,Map,它们三个也都是接口,其中List和Set接口继承了connection接口,而Map却并不继承connection接口,原因List和Set集合存放的都是单个对象,而Map集合存放的是键值对,也就是成对的两个对象,而connection并不具备这种特点。
List:(有序可重复)
实现了List接口的集合有ArrayList,LinkedList,Vector。其中ArrayList和LinkedList是非线程安全的,而Vector是线程安全的,所以一般来说Vector在效率上会比ArrayList低的多,因此Vector在使用上并不常见。
Set:(无序不可重复)
因其不可重复性,所以在set集合中不存在两个相同的元素(即对象),set中判断对象是否相同的方法是:hashCode()和equlas()。首先,hashCode()方法返回一个哈希值,这个哈希值是由对象在内存中的地址所形成的,如果两个对象的哈希值不一样,那么这两个对象肯定是不相同的。如果两个哈希值一样,那么还不能肯定这两个对象是否一样,还需要通过equlas()来比较两个对象,如果返回值为true,则说明两个对象是相同的。因此,当你在set中存储自定义的类对象时,最好先重写一下hashCode()和equlas()方法来保证set集合的“无序不可重复”的特点。
实现了Set接口的集合有HashSet,TreeSet和LinkedHashSet。这两者都是非线程安全的。
Map:(键值对存储)
Map集合存储的元素是成对存储的,存放的键值是唯一的,但值可以重复。键一定是唯一,值不一定唯一。Map的键是一个Set集合,这样才保证了键的唯一性。
实现了Map接口的集合有HashMap,TreeMap,HashTable和LinkedHashMap。HashMap和TreeMap都是非线程安全的,HashTable是线程安全的。HashTable的基本用法和HashMap相同,因为HashTable是线程安全的,所以性能上略差与HashMap。
9.简单的描述一下Spring框架
Spring中最核心的知识点是IOC(控制反转)和AOP(切面),二者的最终目的都是为了减少代码的耦合度,简称解耦。
控制反转(IOC)的含义是创建一个IOC容器,由容器来控制程序之间的关系,而非以前的由程序代码直接控制。理解:传统模式中是类与类之间直接调用,耦合性较强,后期维护时牵扯较多。而IOC中是由配置文件(XML)来描述类与类之间的关系,由容器来管理,降低了类与类之间的耦合度,程序的修改可以通过简单的修改配置文件来达到目的。IOC还有一个名字:依赖注入(DI),所谓依赖注入,即组件之间的依赖关系由容器来控制,形象的说,即由容器动态的将某种依赖关系注入到组件之中。(用好莱坞原则描述为“被找我们,我们来找你”,也像实习生找实习公司的过程中,实习生(请求者)发送 简历(请求)到实习公司(容器),然后由实习公司经过某些抉择后反馈(注入)消息(某种依赖关系))。
切面(AOP)的含义是将代码中那些影响了多个类,且与具体业务无关的公共行为封装成一个独立的模块(切面),又能将这些模块(切面)复原,不露痕迹的融入核心业务逻辑中,是OOP思想的补充和完善。
10.集合的一些遍历方式
Map 的遍历方式:1.通过获取所有的key,然后通过key来遍历。
2.通过Map.entrySet使用iterator遍历key和value。
3.通过Map.entrySet来遍历key和value(推荐)
4.通过Map.value()来遍历value,但不能遍历key。
11.接口和抽象类的区别
接口和抽象类的区别,抽象类就像是一个人的属性,而接口就像是一个人的行为,一个人的属性是不可改变的,而一个人的行为是可以通过不同的想法做出不同的动作。接口是对动作的抽象,而抽象类是对根源的抽象。一个类(人)只能继承一个类(属性),却能实现很多的接口(动作)。
12.Session和Cookie的区别
session的机制是在服务器端保存数据,而cookie的机制是在客户端保存数据。cookie不是很安全,因为他人可以读取电脑上的cookie文件来进行cookie欺骗,所以重要的信息最好保存在session中。session会一定时间内保存在服务器中,所以当访问量过大时,考虑到减轻服务器的压力,应使用cookie。单个cookie的内存不能超过4k,所以个人建议,账号密码等重要资料保存在session中,其他信息保存在cookie中。
13.SpringMVC的执行流程
1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器,并将其一并返回给DispatcherServlet。
4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、执行处理器(Controller)。
6、Controller执行完成返回ModelAndView
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、ViewReslover解析后返回具体View
10、DispatcherServlet对View进行渲染视图
11、DispatcherServlet对用户进行响应
用户---前端控制器---处理器映射器---具体处理器、处理对象---处理器适配器---处理器返回model---处理器适配器--- 前端控制器传输model---视图解析器---返回具体view---前端控制器渲染---响应用户
14.对OOP的理解(封装,继承,多态),聊聊多态
封装继承多态:封装也就是将一个客观对象封装成抽象类以供调用,继承则是一个类继承另一个类,继承类称为子类,被继承类称为父类,子类可以重写父类的方法进行扩展。多态的意思则是一个类的操作作用于不同的对象,会产生不同的结果。继承是子类使用父类的方法,而多态则是父类使用子类的方法。
15.maven的用处以及好处
maven是一个项目管理工具,maven主要的工作只有两件事:1.统一开发规范与工具。2.统一管理jar包。通过pom.xml来下载和管理项目所依赖的jar包。现如今的maven是一个强大的项目管理和项目构建工具。