文档库 最新最全的文档下载
当前位置:文档库 › Java面试参考答案

Java面试参考答案

简答题:
1,作用域public,private,protected以及不写时的区别?
public公共,加上这个修饰的类或属性,可以在同一个包或者别的包里面访问
private私有的,加上这个修饰的类或属性,只能在同类里访问,同包和别的包不能访问
protected受保护的,加上这个修饰的类或属性,只能在类、子类和同包访问,别的包不能访问
不写为缺省的,位于public和protected中间,加上这个修饰的属性和方法,只能在同包下的程序访问,别的的地方不能访问
区别:protected修饰的方法或属性,在不同包的子类中也可以方法,但缺省就不行!
2,JDBC中的PreparedStatement相比Statement的好处?
(1)、相对比较安全,可以防止sql注入
(2)、有预编译功能,相同操作批量数据效率较高
3,谈谈final,finally,finalize的区别?
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
4,RandomAccessFile实现了那些接口?
除了实现DataInput和DataOutput接口之外,也实现了DataInputStream和DataOutputStream这两个接口。
5,程序、进程和线程的区别?
进程就是一个单独程序打开了单独的一段地址空间进行单独的工作
而线程是一个程序用N段地址空间进行进行同一种操作
微软官方对进程和线程的定义:
进程:用最简洁的话来说,进程就是一个正在执行的程序,一个或多个线程在进程中运行
6,线程的状态有几种,是如何相互交换的?
一般说有3种,但也有说4种的
3种:
就绪:线程分配了CPU以外的全部资源,等待获得CPU调度
执行:线程获得CPU,正在执行
阻塞:线程由于发生I/O或者其他的操作导致无法继续执行,就放弃处理机,转入线程就绪队列
第四种:
挂起:由于终端

请求,操作系统的要求等原因,导致挂起。

7,描述jsp有哪些内建对象?并说明他们的作用
pageContext页面作用域
request获取请求
response进行响应
session会话作用域
out用于给页面输出
application应用程序作用域
还有几个不常用的如page,config,exception等

8,Session与Applicaiton的区别?
Session在整个会话作用域里有效,只要用户不关闭浏览器,存储在Session里的状态信息就一直保持着,除非Session失效了。
Application指的是整个应用程序的作用域,它一直保持数据到服务器的关闭。

9,Spring的事务有几种方式?谈谈spring事务的隔离级别和传播行为?
根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:
(1):每个Bean都有一个代理
(2):所有Bean共享一个代理基类
(3):使用拦截器
(4):使用tx标签配置的拦截器
(5):全注解方式
事务隔离等级:
(1)、Serializable:最严格的级别,事务串行执行,资源消耗最大;
(2)、REPEATABLE READ:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。
(3)、READ COMMITTED:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。
(4)、Read Uncommitted:保证了读取过程中不会读取到非法数据。隔离级别在于处理多事务的并发问题。
7种传播行为:
PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

10,MVC,分析一下Struts是如何实现MVC的?
Struts的MVC实现原理:
浏览器请求到ActionServlet前端控制器中,ActionServlet分析请求url,读取Struts-config.xml解析出相应的action中,将表单中的数据放到ActionForm中,然后到相应的action,调用模型层处理ActionForm中的数据,处理数据后将跳

转地址ActionForward返回到ActionServlet,ActionServlet解析ActionForward找到跳转的页面,随后生成jsp页面,最后发送到浏览器。

11,Struts的工作机制?为什么要使用Struts?
Struts的工作机制如上10
为什么要用:
JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。
基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件

12,在数据库中条件查询速度很慢的时候,如何优化?
几个优化建议:
1. 在经常被查询的字段上创建索引
2. 对于类似于数据字典的字段,不要建立索引
3. 不要使用select * ,而是使用 select col1,col2....
4. 避免使用distinct
5. 将区分度高的查询字段放在where的最后一个,比如 where col_1='...' and col_2='...',如果通过col_2='...'可以将结果集从3W缩小到300,而col_1='...'只能缩小到3000,那么就 where col_1='...' and col_2='...'。

13,Hibernate的工作原理及为什么要使用?
所谓Hibernate的基本工作原理,换言之,也就是Hibernate大体的工作流程。
1. 读取并解析配置文件
2. 读取并解析映射信息,创建SessionFactory
3. 打开Sesssion
4. 创建事务Transation
5. 持久化操作
6. 提交事务
7. 关闭Session
8. 关闭SesstionFactory
Hibernate 是一个O/R Mapping(Object Relational Mapping,简称ORM)框架
就是说,把操作数据库的过程交给hibernate了.
用户进行配置映射后,直接操作hibernate,对于数据库来说,这是透明的,hibernate底层要根据相关的数据库方言转换成对应的SQL
从另一方面来讲,hibernate管理JAVA类到数据库表的映射,程序员操作JAVA类即可进行数据库的操作.也就是说进行了"面向对象"的方式操作数据库了.

14,Hibernate是如何延迟加载,提供了哪些延时加载?
延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。下面我们就分别介绍这些种类的延迟加载的细节。
A、实体对象的延迟加载
B、集合类型的延迟加载
C、属性延迟加载

15,说说AOP和IOC的概念以及在Spring中如何应用?
什么是DI机制?
依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色
需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被

调用者的实例。但在spring中
创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者
因此也称为依赖注入。
spring以动态灵活的方式来管理对象 , 注入的两种方式,设置注入和构造注入。
设置注入的优点:直观,自然
构造注入的优点:可以在构造器中决定依赖关系的顺序。

什么是AOP?
面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面

面向切面编程(aop)是对面向对象编程(oop)的补充,
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,
是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。

aop框架具有的两个特征:
1.各个步骤之间的良好隔离性
2.源代码无关性
二、程序设计题
1,封装一个JDBC对数据库操作的类
public class SQLCommandBean {
private Connection conn=null;
private String sql=null;
private List values=null;//设置sql参数
public Connection getConn() {
try {
Class.forName(driver);
return DriverManager.getConnection(url,user,pass);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public void setConn(Connection conn) {
this.conn = conn;
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
public List getValues() {
return values;
}
public void setValues(List values) {
this.values = values;
}
public void setValues(PreparedStatement pstmt,List values) throws SQLException{
for(int i=0;iObject obj=values.get(i);
pstmt.setObject(i+1, obj);
}
}
public int executeUpdate(){
int result=0;
Statement stmt=null;
PreparedStatement pstmt=null;
conn=this.getConn();
//设置事务隔离级别. Connection类定义了一些事务级别常量
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
con.setAutoCommit(false);//设置事务为手动控制
try{
if(values!=null&&values.size()>0){
pstmt=conn.prepareStatement(sql);
this.setValues(pstmt, values);
result=pstmt.executeUpdate();
sp = conn.setSavepoint();//1.获取事务标志位
https://www.wendangku.net/doc/fb15118859.html,mit();
}
}catch(Exception e){
e.printStackTrace();
conn.rollback(sp);
}finally{
//关闭资源
}
return result;
}
}

2,在数据库中有10000条记录,每次提取100条,应该怎么写?
select top 100 * from tablename where id not in (select top n*100 id f

rom tablename)
N代表次数。
3,写一个10进制转换成二进制的函数?
方法1:调用API
<>
十进制转成十六进制:
Integer.toHexString(int i)
十进制转成八进制
Integer.toOctalString(int i)
十进制转成二进制
Integer.toBinaryString(int i)
十六进制转成十进制
Integer.valueOf("FFFF",16).toString()
八进制转成十进制
Integer.valueOf("876",8).toString()
二进制转十进制
Integer.valueOf("0101",2).toString()
方法2:自己写算法
将十进制转换成二进制的算法如下:
(1).给定一个数;
(2).根据十进制转换二进制的思想:把这个数除以2若为单数则为1,为偶数则为0,直到最后一个数为1为止。所以我们要做的就是用你给定的这个数除以2,如果结果为奇数则r=1,否则r=0;如此循环下去,直到这个数〉=1。
(3).然后把r的值送到一个数组里面。最后把这个数组里面的内容从后面打印出来就可以了。
public String trans2(int n)
{
int r;
int i=0;
int[] a=new int[10];
do
{
if(n%2==1)
{
r=1;
}else
{
r=0;
}
a[i]=r;
n=n/2;
i++;
}while(n>0);
StringBuffer buf=new StringBuffer("");
for(int j=i-1;j>=0;j--)
{
buf.append(a[j]+"");
}
return buf.toString();
}
4,将三个员工对象存放入集合容器中,根据员工的工资按升序排序,打印排序完结果
class Employee implements Comparable{
...
public int compareTo( Person o) {
return this.sale - o.sale;
}
}
Listlist=new ArrayList();
list.add(emp1);
list.add(emp2);
list.add(emp3);
Collections.sort(list);
for(int i=0;iEmployee emp=list.get(i);
System.out.println(emp.getSale());
}
5,取出sql表中第31到40的记录(以自动增长ID为主键)
sql语句,取出表A中的第31条到40条记录(表A以自动增长的ID做主键,注意ID可能是不连续的)

-->select top 10 * from a where id not in (select top 30 id from a order by id) order by id

查询前十条记录,但条件是:ID不在前三十条的ID里面

-->select top 10 * from (select top 40 * from a order by id desc(降序))

查询前十条记录,但条件是:ID取出的是以ID按降序排列的前四十条记录里面的






相关文档