1、java面试题总结一 JAVA基础1、JAVA两个核心机制: java虚拟机:*.java 编译成 *.class文件(一次编译,随处运行,跨平台) jvm垃圾回收:自动运行,释放那些可释放的内存空间2、jdk: 软件开发包 jre:java运行环境 开发需要jdk,用户只需jre (jdk包含jre)3、环境变量: path:window系统执行命令时要搜寻的路径 classpath:java在编译和运行时要找的class所在路径4、数据类型:基本数据类型和引用数据类型(接口,类,数组)5、数据类型 类型自动转换:(容量小的自动转大的) byte、short、char-int-long-fl
2、oat-double byte、short、char之间不回相互转换,他们三者在计算时首先转换为int类型 容量大的转容量小的要加强制转换 几种类型混合运算时,系统会首先自动的把所有数据转成容量最大的类型,再进行计算 特殊情况:可直接把int类型的数据赋值给byte、short、char类型,不需要转换,只要不超出表述范围 例如:byte b1 = 1;6、switch语句只能接int类型(byte/short/char能自动转成int)7,进程:是程序一次执行过程,或者是正在执行的一个程序线程是程序内部的一条执行路径线程的实现方式:继承Thread类或者实现runnable接口yield()
3、: 释放当前线程cpu执行权join():合并,A线程停止执行,直至B线程执行完sleep(): 睡眠当前线程,不会释放锁wait(): 暂停当前线程,并释放锁notify():唤醒正在排队等待的线程中优先级最高者结束等待注意:wait(),notify(),notify()只有在synchronized中才能使用线程的生命周期:新建-(start)-就绪-运行-阻塞-死亡synchronized (同步监视器) :线程同步要求:所有线程必须共用同一把锁注:在实现的方式中,考虑同步的话,可以使用this来充当锁。但是在继承的方式中,慎用this释放锁的操作:break,return,error
4、,Exception,wait()不会释放锁的操作:sleep,yield死锁:不同的线程分别占用对方需要的同步资源不释放,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁二 Ajax局部刷新:使用xmlHttp组件XMLHttpRequest对象进行异步数据读取Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面缺点:页面局部刷新,导致后退功能失效使用XMLHttpRequest对象的三个关键部分:-onreadystatechang事件处理函数:该事件由服务器触发,在ajax执行过程中,服务
5、器会依靠更新xmlHttpRequest对象的readyState来通知客户端当前的通信状态。每次readyState属性的改变都会触发readystatechange事件-open(method,url,asynch):向服务器发送请求 Method:请求类型,类似get或者post Asynch:是否异步传送,默认true。若为true,执行后面的脚本前,不需要等待服务器的响应;若为false,一直等到ajax请求执行完毕再继续执行-send()原声代码:window.onload=function() document.getElementsByTagName(a)0.onclick =
6、 function() /1创建一个XMLHttpRequest对象 var request = new XMLHttpRequest(); /2准备发送请求的数据 var url = this.href+&time=+new Date(); var method = GET; /3调用XMLHTTPRequest对象的open方法 request.open(method,url); /4调用XMLHTTPRequest对象的send方法 request.send(null); /5为XMLHTTPRequest对象添加onreadystatechange响应函数 reques.onready
7、statechange = function() if(request.readyState = 4) if(request.status = 200|request.status = 304) 传输格式:Xml:需要使用responseXML来获取。结果不能直接使用,需先创建对应节点;缺点,dom解析可能会很复杂Html:xmlHttpRequest发送html,文本将存储在responstText属性中。HTML代码块与innerHtml属性搭配Json:轻巧;是js的原生格式Var jsonObject = “name”:”xiaoming”,”age”:”12”,”address”:“
8、city”:”beijing”,”school”:liuxiao,“teaching”:function()Alert(123);解析json:AJAX回调函数返回的Json只是一种文本字符串,它被存储在responseText属性中如:var jsonStr = “name:xiaolong”这时需要使用eval(),把字符串转成JSON对象例如Var jsonReponse = xhr.responseText;Var person = Eval(“(”+jsonResponse+”)”);Var name = person.name;还可以用JSON提供的json.js包,使用parse
9、JSON()方法将字符串解析成js对象Var jsonReponse = xhr.responseText;Var person = jsonReponse.parseJSON();Jquery中的ajax$.get(url,args,function(data),JSON)三 MyBatis打开命令行窗口,切换到生成工具的根目录下,执行如下命令:java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite重点说一下UserMapper.xml配置中需要注意的几个小细节问题:1、UserMappe
10、r.xml的标签的namespace必须是UserMapper接口的全类名,既2、UserMapper.xml的定义操作数据库的这些标签的id属性的值必须和UserMapper接口定义的方法名一致一对一:在resultMap里加上association一对多:collection原理详解:MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession。SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运
11、行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession优点:sql写在xml里,便于统一管理和优化缺点:SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库和hibernate的比较1,Hibernate的O/R Mapping实现了POJO和数据库表之间的映射;MyBATIS则在于POJO与SQL之间的映射关系。然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。2,Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL3,MyBatis容易掌握,而Hibernate门槛较高Myba
12、tis基础: #. 和 $. 的区别:# 解释为JDBC prepared statement 的一个参数标记。而将 $ 解释为字符串替换要使用LIKE语句该怎么写?拼接通配符 select*fromfoowherebarlike%|$value|%如何获取自动生成的(主)键值?insertintonames(name)values(#name)在mapper中如何传递多个参数?使用 param 注解四SpringMVCSpringMvc是什么:步骤:1,配置web.xml,添加配置 DispatcherServlet dispatcherServlet org.springframework
13、.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc.xml 1 dispatcherServlet / 2,配置spirngMVC.xml 3,ControllerControllerpublicclassHelloWorld /* * 1. 使用 RequestMapping 注解来映射请求的 URL * 2. 返回值会通过视图解析器解析为实际的物理视图, 对于 InternalResourceViewResolver 视图解析器, 会做如下的解析: * 通过 prefix + returnVal
14、+ 后缀 这样的方式得到实际的物理视图, 然会做转发操作 * /WEB-INF/views/success.jsp * return */ RequestMapping(/helloworld) publicString hello() System.out.println(hello world); returnsuccess; RequestMapping可定义方法,也可定义类method属性来指定请求方式,如:method = RequestMethod.POSTParams属性:param表示请求必须包含param的参数;!param表示请求必须不能不含param的参数如:Reques
15、tMapping(value = testParamsAndHeaders, params = username, age!=10 , headers = Accept-Language=en-US,zh;q=0.8 ) RequestMapping(value=”/delete”,params = method=midea.mfp.product.detail.list, produces = application/json; charset=utf-8)RequestParam 映射请求的参数Value 请求参数的参数名Required该参数是否必须DefaultValue 默认值如:r
16、equestMapping(value=test)Public String test(RequestParam(value=username)SpringMVC请求参数:1,RequestParam 映射请求的参数2,使用pojo作为参数3,通过servlet原生apiSpringMVC处理模型数据的方法1,modelAndView2,Map3,SessionAttributeModelAttribute 标记的方法,会在每个目标方法执行之前被SpringMvc调用视图解析器:1,InternalResourceView 2,如果使用了jstl标签,springMVC会自动把Internal
17、ResourceView转成jstlVIEWSpringMVC 返回 json加注解:ResponseBody及加上几个jar包SpringMVC和Struts2的对比原理:1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。 2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller. 3.DispatcherServlet请请求提交到目标Controller 4.Controller进行业务逻辑处理后,会返回一个ModelAndView 5.Di
18、spathcher通过iewResolver视图解析器,找到ModelAndView对象指定的视图对象 6.视图对象负责渲染返回给客户端。六Struts框架:替程序员完成一部分的代码,从而提高开发效率;使用框架必须遵循框架的规则Struts是什么:Struts2是基于MVC设计模式的Web应用程序框架处理流程:用户提交一个请求,服务器接收,并且交给struts2的核心过滤器(web.xml里配置的StrutsPrepareAndExceteFilter)来进行处理,Struts2的过滤器调用struts2的一系列处理器来进行处理(如:解析struts.xml配置文件,和用户提交的action请
19、求对比,如果找不到就返回404,如果找到就进行下一步处理。),知道调用对应的action类中的execute方法执行,执行完后再进行一系列处理到核心过滤器,由核心过滤器返回给服务器,服务器对浏览器进行相应的响应 工作原理在Struts2框架中的处理大概分为以下几个步骤1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)3 接着FilterDispatcher被调用,
20、FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类6 ActionProxy创建一个ActionInvocation的实例。7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。8 一旦Action执行完毕,Ac
21、tionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper请求-filter-调用filterDispatcher,询问ActionMapper是否调用Action-是的话就把请求交给Actionproxy-Actionproxy通过ConfigurationManager访问配置文件找到对应action类-Actionproxy创建ActionInvo
22、cation实例(在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用)-执行完毕,返回结果线程安全:在 一个进程中有多个线程并发执行,每个线程执行过程中,变量值是相同的,执行结果也是相同的Struts2是多实例的,每次请求都会重新创建新的action对象,所以线程安全Struts1和servlet是单例的Struts2和Struts1的区别1,Struts1依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。 Struts 2 不依赖于容器,通过A
23、ctionContex可以获取到request和response2,Struts1是单实例,Struts2是多实例的,所以Struts2是线程安全的Struts2和SpringMVC的区别1,SpringMVC基本实现0配置,开发效率高于Struts22,SpringMVC的入口是servlet,而Struts2是filter3,Struts2是类级别的拦截,SpringMVC是方法级别的拦截Struts2的优缺点:常用配置解决乱码Result type:Chain-链接下一个actionDispatcher-转发Rediret-重定向Action的三种实现方式1,实现action接口: 好处
24、-使代码更加规范如public class Hello1Action implements ActionPublic String execute() throws ExceptionReturn SUCCESS;2,继承ActionSupport类 好处:可以继承一些功能,如验证 (推荐使用)如public class Hello2Action extends ActionSupportPublic String execute() throws ExceptionReturn SUCCESS;3, 定义一个pojo类好处:自定义一个普通java类即可public class HelloAc
25、tion Public String execute()Return “success”;以对象的方式处理表单数据Public class ActionPrivate User user; /记得要生成get,set方法Public String execute()获取servletApi:(推荐用一,四种)方式一:通过ActionContext对象获取(解耦)1,获取session:ActionContext.getContext().getSession().put(“uaer”,name);2,获取request-HttpServletRequest对象的attributeMap req
26、uest = (Map)ActionContext.getContext().get(“request”);3,获取application:Map application= (Map)ActionContext.getContext().getApplication();4,获取parameters:Map parameter= (Map)ActionContext.getContext().getParameters();方式二:通过ActionContext直接获取HttpServletRequestHttpServletRequest request = (HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);request.getSession();方式三:实现servletRequestAwqre接口方式四:通过ServletActio