2023年11月28日发(作者:)
JAVA面试题大全(含答案)
1. J2EE是什么?它包括哪些技术?
解答:从整体上讲,J2EE是使用Java技术开发企业级应用的工业标
准,它是Java技术不断适应和促进企业级应用过程中的产物。适用于企
业级应用的J2EE,提供一个平台独立的、可移植的、多用户的、安全的和
基于标准的企业级平台,从而简化企业应用的开发、管理和部署。J2EE是
一个标准,而不是一个现成的产品。
主要包括以下这些技术:
1) Servlet Servlet是Java平台上的CGI技术。Servlet在服务器端运
行,动态地生成Web页面。与传统的CGI和许多其它类似CGI的技术相
比,Java Servlet具有更高的效率并更容易使用。对于Servlet,重复的请
求不会导致同一程序的多次转载,它是依靠线程的方式来支持并发访问
的。 2)JSP JSP(Java Server Page)是一种实现普通静态HTML和动态页面
输出混合编码的技术。从这一点来看,非常类似Microsoft ASP、PHP等
技术。借助形式上的内容和外观表现的分离,Web页面制作的任务可以
比较方便地划分给页面设计人员和程序员,并方便地通过JSP来合成。在
运行时态,JSP将会被首先转换成Servlet,并以Servlet的形态编译运
行,因此它的效率和功能与Servlet相比没有差别,一样具有很高的效
率。 3) EJB EJB定义了一组可重用的组件:Enterprise Beans。开发人员可
以利用这些组件,像搭积木一样建立分布式应用。 4)JDBC
JDBC(Java Database Connectivity,Java数据库连接)API是一个标准
SQL(Structured Query Language,结构化查询语言)数据库访问接口,它
使数据库开发人员能够用标准Java API编写数据库应用程序。JDBC API
主要用来连接数据库和直接调用SQL命令执行各种SQL语句。利用JDBC
API可以执行一般的SQL语句、动态SQL语句及带IN和OUT参数的存储
过程。Java中的JDBC相当于Microsoft平台中的ODBC(Open Database
Connectivity)。
2.测试生命周期、测试过程分为几个阶段,以及各阶段的含义?
解答:软件测试生命周期一般包括6个阶段:1)计划 2)分析,3)
设计,4)构建,5)测试周期,6)最后测试和实施,
1) 计划:产品定义阶段
2). 分析:外部文档阶段
3). 设计:文档架构阶段
4). 构建:单元测试阶段
5). 测试周期:错误修正,重复系统测试阶段
6). 最后的测试和实施:代码冻结阶段
3.您做系统设计用何种工具?
解答:Visio, rational rose,power designer等 4. 什么是Web容器?
解答:容器就是一种服务程序,在服务器一个端口就有一个提供相应
服务的程序,而这个程序就是处理从客户端发出的请求,如JAVA中的
Tomcat容器,ASP的IIS或PWS都是这样的容器。
5. 运行时异常与一般异常有何异同?
解答:异常表示程序运行过程中可能出现的非正常状态,运行时异常
表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编
译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须
声明抛出未被捕获的运行时异常。
6. Hibernate中:不看数据库,不看XML文件,不看查询语句,怎么
样能
知道表结构?
解答:可以看与XML文件对应的域模型。
7.目前几种主流数据库软件的应用特点、适用范围各是什么?
解答:国际国内的主导关系型数据库管理系统有SQL Server、
ORACLE、SYBASE、*****X和 DB2。本文从性能,可伸缩性和并行性,安
全性,操作简便,使用风险,开放性,易维护性和价格,数据库二次开发
方面比较了SQL Server,Oracle、SYBASE、DB2、*****X 数据库:
1)性能
SQL Server:老版本多用户时性能不佳,新版本的性能有了明显的改
善,各项处理能力都有了明显的提高。保持了多项TPC-C(TPC-C值被广
泛用于衡量C/S环境下,由服务器和客户端构筑的整体系统的性能,它由事
物处理性能委员会(TPC,Transaction Processing Corp)制定,TPC为非赢
利性国际组织。)纪录。
Oracle :性能最高, 保持Windows NT下的TPC-C的世界记录。
SYBASE :性能较高,支持Sun、IBM、HP、Compaq和Veritas的集群设
备的特性,实现高可用性。适应于安全性要求极高的系统。 DB2 :适用
于数据仓库和在线事物处理,性能较高。 客户端支持及应用模式。
*****X :性能较高,支持集群,实现高可用性。适应于安全性要求极高
的系统,尤其是银行,证券系统的应用。 2)可伸缩性,并行性 SQL
Server :以前版本SQL Server并行实施和共存模型并不成熟。很难处理
大量的用户数和数据卷。伸缩性有限。新版本性能有了较大的改善,在
Microsoft Advanced Servers上有突出的表现,超过了他的主要竞争对
手。
Oracle :平行服务器通过使一组结点共享同一簇中的工作来扩展
Window NT的能力,提供高可用性和高伸缩性的簇的解决方案。如果
Windows NT不能满足需要, 用户可以把数据库移到UNIX中,具有很好
的伸缩性。 SYBASE :新版本具有较好的并行性,速度快,对巨量
数据无明显影响,但是技术实现复杂,需要程序支持,伸缩性有限。
DB2 :DB2具有很好的并行性。DB2把数据库管理扩充到了并行的、多
节点的环境。数据库分区是数据库的一部分,包含自己的数据、索引、配
置文件、和事务日志。数据库分区有时被称为节点或数据库节点,伸缩性
有限。 *****X :采用单进程多线程的技术,具有较好的并行性。但是仅
运行于UNIX平台,伸缩性有限。 3)安全性 SQL server :Microsoft
Advanced Server 获得最高安全认证,服务器平台的稳定性是数据库的稳
定性的基础,新版本的SQL的安全性有了极大的提高。 Oracle:获得最
高认证级别的ISO标准认证。 SYBASE :通过Sun公司J2EE认证测试,
获得最高认证级别的ISO标准认证。 DB2 :获得最高认证级别的ISO标
准认证。 *****X :获得最高认证级别的ISO标准认证。 4)操作简便
SQL Server :操作简单,采用图形界面。管理也很方便,而且编程接口特
别友好(它的SQL-DMO让编程变得非常方便!) ,从易维护性和价格上
SQL Server明显占有优势。 Oracle :较复杂, 同时提供GUI和命令行,
在Windows NT和Unix, Linux 下操作相同。对数据库管理人员要求较
高。 SYBASE :复杂,使用命令行操作,对数据库管理人员要求较高。
DB2 :操作简单,同时提供GUI和命令行,在Windows NT和Unix下操作
相同。 *****X :使用和管理复杂,命令行操作。对数据库管理人员要求
较高。 5)使用风险 SQL Server :完全重写的代码,性能和兼容性有了
较大的提高,与Oracle,DB2的性能差距明显减小。该产品的出台经历了
长期的测试,为产品的安全和稳定进行了全面的检测,安全稳定性有了明
显的提高。 Oracle :长时间的开发经验,完全向下兼容,可以安全的进
行数据库的升级,在企业,政府中得到广泛的应用。并且如果在WINNT
上无法满足数据的要求,可以安全的把数据转移到UNIX上来。
SYBASE :开发时间较长,升级较复杂,稳定性较好,数据安全有保
障。风险小。在安全要求极高的银行,证券行业中得到了广泛的应用。
DB2 :在巨型企业得到广泛的应用,向下兼容性好。风险小。 *****X :
开发时间较长,升级较复杂,稳定性较好,数据安全有保障。风险小。在
安全要求极高的银行,证券行业中得到了广泛的应用。 6)开放性 SQL
Server:只能在Windows 上运行,C/S结构,只支持Windows客户,可
以用ADO,DAO,OLEDB,ODBC连接。Windows9X系列产品是偏重于桌面
应用,NT server适合各种大中小型企业。 操作系统的稳定对数据库是十
分重要的。Windows平台的可靠性,安全性经过了最高级别的C2认证
的。在处理大数据量的关键业务时提供了较好的性能。 Oracle :能在所
有主流平台上运行(包括 Windows)。完全支持所有的工业标准。采用完
全开放策略。多层次网络计算,支持多种工业标准,可以用
ODBC,JDBC,OCI等网络客户连接。可以使客户选择最适合的解决方案。
对开发商全力支持。 SYBASE :能在所有主流平台上运行,在银行业中
得到了广泛的应用。 DB2 :有较好的开放性,最适于海量数据。跨平
台,多层结构,支持ODBC,JDBC等客户。在大型的国际企业中得到最为
广泛的应用,在全球的500家最大的企业中,大部分采用DB2数据库服务
器。 *****IX :仅运行在UNIX平台,包括SUNOS、HPUX、 *****/1。在
银行中得到广泛的应用。 7)易维护性和价格 SQL Server :从易维护性和
价格上SQL Server明显占有优势。基于Microsoft的一贯风格,SQL
Server的图形管理界面带来了明显的易用性, 微软的数据库管理员培训
进行的比较充分,可以轻松的找到很好的数据库管理员,数据库管理费用
比较低,SQL Server的价格也是很低的,但是在License的购买上会抬高
价格。总体来说SQL Server的价格在商用数据库中是最低的。 Oracle :从
易维护性和价格上来说Oracle的价格是比较高的,管理比较复杂,由于
Oracle的应用很广泛,经验丰富的Oracle数据库管理员可以比较容易的
找到,从而实现Oracle的良好管理。因此Oracle的性能价格比在商用数
据库中是最好的。 SYBASE :SYBASE的价格是比较低的,但是SYBASE的
在企业和政府中的应用较少,很难找到经验丰富的管理
员,运行管理费用较高。
DB2 :价格高, 管理员少,在中国的应用较少,运行管理费用都很
高,适用于大型企业的数据仓库应用。 *****X :价格在这些系统中居于中
间,与SYBASE一样,在企业和政府中应用较少,仅在银行中得
到了广泛的应用。经验丰富的管理人员较少,运行管理费用高。 8)
数据库二次开发 SQL Server :数据库的二次开发工具很多,包括Visual
C++, Visual Basic等开发工具,可以实现很好的Windows应用,开发容
易。 Oracle :数据库的二次开发工具很多,涵盖了数据库开发的各个阶
段,开发容易。 SYBASE :开发工具较少,经验丰富的人员很少。 DB2 :在
国外巨型企业得到广泛的应用,中国的经验丰富的人员很少。 *****X :在
银行业中得到广泛的应用,但是在中国的经验丰富的人员很少。
8.存储过程和函数的区别
解答:
从参数的返回情况来看:
如果返回多个参数值最好使用存储过程,如果只有一个返回值的话可
以使用函数。
从调用情况来看:
如果在SQL语句(DML或SELECT)中调用的话一定是存储函数或存
储的封装函数不可以是存储过程,但调用存储函数的时候还有好多限制以
及函数的纯度等级的问题,如果是在过程化语句中调用的话,就要看你要
实现什么样的功能。函数一般情况下是用来计算并返回一个计算结果而存
储过程一般是用来完成特定的数据操作(比如修改、插入数据库表或执行
某些DDL语句等等),所以虽然他们的语法上很相似但用户在使用他们的
时候所需要完成的功能大部分情况下是不同的。
9.试述数据库完整保护的主要任务和措施。
解答:数据库的完整性保护也就是数据库中数据正确性的维护。数据
库完整性包括三个内容:实体完整性规则,参照物完整性规则以及用户定
义完整性规则。 前两个是有DBMS自动处理。
实体完整性规则是说针对于基表中的关键字中属性值不能为空值,是
数据库完整性的基本要求,主关键字和元组的唯一性对应。
参照物完整性规则是不允许引用不存在的元组:即基表中的外关键字
要么为空,要么关联基表中必存在元组。
用户定义完整性规则针对具体的数据环境由用户具体设置的规则,它
反应了具体应用中的语义要求。 一个完整性规则一般由下面三部分组成:
完整性约束条件设置,完整性约束条件的检
查以及完整性约束条件的处理.后两部分在数据库中一般有相应的模
块处理。另外触发器也可以做完整性的保护,但触发器大量用于主动性领
域。
10.请说明SQLServer中delete from tablea truncate table tablea的
区别
解答:两者都可以用来删除表中所有的记录。区别在于:truncate是
DDL操作,它移动HWK,使HWK值为0,不需要 rollback segment .而
Delete是DML操作需要rollback segment 且花费较长时间.
11. Oracle安装完成后,如何用命令行启动和关闭数据库?
解答:
打开:***** [FORCE] [*****T] [PFILE= filename] [OPEN
[*****][ database] | MOUNT | *****] ***** OPEN:*****缺省的参数就是
OPEN,打开数据库,允许数据库的访问。当前实例的控制文件中所描述
的所有文件都已经打开。 ***** MOUNT:MOUNT数据库,仅仅给DBA
进行管理操作,不允许数据库的用户访问。仅仅只是当前实例的控制文件
被打开,数据文件未打开。 ***** *****:仅仅通过初始化文件,分配出
SGA区,启动数据库后台进程,没有打开控制文件和数据文件。不能访问
任何数据库。 ***** PFILE= filename:以filename为初始化文件启动数据
库,不是采用缺省初始化文件。 ***** FORCE:中止当前数据库的运行,
并开始重新正常的启动数据库。 ***** *****T:只允许具有*****TED *****
权限的用户访问数据库。 ***** *****:数据库启动,并开始介质恢复
关闭
*****N有四个参数:NORMAL、*****TIONAL、*****TE、ABORT。缺
省不带任何参数时表示是NORMAL。
命令*****N NORMAL:不允许新的连接、等待会话结束、等待事务结
束、做一个检查点并关闭数据文件。启动时不需要实例恢复。 *****N
*****TIONAL:不允许新的连接、不等待会话结束、等待事务结束、做一
个检查点并关闭数据文件。启动时不需要实例恢复。 *****N *****TE:不
允许新的连接、不等待会话结束、不等待事务结束、做一个检查点并关闭
数据文件。没有结束的事务是自动rollback的。启动时不需要实例恢复。
*****N ABORT:不允许新的连接、不等待会话结束、不等待事务结束、不
做检查点且没有关闭数据文件。启动时自动进行实例恢复。 另外,对于
NORMAL、*****TIONAL、*****TE,DB Buffer Cache的内容写入了数据文
件,没有提交的事务被回滚,所有的资源被释放,数据库被“干净”的关
闭。 对于ABORT,DB Buffer Cache的内容没有写入数据文件,没有提交
的事务也没有回滚。数据库没有dismount和关闭,数据文件也没有关
闭。当数据库启动时,需要通过redo log恢复数据,通过回滚
段对事务回滚,对资源进行释放。
12. 类有哪三个基本特性?各特性的优点?
解答:类具有封装性、继承性和多态性。
封装性:类的封装性为类的成员提供公有、缺省、保护和私有等多级
访问权限,目的是隐藏类中的私有变量和类中方法的实现细节。
继承性:类的继承性提供从已存在的类创建新类的机制,继承
(inheritance)使一个新类自动拥有被继承类(父类)的全部可继承的成
员。
多态性:类的多态性提供类中方法执行的多样性,多态性有两种表现
形式:重载和覆盖。
13.谈谈对XML的理解?说明Web应用中文件的作用?
解答:XML(Extensible Markup Language)即可扩展标记语言,它
与HTML一样,都是SGML(Standard Generalized Markup Language,标准
通用标记语言)。Xml是Internet环境中跨平台的,依赖于内容的技术,是
当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的
数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便
的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但
XML极其简单易于掌握和使用。
的作用是配置欢迎页,servlet,filter,listener等的。
有哪些内置对象?作用分别是什么?(至少三个)
解答:
6)application 表示一个tContext对象。这有助于
查找有关servlet引擎和servlet环境的信息。 7)config表示一个
tConfig对象。该对象用于存取servlet实例的初始化参
数。 8)page表示从该页面产生的一个servlet实例。
9)exception 针对错误网页,未捕捉的例外
15.事务是什么?有哪些属性,并简要说明这些属性的含义。
解答:事务(Transaction)是访问并可能更新数据库中各种数据项的一
个程序执行单元(unit)。
事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)
书写的用户程序的执行所引起,并用形如begin transaction和end
transaction语句(或函数调用)来界定。事务由事务开始(begin
transaction)和事务结束(end transaction)之间执行的全体操作组成。
事务应该具有4个属性:原子性、一致性、隔离性、持续性。这四个
属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中
包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到
另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事
务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个
事务之间不能互相干扰。
持久性(durability)。持续性也称永久性(permanence),指一个事
务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他
操作或故障不应该对其有任何影响。
16、Collection 和 Collections的区别?
解答:Collection是下的接口,它是各种集合的父接口,继
承于它的接口主要有Set 和List;Collections是个下的类,是针
对集合的帮助类,提供一系列静态方法实现对各种集合的搜索、排序、线
程安全化等操作。
17、HashMap与TreeMap的区别?
解答:HashMap通过hashcode对其内容进行快速查找,而TreeMap
中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果
你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
18、ArrayList和Vector的区别?
解答:同步性:Vector是线程安全的,也就是说是同步的,而
ArrayList是线程不安全的,不是同步的;数据增长:当需要增长时,Vector
默认增长为原来一培,而ArrayList却是原来的一半。
19、HashMap和Hashtable的区别?
解答:HashMap是Hashtable的轻量级实现(非线程安全的实现),
他们都实现了Map接口,主要区别
在于HashMap允许空(null)键值(key),由于非线程安全,效率上
高于Hashtable。HashMap允许将null作为一个entry的key或者value,
而Hashtable不允许。HashMap把Hashtable
的contains方法去掉了,改成containsvalue和containsKey。因为
contains方法容易让人引起误解。Hashtable继承自Dictionary类,而
HashMap是Java1.2引进的Map interface的一个实现。最大的不同是,
Hastable的方法是synchronize的,而HashMap不是,在多个线程访问
Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为
之提供同步。
20.请说出ArrayList,Vector, LinkedList的存储性能和特性
解答:ArrayList和Vector都是使用数组方式存储数据,此数组元素
数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引
元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而
插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性
能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数
据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即
可,所以插入速度较快。
21. 描述J2EE框架的多层结构,并简要说明各层的作用。
解答:
1) Presentation layer(表示层)
a. 表示逻辑(生成界面代码)
b. 接收请求
c. 处理业务层抛出的异常
d. 负责规则验证(数据格式,数据非空等)
e. 流程控制
2) Service layer(服务层/业务层)
a.封装业务逻辑处理,并且对外暴露接口
b.负责事务,安全等服务
3) Persistence layer(持久层)
a 封装数据访问的逻辑,暴露接口
b.提供方便的数据访问的方案(查询语言,API,映射机制等)
4)Domain layer(域层)
a. 业务对象以及业务关系的表示
b. 处理简单的业务逻辑
c. 域层的对象可以穿越表示层,业务层,持久层
软件分层结构使得代码维护非常方便,设计明确,各层独立,专注自
己擅长的领域。
22.请谈谈对SOA的认识。
解答:面向服务的体系结构(Service-Oriented Architecture,SOA)
是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服
务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义
的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构
建在各种这样的系统中的服务可以一种统一和通用的方式进行交互。
23.简要描述如何结合struts、hibernate、spring开发Web应用?
解答:Struts可以将jsp页面的表单关联起来,就是把JSP页面的表单
数据封装成javaBean,这样的话,在action中你再也不需要使用传统的
ameter(“name”);还有struts有一个控制器,你在struts编程中
的控制器(XxxAction)都是继承总的ActionServlet,它能集中处理请求,然后转
到相关的页面。还有struts的表单验证组件,不用你写js验证了,只需要你
配置一下文件就可以了。另外struts的令牌机制可以防表单重复提交。
Spring 是一个轻量级容器,非侵入性.包含依赖注入,AOP等。它是为
了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分
层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开
发提供集成的框架。
Hibernate:它可以让我们以OO的方式操作数据库,这让我们看到了
hibernate的强大之处,体验到操作数据的方便。但hibernate最耀眼之处
是hibernate的缓存机制,而不是以OO的方式操作数据库。Hibernate的
缓存机制不外乎是一级缓存session,二级缓存sessionFactory,和第三方
缓存如ehcache。也就是hibernate的最强大的地方是它的缓存,理解了
这个才能真正的理解hibernate,Hibernate的命名查询/命名参数查询,就
是将hql语句放在一个单独的xml文件之中,它仍然让人们以面向对象的
方式去操纵数据,而不用在以OO的方式写着代码的同时,然后再转变思
维,用面向关系的方式去写那些sql语句。但hibernate不仅做了这些,
它的native sql查询方式,完全满足sql语句的偏爱者,它像ibatis一样,
将sql语句放在配置文件之中。
24.说明反转控制(IOC)和面向方向编程(AOP)在spring中的应用
解答:Spring 核心容器(Core)提供Spring框架的基本功能。核心
容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用
控制反转(Ioc)模式将应用程序的配置和依赖性规范与实际的应用代码
程序分开。Spring的声明式事务基于AOP实现,却并不需要程序开发者
成为AOP专家,亦可轻易使用Spring的声明式事务管理。
25.请看如下片段:
set name=“address”
lazy=“true”
inverse=“false”
cascade=“all-delete-orphan”
key column = “USERID” /key
one-to-many class=“s”/
/ set
解释lazy、inverse、cascade以及all-delete-orphan属性的含义;并
给出示例代码,说明在如下组合情况下,对于save、update、delete一对
多关系中的一方对象操作时的区别:
inverse
cascade
true
all-delete-orphan
false
all-delete-orphan
true
all
false
all
true
none
false
none
解答:
(一)lazy:延迟加载
Lazy的有效期:只有在session打开的时候才有效;session关闭后
lazy就没效了。
lazy策略可以用在:
a.class标签上:可以取值true/false
ty标签上,可以取值true/false,这个特性需要类增强
/list等集合上,可以取值为true/false/extra
-to-one/many-to-one等标签上,可以取值false/proxy/no-
proxy
1) get和load的区别:
不支持延迟加载,而load支持。
b.当查询特定的数据库中不存在的数据时,get会返回null,而load
则抛出异常。
2) 类(Class)的延迟加载:
a. 设置class标签中的lazy=”true”,或是保持默认(即不配置lazy属
性)
b. 如果lazy的属性值为true,那么在使用load方法加载数据时,只
有确实用到数据的时候才会发
出sql语句;这样有可能减少系统的开销。
3) 集合(collection)的延迟加载:可以取值true,false,extra
:默认取值,它的意思是只有在调用这个集合获取里面的元素对
象时,才发出查询语句,加载其集合元素的数据
:取消懒加载特性,即在加载对象的同时,就发出第二条查询语
句加载其关联集合的数据
:一种比较聪明的懒加载策略,即调用集合的size/contains等方
法的时候,hibernate并不会去加载整个集合的数据,而是发出一条聪明
的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对
象数据的时候,才去发出查询语句加载所有对象的数据
4) Hibernate单端关联懒加载策略:即在one-to-one/many-to-one
标签上可以配置
懒加载策略。可以取值为:false/proxy/no-proxy
:取消懒加载策略,即在加载对象的同时,发出查询语句,加载
其关联对象
:这是hibernate对单端关联的默认懒加载策略,即只有在调用
到其关联对象的方法的时候才真正发出查询语句查询其对象数据,其关联
对象是代理类
-proxy:这种懒加载特性需要对类进行增强,使用no-proxy,其
关联对象不是代理类
注意:在class标签上配置的lazy属性不会影响到关联对象!!!
(二)inverse
inverse是指的关联关系的控制方向,inverse=false的side(side其实
是指inverse=false所位于的class元素)端有责任维护关系,而inverse
=true端无须维护这些关系
(三)cascade
cascade指的是层级之间的连锁操作。在定义关联对象的映射时,使
用cascade=”all”,cascade=”save-update”,cascade=”all-delete-orphan”或
cascade=”delete”
a.如果父对象被保存,所有的子对象会被传递到saveOrUpdate()方法
去执行(cascade=”save-update”)
b.如果父对象被传递到update()或者saveOrUpdate(),所有的子对象
会被传递到saveOrUpdate()方法去执行(cascade=”save-update”)
c.如果一个临时的子对象被一个持久化的父对象引用了,它会被传递
到saveOrUpdate()去执行 (cascade=”save-update”)
d.如果父对象被删除了,所有的子对象对被传递到delete()方法执行
(cascade=”delete”)
e.如果临时的子对象不再被持久化的父对象引用,什么都不会发生
(必要时,程序应该明确的删除这个子对象),除非声明了cascade=”all-
delete-orphan”,在这种情况下,成为“孤儿”的子对象会被
删除。
(四) save、update、delete一对多关系中的一方对象操作时的区别
1)当一方设置inverse=true时,所有由一方发出的操作都不会关联
到多方。
2)当一方设置 inverse=false, cascade=all-delete-orphan时,将删除
不再和一方对象关联的所有多方对象。
3)当一方设置 inverse=false, cascade=all时,当保存和删除一方对象
时,级联保存和删除所有关联的多方对象。
4)当一方设置 inverse=false, cascade=none时,当对一方操作时,不
级联到关联的多方对象。
26.简单说明什么是递归?什么情况会使用?并使用java实现一个简
单的递归程序。
解答:
1)递归做为一种算法在程序设计语言中广泛应用.是指函数/过程/子
程序在运行过程中直接或间接调用自身而产生的重入现象。
2)递归算法一般用于解决三类问题:
a.数据的定义是按递归定义的。(Fibonacci(斐波那契)函数)
b.问题解法按递归算法实现。(回溯)
c.数据的结构形式是按递归定义的。(树的遍历,图的搜索)
3).这是一个排列的例子,它所做的工作是将输入的一个字符串中的
所有元素进行排序并输出,例如:你给出的参数是”abc” 则程序会输出:
abc acb bac bca cab cba a.算法的出口在于:low=high也就是现
在给出的排列元素只有一个时。 b.算法的逼近过程:先确定排列的第一
位元素,也就是循环中i所代表的元素, 然后low+1开始减少排列
元素,如此下去,直到low=high public class Foo {
public static void main(String[] args) {
permute(“abc”);
}
public static void permute(String str) {
char[] strArray = Array();
permute(strArray, 0, C 1);
}
public static void permute(char[] list, int low, int high) {
int i;
if (low == high) {
list[i] = temp;
permute(list, low + 1, high);
temp = list[low];
list[low] = list[i];
list[i] = temp;
}
}
}
}
27.列出自己常用的jdk包.
解答:JDK常用的package
.cnng: 这个是系统的基础类,比如String等都是这里面的,这个
package是唯一一个可以不用import就可以使用的Package
: 这里面是所有输入输出有关的类,比如文件操作等
.cn: 这里面是络有关的类,比如URL,URLConnection等。
: 这个是系统辅助类,特别是集合类Collection,List,Map等。
: 这个是数据库操作的类,Connection, Statememt,ResultSet
等
28.列出自己常用的jdk中的数据结构
解答:线性表,链表,哈希表是常用的数据结构。
29.List、Map、Set三个接口存储元素时各有什么特点?
解答:
1)List是有序的Collection,使用此接口能够精确的控制每个元素插
入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)
来访问List中的元素,这类似于Java的数组。
2)Set是一种不包含重复的元素的Collection,即任意的两个元素e1
和e2都有(e2)=false,Set最多有一个null元素。
3)Map接口 :请注意,Map没有继承Collection接口,Map提供
key到value的映射
30. 简述基于Struts框架Web应用的工作流程
解答:在web应用启动时就会加载初始化ActionServlet,ActionServlet
从文件中读取配置信息,把它们存放到各种配置对象中,
当ActionServlet接收到一个客户请求时,将执行如下流程. 1)检索和用户请
求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息; 2)如
果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表
单数据保存到ActionForm对象中; 3)根据配置信息决定是否需要表单验证.
如果需要验证,就调用ActionForm的validate()方法; 4)如果ActionForm的
validate()方法返回null或返回一个不包含ActionMessage的ActionErrors
对象, 就表示表单验证成功; 5)ActionServlet根据ActionMapping所包含的
映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,就
先创建这个实例,然后调用Action的execute()方法; 6)Action的execute()方
法返回一个ActionForward对象,ActionServlet在把客户请求转发给
ActionForward对象指向的JSP组件;
7)ActionForward对象指向JSP组件生成动态网页,返回给客户;
31. 在项目中用过Spring的哪些方面?及用过哪些Ajax框架?
解答:在项目使用过Spring IOC ,AOP,DAO,ORM,还有上下文
环境。
在项目使用过Ext,Juery等Ajax框架.
32、abstract class和interface有什么区别?
解答:声明方法的存在而不去实现它的类被叫做抽象类(abstract
class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,
但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可
以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实
例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类
中的所有抽象方法提供实现,否则它们也是抽象类。取而代之,在子类中
实现该方法。知道其行为的其它类可以在类中实现这些方法。接口
(interface)是抽象类的变体。新型多继承性可通过实现这样的接口而获
得。接口中的所有方法都是抽象的,所有成员变量都是public static final
的。一个类可以实现多个接口,当类实现接口时,必须实现接口的所有方
法。抽象类在Java语言中表示的是一种单继承的关系,对于interface 来
说则不然,并不要求interface的实现者和interface定义在概念本质上是
一致的,仅仅是实现了interface定义的契约而已。;抽象类中可以定义自
己的成员变量,也可以包含非抽象的方法,而在接口中只能有静态的常
量,所有方法必须是抽象的;实现抽象类时可以只实现其中的部分方法,
而要是实现一个接口的话就必须实现这个接口中的所有抽象方法。
模式中M,V,C每个代表意义,并简述在Struts中MVC的
表现方式。
解答:
MVC是Model-View-Controller 的缩写,Model代表的是应用的业
务逻辑(通过JavaBean,EJB组件实现),View 是应用的表示层(由JSP
页面产生)Controller是通过应用的处理过程控制,(一般是一个
servert)通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的
组件实现,这些组件可以进行交互和重用。
在Struts框架中Controller功能由ActionServlet和ActionMapping对
象构成,核心是一个Servlet类型的对象ActionServlet,它用来接收客户
端的请求。ActionServlet包括一组基于配置的ActionMapping对象,每个
ActionMapping对象实现了一个请求到一个具体的Model部分的Action
处理器对象之间的映射。Model部分由Action和ActionForm对象构成。
所有的Action处理器对象都是开发者从Struts的Action类派生的子类。
Action处理器对象封装了具体的处理逻辑,调用业务逻辑模块,并且把响
应提交到合适的View组件以产生响应。Struts提供的ActionForm组件对
象可以通过定义属性描述客户端表单数据,开发者可以从它派生子类对
象,并利用它和Struts提供的自定义标记库相结合,可以实现对客户端的
表单数据的良好封装和支持,Action处理器对象可以直接对它进行读写,
而不再需要和request、response对象进行数据交互。通过ActionForm组
件对象实现了对View和Model之间交互的支持(View部分是通过JSP技
术实现的)。Struts提供了自定义的标记库,通过这些自定义标记库可以
非常容易地和系统的Model部分交互,通过使用这些自定义标记库创建
的
JSP表单,可以实现对Model部分中的ActionForm的映射,完成对
用户数据的封装。
34.java语言中public、private、protected三个关键字的用法,重写
和重载的区别。
解答:
作用域 当前类 同包 子类 其它
public √ √ √ √ protected √ √ √ × default √ √ × × private √ ×
× ×
重写:发生在父子类之间,方法名相同,参数的类型、个数、顺序相
同,返回值相同,访问权限不能更封闭,抛出异常不能宽泛;
重载:发生在同一个类中,方法名相同,但是参数不同(类型不同或
个数不同或参数的顺序不同),返回值可以不相同。
页面之间传递参数的方法有哪些?
解答:
1)request
2)session
3)application
4)提交表单
5)超链接
d 和redirect的区别
解答:forward是容器中控制权的转向,是服务器请求资源,服务器
直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这
些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来
的,所以它的地址栏中还是原来的地址。 redirect就是服务端根据逻辑,
发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用
刚才请求的所有参数重新请求,并且从浏览器的地址栏中可以看到跳转后
的链接地址。前者更加高效,在前者可以满足需要时,尽量使用
forward()方法,并且,这样也有助于隐藏实际的链接;在有些情况下,比
如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方
法。
反射机制的作用?
解答:Java反射机制的作用是:
1)在运行时判断任意一个对象所属的类。
2)在运行时构造任意一个类的对象。
3)在运行时判断任意一个类所具有的成员变量和方法。
4)在运行时调用任意一个对象的方法
38.你是怎么理解java的泛型的?
解答: 在Java SE 1.5之前,没有泛型的情况的下,通过对类型
Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的
强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况
下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运
行的时候才出现异常,这是一个安全隐患。
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说
所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和
方法的创建中,分别称为泛型类、泛型接口、泛型方法。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是
自动和隐式的,提高代码的重用率。
源文件中是否可以包括多个类,有什么限制
解答:一个java源文件中可以包含多个类,每个源文件中至多有一
个public类,如果有的话,那么源文件的名字必须与之相同。如果源文件
中没有public类,则源文件用什么名字都可以,但最好还是具有特定的意
义,免得自己都不记得里面写的是什么了。
40.在一个千万级的数据库查寻中,如何提高查询效率?分别说出在
数据库设计、SQL语句、java等层面的解决方案。
解答:
1)数据库设计方面:
a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及
order by 涉及的列上建立索引。
b. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导
致引擎放弃使用索引而进行全表扫描,如: select id from t where num is
null 可以在num上设置默认值0,确保表中num列没有null值,然后这
样查询: select id from t where num=0
c. 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询
优化的,当索引列有大量数据重复时,查询可能不会去利用索引,如一表
中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也
对查询效率起不了作用。
d. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,
但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有
可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个
表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建
的索引是否有必要。
e. 应尽可能的避免更新索引数据列,因为索引数据列的顺序就是表
记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,
会耗费相当大的资源。若应用系统需要频繁更新索引数据列,那么需要考
虑是否应将该索引建为索引。
f. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符
型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处
理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需
要比较一次就够了。
g. 尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变
长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对
较小的字段内搜索效率显然要高些。
h. 尽量使用表变量来代替临时表。如果表变量包含大量数据,请注
意索引非常有限(只有主键索引)。
i. 避免频繁创建和删除临时表,以减少系统表资源的消耗。
j. 临时表并不是不可使用,适当地使用它们可以使某些例程更有效,
例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一
次性事件,最好使用导出表。
k. 在新建临时表时,如果一次性插入数据量很大,那么可以使用
select into 代替 create table,避免造成大量 log ,以提高速度;如果数
据量不大,为了缓和系统表的资源,应先create table,然后insert。
l. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式
删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较
长时间锁定。
2)SQL语句方面:
a. 应尽量避免在 where 子句中使用!=或操作符,否则将引擎放弃使
用索引而进行全表扫描。
b. 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引
擎放弃使用索引而进行全表扫描,如: select id from t where num=10 or
num=20 可以这样查询: select id from t where num=10 union all select
id from t where num=20
c. in 和 not in 也要慎用,否则会导致全表扫描,如: select id from
t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
d. 下面的查询也将导致全表扫描: select id from t where name like
‘%abc%’


发布评论