阿里JAVA开发面试常问问题总结1
为了充分应对阿里面试,特总结如下试题,希望能够有助于理解记忆。
1、Java中所有类的父类是什么?它都有什么方法,请列举。
Object类是所有类、数组、枚举类的父类。它提供了如下几个常用方法:
1)equals():判断指定对象与该对象是否相等。
2)finalize():当系统中没有引用变量引用到该对象时,垃圾回收器调用此方法来清理该对象的资源。
3)getClass():返回该对象的运行时类。
4)Hashcode():返回该对象的hashcode值。
5)toString():返回该对象的字符串表示,当程序使用System.out.println()方法输出一个对象,或者把某个对象和字符串进行连接运算时,系统会自动调用该对象的toString()方法返回该对象的字符串表示。
6)Wait()、notify()、notifyAll():控制线程的停止和运行。
2、Java中IO包下面的inputstream运用了什么设计模式?请简述你知道的设计者模式?
主要用到了两个模式:适配器模式和装饰者模式。
适配器模式:
在由InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器是对其它类型的流源的适配。这就是适配器模式的应用。如InputStreamReader和OutputStreamWriter做了InputStream/OutputStream字节流类到Reader/Writer之间的转换。
装饰者模式:
在由 InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器可以对另一些流处理器起到装饰作用,形成新的,具有改善了的功能的流处理器。装饰者模式是Java I/O库的整体设计模式。这样的一个原则是符合装饰者模式的。
如 BufferedInputStream bis = new BufferedInputStream(new FileInputStream());
下面讲一下我熟悉的适配器模式:
这里涉及三个类:目标接口、适配器类、需要适配的类。
1、类适配器:用适配器类继承需要适配的类同时实现目标接口,在适配器类中重写目标接口的方法并在该方法中用super调用需要适配的类的方法。
以代码助理解:
// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类
class Adaptee {
public void specificRequest() {
System.out.println(“被适配类具有 特殊功能…”);
}
}
// 目标接口,或称为标准接口
interface Target {
public void request();
}
// 适配器类,继承了被适配类,同时实现标准接口
class Adapter extends Adaptee implements Target{
public void request() {
super.specificRequest();
}
}
// 测试类
public class Client {
public static void main(String[] args) {
// 使用特殊功能类,即适配类
Target adapter = new Adapter();
adapter.request();
}
}
2、对象适配器:适配器类实现目标接口,在适配器类中包含一个被适配类的对象,在适配器类的构造函数中初始化该对象,同时在其中调用被适配器类对象的具体方法(委托方式)。
// 适配器类,直接关联被适配类,同时实现标准接口
class Adapter implements Target{
// 直接关联被适配类
private Adaptee adaptee;
// 可以通过构造函数传入具体需要适配的被适配类对象
public Adapter (Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
// 这里是使用委托的方式完成特殊功能
this.adaptee.specificRequest();
}
}
// 测试类
public class Client {
public static void main(String[] args) {
// 使用特殊功能类,即适配类,
// 需要先创建一个被适配类的对象作为参数
Target adapter = new Adapter(new Adaptee());
adapter.request();
}
}
3、如何在hibernate中查看原始的sql语句?
对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。该接口是Query接口的子接口。
执行SQL查询步骤如下:
1)获取Hibernate Session对象
2)编写SQL语句
3)通过Session的createSQLQuery方法创建查询对象
4)调用SQLQuery对象的addScalar()或addEntity()方法将选出的结果与标量值或实体进行关联,分别用于进行标量查询或实体查询
5)如果SQL语句包含参数,调用Query的setXxxx方法为参数赋值
6)调用Query的list方法返回查询的结果集
4、简述AOP和IOC的作用
AOP :面向切面编程 ,它主要关注的是程序的执行过程。AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。
具体解析:在java方法调用时,AOP机制能自动进行方法拦截,允许在方法调用之前,调用后,以及执行异常时添加特定的代码来完成需要的功能。
作用:1)消除编码模块之间的耦合性。 2)可以在任意阶段,向已有功能模块中填加新功能,且不侵入原有功能,是低侵入式设计。3)各步骤之间的良好隔离性 , 源代码的无关性。
IOC:控制反转,是一种设计模式。一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制;第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系。他们的依赖关系只在使用的时候才建立。简单来说就是不需要NEW一个对象了。
Spring 的AOP和IOC都是为了解决系统代码耦合度过高的问题。使代码重用度高、易于维护。
5、struts2的流程是怎样的?
一个请求在Struts2框架中的处理大概分为以下几个步骤:
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。
6、线程安全你是怎么做的?
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。
http://blog.csdn.net/haolongabc/article/details/7249098
1)同步代码块
synchronized(obj){
….
//此处的代码块就是同步代码块
}
2)同步方法
用synchronized修饰的实例方法(非static方法)。
3)同步锁(Lock)
通过显式定义同步锁对象来实现同步,同步锁由Lock充当。
锁提供了对共享资源的独占访问,每次只能有一个线程对Lock加锁,线程开始访问共享资源之前应先获得Lock对象。
在实现线程安全的控制中,比较常用是ReentrantLock(可重入锁)。使用该Lock对象可以显示地加锁、释放锁,通常使用ReentrantLock的代码格式如下:
class X{
//定义锁对象
private final ReentrantL1ock lock=new ReentrantLock();
//定义需要保证线程安全的方法
public void m(){
//lock.lock();
try{
//需要保证线程安全的代码
//…method body
}
//使用finally块来保证释放锁
finally{
lock.unlock();
}
}