您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > JAVA经典面试题+答案
1forword和redirect的区别以及各自的应用场景直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于一个每个信息资源是共享的。场景:Web应用程序大多会有一个控制器。由控制器来控制请求应该转发给那个信息资源。然后由这些信息资源处理请求,处理完以后还可能转发给另外的信息资源来返回给用户,这个过程就是经典的MVC模式。间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。场景:一般用于避免用户的非正常访问。例如:用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问。区别Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。对应到代码里,分别是RequestDispatcher类的forward()方法和HttpServletRequest类的sendRedirect()方法。对于间接方式,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。它本质上是两次HTTP请求,对应两个request对象。对于直接方式,客户端浏览器只发出一次请求,Servlet把请求转发给Servlet、HTML、JSP或其它信息资源,由第2个信息资源响应该请求,两个信息资源共享同一个request对象。2Spring套餐1、描述Spring容器初始化过程Ioc容器的初始化是由refresh()方法来启动的,这个方法标志着Ioc容器的正式启动。具体来说这个启动过程包括三个基本过程:1.BeanDifinition的Resource定位指的是BeanDifinition的资源定位,它由ResourceLoader通过统一的Resource接口来完成,这些BeanDifinition的存在形式,比如,在文件系统中的Bean定义信息可以使用FileSystemResource来进行抽象,在类路径中的Bean定义信息可以使用ClassPathResource。2.BeanDifinition的载入与解析把用户定义好的Bean表示成Ioc容器内部的数据结构,而这个容器内部的数据结构就是BeanDifinition。具体来说,BeanDifinition实际上就是POJO对象在IOC容器中的抽象,通过这个BeanDifinition定义的数据结构,使IOC容器能够方便的对POJO对象也就是Bean进行管理。3.BeanDifinition在Ioc容器中的注册这个操作是通过调用BeanDifinitionRegistry借口来实现的。这个注册过程把载入过程中解析得到的BeanDifinition向Ioc容器进行注册。在阅读源码中可知,在IOC容器内部将BeanDifinition注入到一个HashMap中去,Ioc容器就是通过这个HashMap来持有这些BeanDifinition数据的。2、为什么要进行事务管理,Spring是如何进行事务管理支持的Spring事务是SpringAOP的一种实现,本质是基于动态代理技术对所需要管理的bean进行加载,并在方法调用前后加入合适的事务管理代码实现事务的提交与产生异常时回滚。spring的事务声明有两种方式,编程式和声明式。spring主要是通过“声明式事务”的方式对事务进行管理,即在配置文件中进行声明,通过AOP将事务切面切入程序,最大的好处是大大减少了代码量。3、Spring如何配置数据库驱动beanid=dataSourceclass=org.apache.commons.dbcp.BasicDataSourcepropertyname=driverClassNamevalue=com.mysql.jdbc.Driver/propertypropertyname=urlvalue=jdbc:mysql://localhost:3306/test/propertypropertyname=usernamevalue=root/propertypropertyname=passwordvalue=admin/property/bean4、解释一下DI依赖注入和IOC控制反转,Spring中是如何做的IOC(控制反转)是spring的核心,由Spring管理创建响应的对象,即由IOC容器帮对象管理响应的依赖关系,并在运行时将对象注入,而不是通过传统的new来主动创建对象。而DI则是实现IOC注入关联对象的方式,有三种:set方法注入、构造函数注入和参数(常量)注入。控制反转和依赖注入是同一个东西在不同的角度进行分析,在实际项目开发中我们需要把bean都放在spring中管理,告诉spring不同bean之间的依赖关系,而具体的创建注入都是由spring容器帮我们实现的,即通过控制反转和依赖注入,本质实现都是基于反射机制来实现的。5、Spring中的BeanFactory与ApplicationContext的作用有那些BeanFactory提供了配制框架及基本功能,负责对象实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。而ApplicationContext则增加了更多支持企业核心内容的功能。比如更易与SpringAOP集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的context实现(如针对web应用的WebApplicationContext)。6、Spring中的核心类有那些,各有什么作用BeanFactory:产生一个新的实例,可以实现单例模式BeanWrapper:提供统一的get及set方法ApplicationContext:提供框架的实现,包括BeanFactory的所有功能7、什么是aop,aop的作用是什么面向切面编程,或AOP允许程序员模块化横向业务逻辑,将系统中非核心的业务提取出来,进行单独处理,解决系统代码耦合度过高的问题。使代码重用度高、易于维护。例如权限认证、日志管理和事务管理。8、springbean的创建方式和生命周期三种创建方式:①构造器注入创建②工厂方法(静态工厂)③工厂类(实例工厂)1)Bean实例化:Bean的默认构造函数。2)Bean的初始化:Init()方法中可以进行初始化。3)Bean的使用:getBean()方法可以获取当前的Bean,从而做相对应的业务操作。4)Bean的销毁:destroy()方法执行bean的销毁。9、spring与springMVC的区别Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。springmvc类似于struts的一个MVC开框架,其实都是属于spring,springmvc需要有spring的架包作为支撑才能跑起来。3HashMap(或者Hashtable/ArrayList。。。)的数据结构(实现方式)HashMap:key:value底层使用数组(table)+链表(entry)结构,通过key进行二次hash计算出的hashCode%table.length确定对应的数组下标的位置存放value。HashTable:key:valueHashtable继承于Dictionary,实现了Map、Cloneable、Java.io.Serializable接口,Hashtable的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。此外,Hashtable中的映射不是有序的。底层使用数组(table)+链表(entry)结构,hash计算方法是直接使用key的hashcode对table数组的长度直接进行取模。ArrayList:线性链表(线程不安全),最核心的两个成员变量是存储数据的数组和数组大小。a.ArrayList是通过将底层Object数组复制的方式(System.arraycopy方法)来处理数组的增长;b.当ArrayList的容量不足时,其扩充容量的方式:先将容量扩充至当前容量的1.5倍,若还不够,则将容量扩充至当前需要的数量。4GET与POST的区别,分别用在什么场景合适?GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTMLHEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。对于get方式,服务器端用doGet获取变量的值,对于post方式,服务器端用doPost获取提交的数据。get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。get安全性非常低,post安全性较高。但是执行效率却比Post方法好。5什么是单例模式,有哪些实现方式,写出其中两种Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点。第一种(懒汉,线程不安全):略(参考第二种)第二种(懒汉,线程安全):publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticsynchronizedSingletongetInstance(){if(instance==null){instance=newSingleton();}returninstance;}}这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazyloading,但是,遗憾的是,效率很低,99%情况下不需要同步。第三种(饿汉):publicclassSingleton{privatestaticSingletoninstance=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returninstance;}}第四种(静态内部类):publicclassSingleton{privatestaticclassSingletonHolder{privatestaticfinalSingletonINSTANCE=newSingleton();}privateSingleton(){}publicstaticfinalSingletongetInstance(){returnSingletonHolder.INSTANCE;}}这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它跟第三种方式不同的是(很细微的差别):第三种是只要Singleton类被装载了,那么instance就会被实例化(没有达到lazyloading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。想象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,我不希望在Singleton类加载时就实例化,因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比第三方式就显得很合理。第五种(枚举):publicenumSingleton{INSTANCE;publicvoidinstance(){}}这种方式是EffectiveJava作者JoshBloch提倡的
本文标题:JAVA经典面试题+答案
链接地址:https://www.777doc.com/doc-8547799 .html