软通动力面试题集.docx
《软通动力面试题集.docx》由会员分享,可在线阅读,更多相关《软通动力面试题集.docx(13页珍藏版)》请在冰豆网上搜索。
![软通动力面试题集.docx](https://file1.bdocx.com/fileroot1/2023-2/22/b9e21f12-3d28-41bf-91b9-577fc160fd17/b9e21f12-3d28-41bf-91b9-577fc160fd171.gif)
软通动力面试题集
-CAL-FENGHAI.-(YICAI)-CompanyOne1-CAL-本页仅作为文档封面,使用请直接删除
软通动力面试题集(总10页)
1.Struts的运行机制:
Web应用初始化时,控制器加载分析配置文件(struts-config.xml),获得ActionMapping,配置应用程序
1.ActionServlet接收用户请求
2.ActionServlet根据应用程序配置填充ActionForm
3.ActionServlet根据ActionMapping调用Action的execute方法
4.Action调用业务逻辑类(Model),在简单的程序中也可以在Action的execute方法中执行业务处理
5.业务逻辑类将处理结果返回给Action,Action将处理结果保存在适当的作用域范围之内(session、request等)
6.Action的execute方法向ActionServlet返回ActionForward指明下一步调用的Action或JSP视图
7.JSP视图取得保存在作用域之中的业务处理结果并负责显示HTML页面
大家最好用自己的话来总结出来!
2.常用的集合以及介绍:
(应重点复习)
常用集合set、map、list
set、map是collection接口的子接口
set接口的实现类:
HashSet、TreeSet
List接口的实现类:
ArrayList、linkedList
Map接口的实现类:
HashMap、TreeMap、Hashtable。
ArrayList和linkedList的区别(略)
HashMap、HashTable区别(略)
3.遍历map的方法:
使用Map接口提供的方法entrySet();
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.Map;
publicclassMapTest{
publicstaticvoidmain(String[]args){
Map
map.put("a","中国");
map.put("b","ABC");
map.put("c",1000);
/*for(Iterator>it=map.entrySet().iterator();it.hasNext();){
Entryentry=it.next();
System.out.println(entry);
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}*/
for(Iteratorit=map.keySet().iterator();it.hasNext();){
Objectkey=it.next();
System.out.println(key);
Objectvalue=map.get(key);
System.out.println(value);
}
}
}
4.字符串相加用“+”和append()的区别
用“+“号每加一次创建一个对象,比如:
字符串常量池中有原字符串:
”abc”
之后要加”de”,加过之后内存中会有”abc”、”abcde”两个字符串!
但”abc”会失去原本指向它的引用变成垃圾回收机制回收的对象!
Append()只是将字符串追加到原字符串的尾部,始终都是一个对象!
5.垃圾回收机制原理:
当一个对象赋值为null或者没有指引指向他的时候,那么这个对象就符合垃圾回收机制回收的范围,java虚拟机会不定时的对垃圾进行回收,回收对象之前会调用被回收对象的finalize()方法!
注意Java虚拟机何时来回收垃圾不确定!
6.如何实现多线程:
继承Thread类或者实现Runnable接口
那种好处多:
因为java是单继承所以一般会采用实现Runnable接口
两种实现方式的区别:
继承Thread类可以创建本类对象直接调用start()方法运行线程(也就是说本类对象就是一个线程个人理解)
实现Runnable接口必须用Threadthread=newThread()来获得一个线程!
7.代码的重构:
代码的输入、输出不变,只是改变中间实现代码!
8.MVC思想
是model、view、controller的缩写,model代表业务逻辑(通过javabean、EJB组建实现)、view是应用表示面(由jsp页面产生)、controller是提供应用处理过程的控制(一般是一个servlet)。
通过这种设计模式把应用逻辑、处理过程、显示逻辑分成不同的组件实现,可提高组件的交互和重用性。
9.struts1和struts2的区别(见最后一页)
10:
讲解一下Spring
11:
hibernate是怎么工作的
原理:
1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Sesssion
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory
12:
hibernate的一级和二级缓存是什么
Hibernate提供了两级缓存,第一级是Session的缓存。
由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。
第一级缓存是必需的,Session的缓存是内置的,不能被卸载。
第二级缓存是一个可插拔的的缓存插件,它是由SessionFactory负责管理。
由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此第二级缓存是进程范围的缓存,第二级缓存是可选的,可以在每个类或每个集合的粒度上配置第二级缓存。
当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
13:
hibernate的连接池
14:
怎么接收dwr返回的数组或集合
15:
怎么读取一个文本文件(流)
16:
javascript中这么去掉字符串的空格
17:
用ajax的时候怎么运行后台返回的javascript代码
18:
存储过程是用来干什么的
19:
怎么终止一个线程
抛出异常和等待run()方法结束。
20.悲观锁和乐观锁?
21.Oracle中实现序列用什么关键字?
Sequence
22.数据库中有哪些函数?
23.解析XML的方法?
DOM解析和SAX解析
DOM:
处理大型文件时其性能下降的非常厉害。
这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问
SAX:
不现于DOM,SAX是事件驱动型的XML解析方式。
它顺序读取XML文件,不需要一次全部装载整个文件。
当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问
24.用递归法求n的阶乘?
25.Orcale中左右连接用“+”怎样连接
Oracle数据库左连接“+”在右边,右连接“+”在左边。
26.Equals方法和==的区别。
equals()方法是用来比较两个字符串值是否相等而==是用来比较对象引用是否相等(也就是是否为同一个对象)
27.线程池的问题。
线程池就像数据库连接池一样,是一个对象池。
所有的对象池都有一个共同的目的,那就是为了提高对象的使用率,从而达到提高程序效率的目的。
比如对于Servlet,它被设计为多线程的(如果它是单线程的,你就可以想象,当1000个人同时请求一个网页时,在第一个人获得请求结果之前,其它999个人都在郁闷地等待),如果为每个用户的每一次请求都创建一个新的线程对象来运行的话,系统就会在创建线程和销毁线程上耗费很大的开销,大大降低系统的效率。
因此,Servlet多线程机制背后有一个线程池在支持,线程池在初始化初期就创建了一定数量的线程对象,通过提高对这些对象的利用率,避免高频率地创建对象,从而达到提高程序的效率的目的。
28.struts1的一些配置问题web.xml和struts-config.xml中的一些配置。
29.JavaScript的一个操作流程。
30.一些简单的sql语句,比如说现在数据库中有10记录,要求你写一个语句保留第二条和第五条记录,将其他的记录全部删除。
31.存储过程、触发器
32.Throw和Throws的区别
throw语句用来明确地抛出一个“异常”。
throws用来标明一个成员函数可能抛出的各种“异常”
33.在异常捕获时try,catch,finally中可不可以没有catch语句块。
可以,但try块不能单独执行,后面必须跟catch或者finally、或者两者都有。
34.面向对象有哪些特征,你如何理解?
抽象、继承、封装、多态
35.什么是多线程线程的状态有那几个创建线程的方法启动线程用什么方法线程同步包括的方法
答:
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。
线程是在同一时间需要完成多项任务的时候实现的。
线程状态有:
就绪、运行、挂起、结束。
启动线程用start()方法。
线程同步包含的方法:
线程睡眠sleep()、线程让步:
yield()、等待其他线程结束join()等。
36.String、stringBuffer、StringBuilder的区别
37.垃圾回收机制的原理final,finally,finalize的区别
38.内存的泄露以及溢出是怎么回事?
内存溢出就是你要求分配的java虚拟机内存超出了系统能给你的,系统不能满足需求,于是产生溢出。
内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问,该块已分配出来的内存也无法再使用,随着服务器内存的不断消耗,而无法使用的内存越来越多,系统也不能再次将它分配给需要的程序,产生泄露。
一直下去,程序也逐渐无内存使用,就会溢出。
39.数据库连接池的原理?
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。
预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。
更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。
40.数组和链表的区别栈以及队列的特点以及区别
数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。
而在实际应用中,用户使用数组之前有时无法准确确定数组的大小,只能将数组定义成足够大小,这样数组中有些空间可能不被使用,从而造成内存空间的浪费。
链表是一种常见的数据组织形式,它采用动态分配内存的形式实现。
需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。
数组中的数据在内存中的按顺序存储的,而链表是随机存储的!
要访问数组中的元素可以按下标索引来访问,速度比较快,如果对他进行插入操作的话,就得移动很多元素,所以对数组进行插入操作效率很低!
由于连表是随机存储的,链表在插入,删除操作上有很高的效率(相对数组),如果要访问链表中的某个元素的话,那就得从链表的头逐个遍历,直到找到所需要的元素为止,所以链表的随机访问的效率就比数组要低
41.递归的算法?
比如阶乘和fif数列的实现。
常用的一些算法,如冒泡,二分查找,折半查找,选择排序等等
42.java中多态是如何实现的重载和覆盖的区别注意代码的重构不是重载!
43.接口和抽象类的区别?
44.jsp和servlet的区别jsp的内置对象jsp的标准动作jsp的页面元素有哪些四种会话跟踪技术是什么servlet是不是线程安全的servlet生命周期动态include和静态include区别重定向和请求转发的区别servlet中如何从页面获取参数jsp的四种作用于范围是什么
Jsp是Servlet的技术扩展,本质上是Servlet的简易方式,Jsp侧重于视图而Servlet侧重于控制业务逻辑。
Jsp内置对象九个:
request、response、out、session、application、pagecantext、page、config、Exception
会话跟踪技术:
session、cookie、重写url、隐藏表单域
Jsp标准动作:
usebean、setProperty、getProperty、forward、include
不是,servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,所以你的项目中如果只有一个servlet,那么web容器就只会创建一个实例
通过request.getParameter()来获取页面参数
作用域范围由小到大:
page、request、session、application
47.jstl的包括哪些标签库如何实现迭代
包括:
核心标签(包括通用标签、条件标签、迭代标签)、I18N与国际化标签、SQL标签、XML标签、function标签
使用迭代标签forEach来遍历
48.过滤器的原理过滤器的生命周期监听器的原理
49.hibernate的映射原理hibernate的查询方式有哪些关联关系的映射怎么理解?
三种查询方式:
HQL、条件查询、原生SQL查询,命名SQL、
50.oracle和sqlserver区别如何优化oracle数据库oracle的一些常用系统函数
Oracle跨平台,SqlServer只能运行在window平台上。
51.为什么要用索引索引的分类视图是什么
答:
提高查询的执行速度,强制实施数据库的唯一性,提高表与表之间的链接速度。
聚集索引和非聚集索引(SQLServer)
标准索引、组合索引、唯一索引、反向索引、位图索引(Oracle)
视图是一张虚拟表,该表提供对一个或多个表中列的访问,它是从一个或多个表中派生出来的对象。
52.存储过程你是怎么理解的如何实现
答:
我感觉存储过程就像java中的方法一样,输入参数就是方法传的参数,而输出参数就像方法的返回值一样。
Java中通过CallAbleStatement接口实现了对存储过程的调用。
53.触发器、游标的一些基本知识!
54.oracle数据库的一些特殊之处如簇、序列等如何理解
簇是用来存储表的方法,这些表互相联系密切并通常相连在磁盘的相同区域上,共享同一列的一组表,用于检索时提高效率
oracle中没有sqlserver中的标识列,只能通过创建序列来实现这一功能。
55.权限的问题如何解决?
56.Ajax的javaScript代码如何实现Ajax的一些框架
57.单例模式和工厂模式如何实现?
单列模式:
(饿汉式)
publicclassCar{
privateCar(){}//私有的构造方法使别的类不能通过new来创建本类是类只能通过我们下面的方法来获得对象
privatestaticCarbaoma=newCar();//静态类类型的变量保证对象只有一个
publicstaticCargetCar(){//注意方法定义为静态的再别的类中就可以用本类类名来调用此方法得到本类对象
returnbaoma;
}
}
单列模式使本类对象只有一个,只能通过方法调用来获得对象,而且无论你掉用多少次方法,得到的都是一个实例。
58.类的加载顺序
父类静态块---->子类的静态块---->程序的入口(main)---->父类的初始化块---->父类的构造方法---->子类的初始化块------>子类的构造方法
59.如何处理数据库差异
比如用户刚开始使要求用SqlServer之后需求改变要使用Oracle:
a)使用hibernate只需要改变方言即可
b)使用sql标准语句
60.Session和cookie的区别
61.一个抽象类是否可以继承一个普通类
可以,但被继承的类必须要有明确的构造方法
62.什么时候用接口抽象类
当你写一个类时,可能面临部分代码可能会发生变化 你可以把这些代码封装成(接口或抽象类或基础类中的)一个或多个方法 1、如果所有抽象出的方法不确定性很高,就定义为接口来封装,所有方法抽象,由实现类全部实现 2、如果部分抽象出的方法不确定性很高,就定义为抽象类来封装,能确定的方法实现,不确定的方法抽象,由实现类部分实现,部分重写(不变就不重写啦) 3、如果所有抽象出的方法确定性很高,就定义为基础类,所有方法提供基本实现,由子类去重写(不变就不用写子类啦)
63.函数和存储过程的区别
1. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
2. 对于存储过程来说可以返回参数,而函数只能返回值或者表对象。
3. 存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。
4. 当存储过程和函数被执行的时候,SQLManager会到procedurecache中去取相应的查询语句,如果在procedurecache里没有相应的查询语句,SQLManager就会对存储过程和函数进行编译。
Procedurecache中保存的是执行计划(executionplan),当编译好之后就执行procedurecache中的executionplan,之后SQLSERVER会根据每个executionplan的实际情况来考虑是否要在cache中保存这个plan,评判的标准一个是这个executionplan可能被使用的频率;其次是生成这个plan的代价,也就是编译的耗时。
保存在cache中的plan在下次执行时就不用再编译了。
Struts1和struts2比较:
Action类Struts1要求Action类要扩展自一个抽象基类。
Struts1的一个共有的问题是面向抽象类编程而不是面向接口编程。
Struts2的Action类实现了一个Action接口,连同其他接口一起实现可选择和自定义的服务。
Struts2提供一个名叫ActionSupport的基类实现一般使用的接口。
虽然,Action接口不是必须的。
任何使用execute方法的POJO对象可以被当作Struts2的Action对象使用。
程模型Struts1Action类是单例类,因只有一个示例控制所有的请求。
单例类策略造成了一定的限制且给开发带来了额外的烦恼。
Action资源必须是程安全或者同步的。
Struts2Action对象每一个请求都实例化对象,所以没有程安全的问题。
(实践中,servlet容器生许多丢的对象对于每一个请求,多于一个的对象并不影响垃圾收集)Servlet依赖Struts1的Action类依赖于servletAPI以HttpServletRequest和HttpServletResponse作参数传给execute方法当Action被调用时。
Struts2的Action不和容器有关。
Servlet上下文被表现简单的Maps,允许Action被独立的测试。
Struts2的Action可以访问最初的请求和相应,如果需要的话。
然而,其他的架构元素少或者排除直接访问HttpServletRequest或者HttpServletResponse的需要。
易测性测试Struts1的主要障碍是execute方法暴露了ServletAPI。
第三方的扩展,Struts测试用例,提供Struts1的集合对象。
Struts2的Action可以通过实例化Action测试,设置属性,然后调用方法。
依赖注入的支持也是测试变得更简单。
接受输入Struts1使用ActionForm对象捕获输入。
象Action一样,所有的ActionForm必须扩展基类。
因其他的JavaBean不能作ActionForm使用,开发者经常创建多余的类捕获输入。
DynaBeans可以被用来作替代ActionForm的类创建。
但是开发者可以重新描述已经存在的JavaBean。
Struts2Action属性作输入属性,排除第二个输入对象的需要。
输入属性可能有丰富的对象类型这些类型有他们自己的属性。
Action的属性可以通过标签库访问。
Struts2也支持ActionForm形式。
丰富的对象类型,包含业务或者域对象,可以被当作输入或者输出对象使用。
馍型驱动特性简化标签对POJO输入对象的引用。
表达式语言Struts1整和JSTL,所以它使用JSTL的表达式语言。
表达式语言有基本的图形对象移动,但是相对很弱的集合和被索引的属性支持。
Struts2使用JSTL,但是框架也支持更大和更灵活的表达式,叫做“对象图形符号语言”(OGNL)。
将值绑定要视图上Struts1使用标准JSP机制来绑定对象到页面上下文。
Struts2使用“ValueStack”技术了标签库可以不用链接你的视图到对象的表现类型访问值。
ValueStack策略允许重用视图。
类型转换Struts1的ActionForm属性经常都是String的。
Struts1使用Commons-Beanutils类型转换。
转换每一个类,不是每一个实例配置。
Struts2使用OGNL类型转换。
框架包含转换器基本的和共同的对象类型和原始类型。
验证Struts1支持手动验证凭借ActionForm的validate方法,或者通过扩展的公用验证器。
类可以有不同的验证上下文未相同的类,但是不能不能包括验证子对象。
Struts2支持手动验证凭借validate方法和XWork验证框架。
Xwork验证框架支持一连串的验证子属性使用的验证了属性类的类型和严正上下文而定义。
Action执行的控制Struts1支持独立的请求处理器对于每一个模型,但是所有在模型中的Action必须共享同一个生命周期。
Struts2支持在每一个Action基础上凭借拦截栈创建不同的生命周期。
自定义栈可以被创建且使用不同的所需的Action