JAVA经典面试题+答案(共18页).docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《JAVA经典面试题+答案(共18页).docx》由会员分享,可在线阅读,更多相关《JAVA经典面试题+答案(共18页).docx(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上1 forword和redirect的区别以及各自的应用场景直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于一个每个信息资源是共享的。 场景:Web应用程序大多会有一个控制器。由控制器来控制请求应该转发给那个信息资源。然后由这些信息资源处理请求,处理完以后还可能转发给另外的信息资源来返回给用户,这个过程就是经典的MVC模式。间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发
2、出请求,从而达到转发的目的。场景:一般用于避免用户的非正常访问。例如:用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问。区别Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。对应到代码里,分别是RequestDispatcher类的forward()方法和HttpServletRequest类的sendRedirect()方法。 对于间接方式,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。它本质上是两次HTTP请求,对应两个request对象。对于直接方式,客户端浏览
3、器只发出一次请求,Servlet把请求转发给Servlet、HTML、JSP或其它信息资源,由第2个信息资源响应该请求,两个信息资源共享同一个request对象。2 Spring套餐1、 描述Spring容器初始化过程Ioc容器的初始化是由refresh()方法来启动的,这个方法标志着Ioc容器的正式启动。具体来说这个启动过程包括三个基本过程:1.BeanDifinition的Resource定位指的是BeanDifinition的资源定位,它由ResourceLoader通过统一的Resource接口来完成,这些BeanDifinition的存在形式,比如,在文件系统中的Bean定义信息可以
4、使用FileSystemResource来进行抽象,在类路径中的Bean定义信息可以使用ClassPathResource。2.BeanDifinition的载入与解析把用户定义好的Bean表示成Ioc容器内部的数据结构,而这个容器内部的数据结构就是BeanDifinition。具体来说,BeanDifinition实际上就是POJO对象在IOC容器中的抽象,通过这个BeanDifinition定义的数据结构,使IOC容器能够方便的对POJO对象也就是Bean进行管理。3.BeanDifinition在Ioc容器中的注册这个操作是通过调用BeanDifinitionRegistry借口来实现的
5、。这个注册过程把载入过程中解析得到的BeanDifinition向Ioc容器进行注册。 在阅读源码中可知,在IOC容器内部将BeanDifinition注入到一个HashMap中去,Ioc容器就是通过这个HashMap来持有这些BeanDifinition数据的。2、为什么要进行事务管理,Spring是如何进行事务管理支持的Spring事务是SpringAOP的一种实现,本质是基于动态代理技术对所需要管理的bean进行加载,并在方法调用前后加入合适的事务管理代码实现事务的提交与产生异常时回滚。spring的事务声明有两种方式,编程式和声明式。spring主要是通过“声明式事务”的方式对事务进行
6、管理,即在配置文件中进行声明,通过AOP将事务切面切入程序,最大的好处是大大减少了代码量。3、 Spring如何配置数据库驱动4、 解释一下DI依赖注入和IOC控制反转,Spring中是如何做的IOC(控制反转)是spring的核心,由Spring管理创建响应的对象,即由IOC容器帮对象管理响应的依赖关系,并在运行时将对象注入,而不是通过传统的new来主动创建对象。而DI则是实现IOC注入关联对象的方式,有三种:set方法注入、构造函数注入和参数(常量)注入。控制反转和依赖注入是同一个东西在不同的角度进行分析,在实际项目开发中我们需要把bean都放在spring中管理,告诉spring不同be
7、an之间的依赖关系,而具体的创建注入都是由spring容器帮我们实现的,即通过控制反转和依赖注入,本质实现都是基于反射机制来实现的。5、 Spring中的BeanFactory与ApplicationContext的作用有那些BeanFactory提供了配制框架及基本功能,负责对象实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。而ApplicationContext则增加了更多支持企业核心内容的功能。比如更易与Spring AOP集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的context实现(如针对web应用的WebApplicationContext)。6、 Spr
8、ing中的核心类有那些,各有什么作用BeanFactory:产生一个新的实例,可以实现单例模式BeanWrapper:提供统一的get及set方法ApplicationContext:提供框架的实现,包括BeanFactory的所有功能7、 什么是aop,aop的作用是什么面向切面编程,或AOP允许程序员模块化横向业务逻辑,将系统中非核心的业务提取出来,进行单独处理,解决系统代码耦合度过高的问题。使代码重用度高、易于维护。例如权限认证、日志管理和事务管理。8、 spring bean的创建方式和生命周期三种创建方式:构造器注入创建 工厂方法(静态工厂) 工厂类(实例工厂)1) Bean实例化
9、:Bean的默认构造函数。 2) Bean的初始化:Init()方法中可以进行初始化。 3) Bean的使用 :getBean()方法可以获取当前的Bean,从而做相对应的业务操作。 4) Bean的销毁 :destroy()方法执行bean的销毁。 9、spring与springMVC的区别Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。spring mvc类似于struts的一个MVC开框架,其实都是属于spring,spring mvc需要有spring的架包作为支撑才能跑起来。3 HashMap(或者Hashtable/ArrayList。)的数据结构(实现
10、方式)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计算方法是直接使用
11、key的hashcode对table数组的长度直接进行取模。ArrayList:线性链表(线程不安全),最核心的两个成员变量是存储数据的数组和数组大小。 a. ArrayList 是通过将底层 Object 数组复制的方式(System.arraycopy方法)来处理数组的增长; b. 当ArrayList 的容量不足时,其扩充容量的方式:先将容量扩充至当前容量的1.5倍,若还不够,则将容量扩充至当前需要的数量。4 GET与POST的区别,分别用在什么场景合适?GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。get是把参数数据队列加到提交表单的ACTION属性所指的URL中,
12、值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。对于get方式,服务器端用doGet获取变量的值,对于post方式,服务器端用doPost获取提交的数据。get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。get安全性非常低,post安全性较高。但是执行效率却比Post方法好。 5什么是单例模式,有哪些实现方式,写出其中两种Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类
13、被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点。第一种(懒汉,线程不安全):略(参考第二种)第二种(懒汉,线程安全):publicclassSingletonprivatestaticSingletoninstance; privateSingleton()publicstaticsynchronizedSingletongetInstance()if(instance=null)instance=newSingleton();returninstance;这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况
14、下不需要同步。第三种(饿汉):publicclassSingletonprivatestaticSingletoninstance=newSingleton(); privateSingleton()publicstaticSingletongetInstance()returninstance;第四种(静态内部类):publicclassSingletonprivatestaticclassSingletonHolderprivatestaticfinalSingletonINSTANCE=newSingleton(); privateSingleton()publicstaticfinal
15、SingletongetInstance() returnSingletonHolder.INSTANCE;这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它跟第三种方式不同的是(很细微的差别):第三种是只要Singleton类被装载了,那么instance就会被实例化(没有达到lazy loading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。想
16、象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,我不希望在Singleton类加载时就实例化,因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比第三方式就显得很合理。第五种(枚举):publicenumSingletonINSTANCE;publicvoidinstance()这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,个人认为由于1.5中才加入e
17、num特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。第六种(双重校验锁):publicclassSingletonprivatevolatilestaticSingletonsingleton; privateSingleton()publicstaticSingletongetSingleton()if(singleton=null)synchronized(Singleton.class)if(singleton=null)singleton=newSingleton();returnsingleton;这个是第二种方式的升级版,俗称双重检查锁定,但仅在JDK
18、1.5之后有效。6 常见的设计模式有哪些,并写出简单的示例代码单例模式(略):工厂模式(普通、多方法和静态工厂方法、抽象工厂):该模式主要功能是统一提供实例对象的引用建造者模式:一个对象的组成可能有很多其他的对象一起组成的,比如说,一个对象的实现非常复杂,有很多的属性,而这些属性又是其他对象的引用,可能这些对象的引用又包括很多的对象引用。封装这些复杂性,就可以使用建造模式。策略模式:这个模式是将行为的抽象,即当有几个类有相似的方法,将其中通用的部分都提取出来,从而使扩展更容易。门面模式:这个模式个人感觉像是Service层的一个翻版。比如Dao我们定义了很多持久化方法,我们通过Service层
19、将Dao的原子方法组成业务逻辑,再通过方法向上层提供服务。门面模式道理其实是一样的。代理模式:其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。7 原生JS的继承是怎么实现的,都有哪几种?对象冒充function Parent(username).function Child(username,password)/第一步:this.method是作为一个临时的属性,并且指向Parent所指向的对象,this.metho
20、d = Parent;/第二步:执行this.method方法,即执行Parent所指向的对象函数this.method(username);/最关键的一行/第三步:销毁this.method属性,即此时Child就已经拥有了Parent的所有属性和方法delete this.method;. call方法call方法是Function类中的方法call方法的第一个参数的值赋值给类(即方法)中出现的thiscall方法的第二个参数开始依次赋值给类(即方法)所接受的参数function Parent(username).function Child(username,password)Paren
21、t.call(this,username);.apply()方法方式 apply方法接受2个参数, A、第一个参数与call方法的第一个参数一样,即赋值给类(即方法)中出现的this B、第二个参数为数组类型,这个数组中的每个元素依次赋值给类(即方法)所接受的参数function Parent(username).function Child(username,password)Parent.apply(this,new Array(username);.原型链方式,即子类通过prototype将所有在父类中通过prototype追加的属性和方法都追加到Child,从而实现了继承。functi
22、on Person()Person.prototype.hello = hello;Person.prototype.sayHello = function()alert(this.hello);function Child()Child.prototype = new Person();/这行的作用是:将Parent中将所有通过prototype追加的属性和方法都追加到Child,从而实现了继承Child.prototype.world = world;Child.prototype.sayWorld = function()alert(this.world);混合方式(略):混合了call
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 经典 试题 答案 18
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内