1.很新的面试题
2.很全的面试题
3.很重点的面试题 框架
Struts2与Struts1的面试题
###1.Struts2与Struts1的联系与区别?为什么要用Struts2?
struts1与struts2都是mvc框架的经典实现模式。
Struts2不是从Struts1升级而来,而是由WebWork改名而来,而WebWork只是Xwork加了很多WEB拦截器而已
区别:
1.核心控制器改成了过滤器(过滤器比Servlet的级别要高,因为程序运行时是先进入过滤器再进入Servlet)
2.struts1严重依赖于Servlet(因为太过于依赖于api的HttpServletRequest与HttpServletResponse的两个参数),
struts2就则脱离了Servlet的API。
3.管理Action时struts1是单例模式,struts2是每个请求产生一个实例。
4.在表达式的支持上struts2不仅有jstl,还有功能更加强大的ognl表达式。
5.struts1的类型转换是单向的(页面到ActionForm),struts2是双向的(页面到Action再到页面回显)
6.校验,struts1没有针对具体方法的校验,struts2提供了指定某个方法进行效验,还有框架校验。
7.struts2提供了拦截器,利用拦截器可以在访问Action之前或之后增加如权限拦截等功能。
8.struts2提供了全局范围,包范围,Action范围的国际化资源文件管理实现。
9.struts2支持多种视图类型
###2.Struts2的核心是什么,体现了什么思想?
Struts2的核心是拦截器,基本上核心功能都是由拦截器完成,拦截器的实现体现了AOP(面向切面编程)思想
###3.为何继承ActionSupport
因为ActionSupport实现了Action接口,提供了国际化,校验的功能。
ActionSupport实现了国际化功能:因为它提供了一个getText(String key)方法实现国际化,该方法从资源文件上获取国际化信息。
Action接口提供了五个常量(success,error,login,input,none)。
(s?k'ses,er?(r) n?n
###4.模型驱动与属性驱动是什么 模型驱动使用时注意什么问题
答:模型驱动与属性驱动都是用来封装数据的。
1.模型驱动:在实现类中实现ModelDriven<T>接口使用泛型把属性类封装起来,重写getModel()方法,然后在实现类里创建一个属性类的实例,
2.属性驱动:在实现类里定义属性,生成get与set方法,通过属性来拿值。
###5.Struts2是怎样进行值封装的?
struts2的值封装实际上是采用了ognl表达式.
###6.Struts2如何进行校验
1.每个Action类有一个校验文件,命名 Action类名-validation.xml,且与Action类同目录,这是对action里面所有的方法进行校验。
2.对Action里面的指定方法做校验使用Action的类名-访问路径_方法名-validation.xml。
在效验文件里又分为两种:
字段校验:字段用什么校验器来校验。
非字段校验:是用校验器校验什么字段。
###7.谈谈Struts2 的国际化
在struts2中是使用了拦截器来实现国际化。
具体是先配置属性文件,格式是文件名_语言_国家名.properties,然后放的位置有Action同包位置,
package位置,全局位置(要在常量里面配置), 然后页面通过s:text或者key属性去访问
###8.OGNL是什么你在项目中如何使用它
OGNL是:对象图形导航语言。
在struts2中的作用:
ognl的实现关系:ActionConetxt。
ognl 3个常用的符号 # $ %
#
1 构造map,list集合。 2 取ognl上下文的值。 3 用来过滤集合。 $
1 在校验框架中取资源文件中的值。
2 可以在配置文件中传递参数。
%
使用百分号可以进行转义。
###9.Strust2如何访问Servlet API
1:通过ActionContext可以获得request,application,session三个作用域(struts2实际上是通过适配器
来把servlet的api转换为一个map,并把这些map放在ActionContext里面)。 2:通过ActionContext的子类ServletActionContext去获取原滋原味的API。
3:可以通过实现ServletRequestAware接口,重写里面的setServletRequest方法可以获
得request,实际上是通过set的依赖注入。
###10.什么是拦截器 说说Struts2用拦截器来干什么 说出6个拦截器来
解释:在访问类的某个方法或者属性之前执行,拦截的是Action的请求,进行拦截然后在方法的执行前或者之后加入某些操作。
作用:国际化,权限,效验等与源代码无关的操作。
拦截器:
国际化,表单重复提交,类型转换,自动装配,数据封装,异常处理,模型驱动,请求参数,处理类型转换错误,日志拦截器。
###11.如何实现自定义拦截器? 需要注意什么?
实现:
1.可以实现Interceptor接口,重写doIntercept方法指定某个方法进行拦截,或者继承AbstractInterceptor类,重写intercept方法。
2.在xml配置文件中定义自定义拦截器,然后注入到拦截器栈中,再把拦截器引用到action中。
3.可以配置到某个action单独使用,也可以配置到包下面的所有action使用。 注意:
要把默认的拦截器栈重新引用,否则会被覆盖。
###12. ActionContext是用来干什么的
ActionContext是Action的上下文。
###13.为什么要继承默认的包?
因为在Strtus2里面默认有很多的常量,拦截器,还有一些bean,如果继承默认的包,这些默认值和常量就会继承过来,
###14.常见的有哪几种结果集类型?
dispatcher:指得是转发,默认的结果集类型
redirect:重定向,
redirectAction:重定向到一个Action
stream:是返回一个流,一般用在文件下载上面
###15.开发项目时struts2在页面怎样拿值?
从值栈中或者是ognl的上下文
###16.怎么样用Struts2进行文件的上传或者下载
上传:
1.在jsp用了s:file标签,把s:from的enctype 属性设置为 multipart/form-data
2.在action里面定义三个字段 File file ,String [file]ContentType,String [file] FileName
3.用输出流转化成硬盘上面的文件
下载:
1.在struts.xml中配置result为stream的类型
2.在action定义四个属性,默认的有个是InputStream 的类型叫inputStream的,从硬盘上面读取文件到这个流赋值即可.
contentType; contentLength; contentDisposition; inputStream;
###17.简单讲下struts里面的标签,说不少于5个
s:if
s:form
s:url
s:property
s:iterater
###18.默认struts2里面的标签取值都是从那里取值的
默认都是从OGNL值栈里面取值的
###19.ValueStack分为那两部分,组成部分是什么,分别怎么访问
分为:
对象栈和ContextMap
访问:
1.对象栈前台可以直接访问
2.ContextMap访问的时候前面加#
###20.标签<s:property>和el表达式有什么区别,
相同:
都可以从值栈里面取值
区别:
el表达式只能取属性有get set方法的简单数据类型
s:property标签:取得数组的一些方法等复杂数据对象类型
###21.说下重复提交的解决思路,Struts2是怎么样解决重复提交的
1.在页面表单域加入一个隐藏的s:token字段,然后在session里面也加入同样的值
2.当用户第一次请求的时候,把request的值和session对比,相同就通过请求,执行下面拦截器,并且移除Session里面的值
3.如果第二次请求时候,Session已经没有这个值,那么就阻断当前请求,定位重复提交 Struts2是通过s:token标签来完成重复提交思路的
spring的面试题部分
###1.Spring的aop你怎样实现?
用动态代理和cglib实现,有接口的用动态代理,无接口的用cglib
###2.Spring在SSH起什么作用
为大部分框架提供模版,常见的核心类提供初始化,并且整合三层框架
###3.Spring容器内部怎么实现的
内部用Map实现,或者说HashMap
###4.怎么样理解IOC与AOP
IOC是一种控制反转的思想,降低了对象的耦合度,AOP是面向切面编程,非侵入式编程,实现了非业务性编程(公共功能),譬如日志,权限,事务等等
###5.Spring的事务,事务的作用。
Spring里面的事务分为编程式事务和声明式事务,一般用声明式事务,用来控制数据操作的完整性,一致性
###6.Spring的IOC和AOP你在项目中是怎么使用的?
IOC主要来解决对象之间的依赖问题,把所有的bean的依赖关系通过配置文件或者注解关联起来,降低了耦合度,AOP一般用来整合框架时候都可以用得到,
事务用的最多,还有个别日志,权限功能也可以用到
###7Spring主要使用了什么模式?
工厂模式-->每个Bean的创建通过方法
单例模式-->默认的每个Bean的作用域都是单例
代理模式-->关于AOP的实现是通过代理,体现代理模式
###8.Spring bean的作用域.
Scope作用域有4种,常见的有单例或者多例,默认是单例
###9.Spring的事务是如何配置的?
1.先配置事务管理器TransactionManager,不同的框架有不同属性
2.再配置事务通知和属性,通过tx:advice
3.配置<aop:config>,设置那些方法或者类需要加入事务
###10.Spring的配置文件最好使用什么文件?
xml,因为它是最简单,最流行的数据格式
###11.你使用过Spring中的哪些技术?
bean的管理,AOP技术,IOC技术 ,事务等
###12.为什么要用Spring
降低对象耦合度,让代码更加清晰,提供一些常见的模版
###13.说下Spring的注解
1.bean的标记注解
@Component 通用注解 @Repository 持久层注解 @Service 业务层注解 @Controller:表现层注解
2.bean的自动装配注解
称
@AutoWired 默认是按照类型装配,如果有多个类型实现可以用Qualifier来指定名
@Resource 默认是按照名称来装配,是JDK里面自带的注解,默认情况下用@AutoWired注解
###15.写过类似Spring AOP的操作吗?
简单的写过,譬如前置通知,后置通知的方法,环绕通知,事务就是典型的AOP的实现
###16.Spring中的AOP在你项目中是怎么使用的,用在哪里?
Struts2和Hibernate整合时候都可以用得到, 事务用的最多,还有个别日志,权限功能也可以用到
###17.Spring的事务(传播属性,隔离级别)。
七大传播属性,四大隔离级别
###19.Spring DI的几种方式
setter注入和构造器注入,一般用setter注入
###20.依赖注入的原理
就是通过反射机制生成想要的对象注入
###21.说一下整合Spring的核心监听器。
这个是在SSH整合的时候使用,是整个WEB项目启动的时候初始化Spring的容器. 具体是在web.xml里面配置的ContextLoaderListener
Spring配置文件中的核心是个监听器,是用来初始化Spring的容器
###22.Spring你们为什么用配置文件而不使用注解?
配置文件耦合度低,容易维护,尤其是在切面或者事务的时候,只配置一次就可以让很多代码拥有事务,
###23.Spring和Hibernate的事务有什么区别?
Spring的事务提供了统一的事务处理机制,包含了JDBC,Hibernate,IBatis等事务实现,而Hibernate只处理自己事务
###24.Struts2与Spring整合先启动那个容器。
先启动监听器,因为先要初始化容器,初始化容器了以后Action才能从容器里面获得
###26.让你写Spring的容器,你是怎样实现的?
我们可以写一个HashMap,如果并发考虑的话要写并发的Map,把bean的名字放在map的key,bean的实现map的value
###27.谈谈Spring的IOC和AOP,如果不用Spring,怎么去实现这两个技术。
ioc用反射实现 ,AOP用动态代理实现
###28.Spring事务和Hibernate事务的操作上面的区别?
hibernate的事务只能手动显示代码的方式控制创建事务与提交事务以及回滚。
Spring可以通过配置文件设定一类class事务的创建与提交以及回滚,也可以显示代码方式控制。
###29.讲下Spring的七大事务传播
有七个,常用有两个REQUIERD, REQUIRED_NEW,REQUIERD表示两个事务的方法调用的时候,前面的时候和后面的合并成一个事务,REQUIRED_NEW是重启一个事务,各干各的
###30.在同一进程里,有A,B两个方法都对不同的表进行更新数据,假如A方法出异常了,若要B方法执行,怎样配置事务级别,若不要B方法执行,又该怎样配置?
前者用REQUIRED_NEW,后者用REQUIRED
###31.事务并发会引起什么问题,怎么解决
事务并发会引起脏读,幻读,不可重复读等问题,设定事务的隔离级别就可以解决
###32.事务的隔离级别
Spring定义有四种,但是常见的是READ_COMMIT,Oralce有两种实现,MYSql有四种
###33.Spring的IOC容器与工厂类有什么区别?
IOC(Inversion of Control)对Bean的控制能力更强,能控制对象自动注入,还可以控制生命周期,而工厂类只是简单的创建一个对象,没有什么控制能力
###34.事务的安全问题:锁机制的实现原理及在项目中的使用
锁有悲观锁和乐观锁,悲观锁一般假设每个人都会修改数据,默认情况下把数据都锁住,影响性能,但安全性高.
乐观锁是假设每个人都只读下数据,不会修改数据,性能比较高,但是安全性较低,一般通过增加类似于版本控制里面版本号来解决问题
###35.讲下BeanFactory和ApplicationContext的区别
BeanFactory是Spring容器顶级核心接口,比较早,但功能比较少,getBean就是BeanFactory定义的,
ApplicationContext是Spring里面的另外一个容器顶级接口,它继承于BeanFactory,但是提供的功能譬如校验,国际化,监听,
对Bean的管理功能比较多,一般使用ApplicationContext
###f-sm-1. 讲下SpringMvc和Struts1,Struts2的比较的优势
性能上Struts1>SpringMvc>Struts2 开发速度上SpringMvc和Struts2差不多,比Struts1要高
###f-sm-2. 讲下SpringMvc的核心入口类是什么,Struts1,Struts2的分别是什么
SpringMvc的是DispatchServlet,Struts1的是ActionServlet,Struts2的是StrutsPrepareAndExecuteFilter
###f-sm-3. SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决
是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段
###f-sm-4. SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代
一般用@Controller注解,表示是表现层,不能用用别的注解代替.
###f-sm-5. @RequestMapping注解用在类上面有什么作用
用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
###f-sm-6. 怎么样把某个请求映射到特定的方法上面
直接在方法上面加上注解@RequestMapping,并且在这个注解里面写上要拦截的路径 ###f-sm-7. 如果在拦截请求中,我想拦截get方式提交的方法,怎么配置
springMVC模式的面试题部分
可以在@RequestMapping注解里面加上method=RequestMethod.GET
###f-sm-8. 如果在拦截请求中,我想拦截提交参数中包含"type=test"字符串,怎么配置
可以在@RequestMapping注解里面加上params="type=test"
###f-sm-9. 我想在拦截的方法里面得到从前台传入的参数,怎么得到
直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样
###f-sm-10. 如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象
直接在方法中声明这个对象,SpringMvc就自动会把属性赋值到这个对象里面 ###f-sm-11. 怎么样在方法里面得到Request,或者Session
直接在方法的形参中声明request,SpringMvc就自动把request对象传入
###f-sm-12. SpringMvc中函数的返回值是什么.
返回值可以有很多类型,有String, ModelAndView,List,Set等,一般用String比较好,如果是AJAX请求,返回的可以是一个集合
###f-sm-13. SpringMvc怎么处理返回值的
SpringMvc根据配置文件中InternalResourceViewResolver(内部资源视图解析器)的前缀和后缀,用前缀+返回值+后缀组成完整的返回值
###f-sm-14. SpringMVC怎么样设定重定向和转发的
在返回值前面加"forward:"就可以让结果转发,譬如"forward:user.do?name=method4" 在返回值前面加"redirect:"就可以让返回值重定向,譬如"redirect:http://www.uu456.com" ###f-sm-15. SpringMvc用什么对象从后台向前台传递数据的
通过ModelMap对象,可以在这个对象里面用addAttribute()方法,把对象加到里面,前台就可以通过el表达式拿到
###f-sm-16. SpringMvc中有个类把视图和数据都合并的一起的,叫什么
ModelAndView
###f-sm-17. 怎么样把数据放入Session里面
可以声明一个request,或者session先拿到session,然后就可以放入数据,或者可以在类上面加上@SessionAttributes注解,
里面包含的字符串就是要放入session里面的key
###f-sm-18. SpringMvc怎么和AJAX相互调用的
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象 具体步骤如下 :
1.加入Jackson.jar
2.在配置文件中配置json的映射
3.在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解
###f-sm-19. 当一个方法向AJAX返回特殊对象,譬如Object,List等,需要做什么处理
要加上@ResponseBody注解
###f-sm-20. SpringMvc里面拦截器是怎么写的
有两种写法,一种是实现接口,另外一种是继承适配器类,然后在SpringMvc的配置文件中配置拦截器即可:
<!-- 配置SpringMvc的拦截器 --> <mvc:interceptors> <!-- 配置一个拦截器的Bean就可以了 默认是对所有请求都拦截 -->
<bean id="myInterceptor" class="com.et.action.MyHandlerInterceptor"></bean>
<!-- 只针对部分请求拦截 --> <mvc:interceptor> <mvc:mapping path="/modelMap.do" /> <bean class="com.et.action.MyHandlerInterceptorAdapter" /> </mvc:interceptor> </mvc:interceptors>
###f-sm-21. 讲下SpringMvc的执行流程
系统启动的时候根据配置文件创建spring的容器, 首先是发送http请求到核心控制器DispatcherServlet,spring容器通过映射器去寻找业务控制器,
使用适配器找到相应的业务类,在进业务类时进行数据封装,在封装前可能会涉及到类型转换,执行完业务类后使用ModelAndView进行视图转发,
数据放在model中,用map传递数据进行页面显示。
### 1.讲下MyBatis和Hibernate的区别?
MyBatis是JDBC的轻量级封装,把Sql和java代码独立出来,性能相对比较高,写SQL语句相对于比较灵活,并且容易调试,一般用在大型项目中.
Hibernate是JDBC的重量级封装,开发速度比较快,但是性能比较低,调试不方便,一般适合对进度要求的比较高的中小型项目
###2.什么是MyBatis的接口绑定,有什么好处
接口映射就是在IBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,
这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置.
###3.接口绑定有几种实现方式,分别是怎么实现的?
接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上@Select MyBatis的面试题部分
@Update等注解里面包含Sql语句来绑定,另外一种就是通过xml里面写SQL来绑定,在这种情况下,
要指定xml映射文件里面的namespace必须为接口的全路径名.
###4.什么情况下用注解绑定,什么情况下用xml绑定
当Sql语句比较简单时候,用注解绑定,当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多
###5.MyBatis实现一对一有几种方式?具体怎么操作的
有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在resultMap里面配置association节点配置一对一的类就可以完成;
嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置
###6.如果要查询的表名和返回的实体Bean对象不一致,那你是怎么处理的?
在MyBatis里面最主要最灵活的的一个映射对象的ResultMap,在它里面可以映射键值对, 默认里面有id节点,result节点,它可以映射表里面的列名和对象里面的字段名. 并且在一对一,一对多的情况下结果集也一定要用ResultMap
###7.MyBatis里面的动态Sql是怎么设定的?用什么语法?
MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完整,必须配合where,trim节点,
where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or开始,那么会自动把这个and或者or取掉
###8.MyBatis在核心处理类叫什么
MyBatis里面的核心处理类叫做SqlSession
###9.IBatis和MyBatis在细节上的不同有哪些
在sql里面变量命名有原来的#变量# 变成了#{变量} 原来的$变量$变成了${变量}, 原来在sql节点里面的class都换名字交type
原来的queryForObject queryForList 变成了selectOne selectList
原来的别名设置在映射文件里面放在了核心配置文件里
###10.讲下MyBatis的缓存
MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面,默认就有,二级缓存放在它的命名空间里,
默认是打开的,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/>
###11.MyBatis(IBatis)的好处是什么
ibatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的
维护带来了很大便利。
ibatis封装了底层JDBC API的调用细节,并能自动将结果集转换成Java Bean对象,大大简化了Java数据库编程的重复工作。
因为Ibatis需要程序员自己去编写sql语句,程序员可以结合数据库自身的特点灵活控制sql语句,
因此能够实现比hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。 ###12.MyBatis里面怎么处理分页
用插件分页
###13.MyBatis里面怎么样获得刚插入的主键
把insert节点的useGeneratedKeys=true设置先生成主键,然后keyProperty="id",把生成的主键指向属性.
###1. 为什么要用自定义标签?
①Jsp中写代码比较混乱,难以维护
②把一些重复的功能都抽取出来,方便复用。
###2. 自定义标签分为几个步骤.
1.编写标签处理器类(SimpleTagSupport的实现类)
重写doTag()
2.编写标签库文件(WEB-INF/xxx.tld)
整个文件的定义: <short-name> <uri>
标签的定义: <tag>
3.在jsp页面使用标签:
导入标签库(xxx.tld/)
使用标签
###3. 自定义标签类要继承哪个类?
SimpleTagSupport类
sim·ple tag s?'p?rt
###4. 怎么配置自定义标签的属性
在.tld文件<tag>标签中添加<attribute>,
通过<name>标签设定自定义标签的标签名。 JSTL &EL的面试题部分
###5. 为什么要用EL表达式,有什么好处
1.在页面中用js脚本和jsp表达式来获取数据显示比较麻烦
a:需要条件判断
b:可能需要强转
2.好处是EL表达式简单易用,默认可访问所有的JSP隐藏对象。
###6. EL表达式的语法是什么?
美元符号加大括号 ---> ${ EL表达式 }
###7. EL有哪两种访问格式,有什么区别?
EL 提供“.“和“[ ]“两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如 . 或 - 等并非字母或数字的符号,就一定要使用“[ ]“。例如:
${ user. My-Name}应当改为${user["My-Name"]}
如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如: ${sessionScope.user[data]}中data 是一个变量。
###8. EL表达式中有哪些隐藏对象,举几个例子?
pageContext : JSP页面的上下文
param : 参数
paramValues : 参数值
header : 头信息
headerValues : 头的值
cookie : 缓存
initParam : 初始化参数
###9. EL表达式中怎么样拿到request,session里面的值?
例 :
可以通过它的隐藏对象RequestScope来获取到Request范围的属性名称所对应的值。 可以通过它的隐藏对象sessionScope来获取到session范围的属性名称所对应的值。
###10. EL表达式怎么样拿到用户请求的参数?
可以用${param.name} 来获取用户请求的参数
###11. EL表达式怎么样得到上下文路径?
${pageContext.request.contextPath}
###12. EL表达式怎么样拿到request?
RequestScope
###13. JSTL全称是什么?
java服务器页面标准标签库
(JavaServer Pages Standard Tag Library)
###14. JSTL是怎么使用的?
将jstl.jar、standard.jar 复制到 Tomcat 的 WEB-INF\lib 中. 若要在 JSP 网页中使用 JSTL 时,一定要先做下面这行声明: < %@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
主要提供给 Java Web 开发人员一个标准通用的标签函数库。Web 程序开发人员能够利用 JSTL 和 EL 来开发 Web 程序,
取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性、维护性和方便性。
###15. JSTL分为几个标签库?
①核心标签库
②国际化标签库
③数据库标签库
④XML标签库
⑤函数标签库
###16. JSTL里面判断标签是什么?
1. <c:if>
2. <c:choose>
<c:when></c:when>
<c:otherwise></c:otherwise>
</c:choose>
###17. JSTL里面的属性是否可以从EL表达式获取?
可以${xxxScope.attribute}
###18. JSTL里面的循环标签有几种,各是怎么用的?
1. <c:forEach> 用于迭代数字或集合;
2. <c:forTokens> 用于迭代字符串标记。
###19.怎么样得到循环标签里面的状态值,譬如index,count等?
在forEach循环标签中加入varStatus="s",然后直接用EL表达式: <c:forEach items="${atts}" var="item" varStatus="s">
<c:if test="${s.last}">
------
</c:if>
index:${s.index}<br/> count:${s.count}<br/> first:${s.first}<br/> last:${s.last}<br/> ${item}<br/><br/> </c:forEach>
###1.为什么要用自定义标签
自定义标签其实是一个Java类,他封装了一些标签代码,形成一个
具有某个功能的新标签。
1.增加了可扩展性。
2.增加了可复用性。
###2.自定义标签分为几个步骤.
1.创建标签的处理类(Tag Handler Class)
2.创建标签库描述文件(Tag Library Descrptor File)
3.在JSP文件中引入标签库
###3.自定义标签类要继承那个类
TagSupport
###4.怎么配置自定义标签的属性
在.tld 文件里配置
集合类面试题
###1.请讲下Java里面的容器
分两大类,Map和Collection。而Collection又有子接口List
(数据存储顺序和插入顺序是一样的)、Set(里面的元素具有唯一性)
Map是存储键值对的,里面的健不可以重复,但值可以重复 List主要有ArrayList和LinkedList两种实现。实现的数据结构不同, 所以主要的区别也都是和数据结构相关的。 ArrayList基于数组,随机访问快, 而对于中间元素的插入删除效率比较低,而且需要考虑扩容问题。 LinkedList,则 基于链表,和ArrayList提到的正相反,随机访问慢, 但对于中间元素的插入和删除更有效率。 Set也是一种Collection,和List比起来主要体现在元素唯一性。
###2.请说下Iterator的作用
迭代器可以实现Collection接口的方法,可以一个一个地获取集合中的元素 特性:在遍历集合时 可判断是否有下一个元素
###3.说下ArrayList和LinkedList的区别和联系,并说明什么情况下用它们
区别:ArrayList用于对象的随机访问速度快,没有顺序
LinkedList实现机制是链表式的,和顺序有关,速度比ArrayList慢
--->联系:ArrayList和LinkedList都是List接口的实现类
当要快速获取一个值时,用ArrayList,用于顺序插入操作时,用LinkedList.
###4.说下List,Set,Map三种集合各有什么特征
List集合中的元素可以重复,
Set集合中的元素不可以重复
Map集合用键-值映射存放对象,Map容器中的键对象不能重复,值对象可以重复
###5.HashSet和TreeSet有什么区别,什么时候用它们
区别:HashSet中的元素不能重复,没有顺序
TreeSet中的元素不能重复,但有顺序
当集合中的元素需要排序时,用TreeSet
一般情况下用HashSet,因为不需要排序,速度比TreeSet快
###6.什么是泛型,怎么使用的,有什么好处?
答案
泛型又分为:方法泛型和类泛型。
定义一个集合时,可以知道里面定义的是什么类型
使用:在集合类型后面加< 数据类型 >
使用泛型后,从集合中取得元素后就不用再用强转
###7.什么是for each循环,它可以循环那些数据类型
答案
通过对象拿到集合里的值 可以用来循环集合和数组
###8.写一个for each循环看看
for(Object object : list){
System.out.println(object);
}
###9. 什么是强转怎么写的,有什么优缺点,一般要多用还是少用,为什么?
一般在继承的基础上用. Person person=new Student(); Student student=(Student)person; 把运行期的强转为编译期的. 编译期不会出错.运行期容易出错.所以一般少用
###10.HashMap和Hashtable有什么区别,一 般情况下常用那个?
HashMap的键-值都可以为空(null)
Hashtable的键-值都不可以为空(null),线程安全 ,
一般情况下用HashMap
###11.Hashtable名字为什么没有驼峰命名
Hashtable的由来比较古老,当时还没有命名规范
###12.Collections和Collection有什么区别
Collections是一个工具类,可以直接调用List和Set的方法
Collection是一个接口,是List和Set集合的父接口
###13.写出Collections的6个方法,并详细解释
sort():对集合进行排序
shuffle():打乱集合中的元素顺序
addAll():将一个集合添加到另一个集合中
max():判断集合中的最大值
min():判断集合中的最小值
copy():将一个集合中的元素复制到另一个集合中去
fill():将一个集合中的元素全部替换成指定的元素
###14.Arrays类是做什么的,写出它的常用6个方法
Arrays是数组的一个工具类
sort():对数组进行排序
binarySearch():搜索数组指定元素的下标
copyOf():复制数组中指定长度的元素
deepEquals():比较两个数组的深度
fill():把数组中的所有元素替换成指定元素
equals():比较指定两个数组的元素是否相等
hashcode():将指定数组的指定范围复制到一个新数组。
###15.比较下集合和数组的优缺点
集合是多个对象的容器,可以将不同数据类型的多个对象组织在一起
数组类型是有相同数据类型的数据集合,数组是很多语言都支持的底层数据结构,性能上是最高的
###16.如何对一个对象排序,有几种方法
把对象放入List集合中,用Collections工具类调用sort()方法进行排序,
但是这个类必须实现Compareble接口才行
把对象放在Set集合中,用TreeSet()实现类对集合直接排序
###17.在集合里面怎么判断两个对象相等,要实现什么方法
重写equals方法
###18.怎么样把集合转化成数组,或把数组转化为集合
把集合转为数组,可以用toArray()方法
把数组转为集合时, for each循坏,先把数组中的元素转为String型,再放到集合里
###19.分别写出List,Set,Map里面的5个常用方法
List:
add()新增 clear()清除 contains()判断是否包含某个元素
indexOf()一个元素在集合中首次出现的位置
set()把指定下标的元素替换成自定义元素
Set:
add()新增 clear()清除 contains()判断是否包含某个元素
remove():把集合中指定下标的元素删掉 size():返回集合长度 Map: containsKey()是否包含指定key containsValue()是否包含指定value keySet()返回所有key put()添加元素 Remove()移除
###20.HashMap与LinkedHashMap,和TreeMap的区别。
共同点:HashMap,LinkedHashMap,TreeMap都属于Map的实现类.
不同点: 1.HashMap里面存入的键值对在取出的时候是随机的,
TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现.
###21.HashMap怎么实现有序
可以转化放入TreeMap里面,或者把key放入LinkedList里面。
###22.在List里面怎么去掉重复的数?
通过把List里面的数据放入HashSet可以去除重复
###23.在List里面有几种排序?
答:两种:实现Comparable<Article>接口,实现里面的CompareTo方法进行排序。 还有调用Collections.sort()方法排序!
###24.说一下链表跟数组的区别
链表:用一组任意储存单元存放线性表的数据元素,并且通过指针链相接结点的序列称为链表。
是一种常见的数据组织形式,它采用了动态分配内存的形式实现。
需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放, 不会造成内存空间的浪费。不靠数组实现,没有下标。
数组必须事先定义固定的长度,不能适应数据动态增减的情况。当数据增加时,
可能超出原先定义的元素个数;当数据减少时,造成数据浪费。在使用的时候还要数组初始化,
注意数组的下标越界。
###25.HashSet的理解
HashSet实现了Set接口,HashSet不保证集合的迭代顺序,允许使用Null元素。
HashSet的底层使用了HashMap,使用HashMap实列进行对集合的元素进行操作,然后再封装成HashSet的操作。
###26.什么类可以实现有序存储(除ArrayList以外)?
一种按照插入的顺序排序,譬如LinkedList,LiskedHashMap,
另外一种是插入后重新排序TreeSet,TreeMap
###27.HashMap和ArrayList是不是都是线程不安全的?
ArrayList是线程不安全的;HashMap是线程不安全的; 还有我们常见的一些JAVA集合都是线程不安全,这样做是为了提高性能
在JDK5以后提供了线程安全的并发包java.util.concurrent并发包,譬如里面的类CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap等
###28.HashMap和TreeMap的区别?
TreeMap实现Map接口,能够把它保存的记录根据键排序,默认是按键值的升序排序, 也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。 hashMap最多只允许一条记录的键为Null,允许多条记录的值为Null,hashMap不支持线程的同步,
即同一时刻可以有多个线程同时写hashMap.可能会导致数据的不一致。 TreeMap不仅可以保持顺序,而且可以用与排序。
HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,
如果你需要得到一个有序的结果你就使用TreeMap.
###29.ArrayList集合加入1万条数据,应该怎么提高效率
因为ArrayList的底层是数组实现,并且数组的默认值是10,如果插入10000条要不断的扩容,耗费时间,
所以我们调用ArrayList的指定容量的构造器方法ArrayList(int size) 就可以实现不扩容,就提高了性能
###30.你知道HashMap底层是怎么实现的吗?
简单的说是一个数组,因为数组的性能比较好,数组里面放的是Entry类,HashMap类有一个叫做Entry的
内部类。这个Entry类包含了key-value作为实例变量。当存储或者获取对象的时候, 就根据哈希算法,对象的hashCode调用得到这个下标,以便实现快速访问.
###31.怎样遍历List Set,Map
List 和Set可以通过一般for循环,迭代器循环,或者增强型循环来遍历, 其中一般for循环性能最快,
迭代器循环可以判断和得到下一个值,for each增强型循环扩展性强,但性能稍低.
Map循环可以通过keySet得到Key的Set集合,然后遍历这个集合就可以得到所有的Value
###32.Set为什么是不允许重复的。
set的实现机制不允许重复的
###33.ArrayList为什么要用for循环,为什么要用迭代器,又有什么好处。
for循环通过对象拿到集合里的值
迭代器可以实现Collection接口的方法,可以一个一个地获取集合中的元素 在遍历集合时 可判断是否有下一个元素
###34.你对与队 列了解多少你是怎么用的。
答:队列是一种数据结构,FIFO 先进先出有点类似与栈,只是在队列中第一个插入的数据项也会被最先删除,
队列的两个基本操作:
一个是插入一个数据项,即把一个数据项放入队尾
另一个是移除一个数据项,即移除队头的数据项.
###35.如果我要存取很多的数据,但是又不需要重复的,要选择什么容器,说一下为什么使用它,它是哪个的子类?
答:Set容器,它是不允许重复的,它是collection的子类
###36.哪种方法可以得到Map的Key?
keySet()方法 面向对象的面试题部分
###1) 面向对象的优点?
答案
易扩展 易维护 面向对象是相对面向过程的
###2) 如何声名一个静态块?
答案
在类中方法外声明 static关键字+代码块
###3) 接口与抽象类的区别?
答案
类是单继承的,但是可以实现多个接口
抽象类里的方法可以有实例方法也可以有抽象方法
接口里面只能有抽象方法。
!!!注意:关注一个事物的本质的时候,用抽象类;当你关注一个行为的时候,用接口。
###4) 用于类和接口的关键字
答案 定义类的是class,如类文件的开头都是:public class 类名{ } 定义接口的是interface,如public interface 接口名{ } 用于实现接口的是implements。
###5) 如何创建数组?
答案 数组是new出来的 或者直接可以声明, 举个例子 String[] array={"1","2"}; 或者String[] array=new String[10];
###6) 如何创建一个构造方法对象的格式?要注意哪些?
答案
构造器是为了创建一个类的实例Platypus p1 = new Platypus();
注意:方法名与类名一致
###7) 类的组成 和执行顺序
答案
属性
方法
静态块
非静态块
执行顺序: 先父类,后子类,静态块 静态字段 非静态块 非静态字段 构造器 方法
###8) main方法必须被什么修饰?
答案 方法名必须是main 是被public static void 修饰 传入String数组
###9) 如何理解面向对象
答案
世间万物皆对象,对象有具体的的实例化,任何方法或者属性都要写在对象(类)里面
###10) 构造方法可否能被重写:
答案 构造方法不能被继承,因此不能重写,但能被重载。
###11) 静态方法中能有静态的变量吗?
答案
不能 静态变量是类变量 不可以定义在方法里
###12) String与StringBuffer的区别:
答案
String 是不可变的 可以直接使用它的方法 用来创建字符串
而 Stringbuffer无论怎么修改都是一个对象
如果在字符串改变,或者迭代改变的情况下Stringbuffer比String运行快
###13) 重载(overloading)与重写(override)的区别:
答案
1.重载发生在同一个类。 重写发生在父子类中。
2.重载参数签名不同,而重写相同且返回类型相同。
3.方法名相同,重写override是父类与子类之间多态性的一种表现,重载overload是一个类中多态性的一种表现。
###14) (= =)与equals()的区别:
答案
如果是基本类型比较,那么只能用==来比较,不能用 equals 对象间的比较使用equals ==比较的是对象中的地址 而equals比较的对象 的内容
###15) Abstract与interface的区别:
答案
Abstract是用来声明抽象类抽象方法,而interface是接口 抽象类可以有
变量,有方法的实现,接口内只能有常量和抽象方法
###16) StringBuilder和StringBuffer的区别:
答案 StringBuilder比StringBuffer更加快捷,但是StringBuilder线程不安全
###17) JRE,JDK,JVM分别是什么,它们有什么联系:
答案
jre 运行时环境,jvm虚拟机 jdk java开发工具包 jvm是jre的一部分
###18) 普通类继承抽象类为什么一定要重写其中的抽象方法?
答案
必须要实现的,也就是要重写,如果不实现,子类无法对象实例化。
###19) 什么是拆箱和装箱?
答案
装箱就是将基本类型转换为对象类型
拆箱就是将对象类型转换为基本类型。
###20) 继承与实现的区别?
答案
继承针对类,实现针对接口。
单继承、多实现的。
实现要重写接口里面的方法,而继承不需要。
###21) Abstract为什么不能与,private,final,同时使用?
答案
抽象方法需要被子类重写 所以不能够用private final修饰
###24) 继承最大好处?
答案 可以对父类的方法进行重用,节省时间
###25) 写出String类常见的5个方法,并详细解释?
答案 indexOf()返回指定字符串在该字符串出现的序列 startsWith()判断该字符串是否以指定字符开始 concat() 将指定字符串连接在该字符串的结尾 length()返回字符串的长度 substring返回该字符串从索引开始 结束于字符串末尾 或者指定索引的一个子字符串
###27) 普通方法的方法名可以与类名一致吗?
答案
可以,构造器就是
###28) 在什么情况下局部变量会覆盖全局变量?
答案
当局部变量名与全局变量名相同 类型相同
###29) static 修饰的方法可否支持多态?
答案
不支持多态,如果父类声明一个对象,子类实现这边变量,那么调用static修饰的时候会调用父类的,而不是子类的.
除了工具类。用static修饰的变量会发生一处改变则全部改变。
###30) 使用数组前应该注意的什么?
答案 数组下标是否越界 对数组进行初始化
###31) 如果一个类继承了父类,父类里有一个静态块,子类里也有个静态块 ,对子类进行实例,父类的静态块先执行还是子类的先执行?
答案
父类的静态块先于子类的静态块的执行
###32) Java语言最大的特点?
答案 跨平台性(一次编译,多次执行)
###33) 请你说说byte short char之间可以互相转换吗?为什么?
答案
可以通过强转
###34) 请说说引用和对象?
答案
对象和引用是分不开的,对象生成一个地址,引用则指向了这个地址
A a=new A();
a为引用 等号右边的是对象
###35) 怎样将一个String添加到另一个String的后面?
答案
(StringBuffer ,StringBuilder)的append方法
concat
###36) 有几种数据类型?
答案
JAVA数据类型分基本数据类型和引用对象类型。
###37) 传参有几种类型?有几种特殊类型?
答案
基本数据类型 引用对象类型
###38) 什么是匿名类,有什么好处
答案 匿名类没有名字的类 ,封装性好,比较安全用了一次便可以丢弃 接口不能new,但语法中的匿名类却和new一个接口的的语法结构很相似。
###39) jar是什么格式的文件,有什么好处
答案
它允许将许多class文件组合成一个压缩文件,方便管理class文件
###40) java和javac,javaw各有什么作用
答案 java:运行程序 javac:编译java文件至class文件 javaw: 不需要打开dos窗口就可以运行