java面试题目与答案

Java面点

面点一:抽象类和接口有什么区别

1.abstract class Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface

2.abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。

3.abstract classinterface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。

4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

7.接口中的方法默认都是 public,abstract 类型的。

面点二:集合类型有哪些及使用场景

ArrayList和Vector的异同:

相同点:都是基于数组来实现的;都可从指定位置取得元素,从容器的末尾增加和删除元素都非常的有效,能在一个常数级的时间(O(1))内完成。但是从一个其他的位置增加和删除一个元素颇费时,需要的时间为O(n-i),这里的n代表元素个数,i代表要增加和删除的元素所在的位置。

差别: 1、Vector法都是同步的,即线程安全,而ArrayList不考虑线程安全,   ArrayList的性能比Vector好;    2、 当添加元素超容量时,Vector容量翻倍,而ArrayList增加50%(更节约内存空间)。 所以,在单线程里,尽量用ArrayList

 

TreeMap和HashMap的差别

HashMap通过hashcode对其内容进行快速查找;而TreeMap基于红黑树实现的,其所有的元素都保持着某种固定的顺序,如自然顺序或自定义顺序。

Map中插入、删除和定位元素,HashMap是最好的选择。但如果要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

ArrayList、LinkedList

ArrayList基于数组:便于索引,但不便于插入删除(需要移动元素);  

LinkedList基于链表:插入和删除只需修改指针,但不能随机存取(需从head找起)

面点三:Collection Collections 的区别

Collection 是一个接口,它是SetList等容器的父接口;Collections 是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等

面点四: Java中线程的接口和实现类是哪里两个,以及线程的主要状态?

Java中实现线程的接口和实现类分别是:Runnable接口和Thread线程的状态为

1. 新状态:线程已被创建但尚未执行(start() 尚未被调用)。

2. 可执行状态:线程可以执行,虽然不一定正在执行。CPU 时间随时可能被分配给该线程,从而使得它执行。

3. 死亡状态:正常情况下 run() 返回使得线程死亡。调用 stop()destroy() 亦有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。

4. 阻塞状态:线程不会被分配 CPU 时间,无法执行。

面点五:请说出与线程同步相关的方法

1. wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;

2. sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException 异常;

3. notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关;

4. notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争;

面点六:Java 中有几种类型的流?

字节流,字符流。字节流继承于InputStreamOutputStream,字符流继承于ReaderWriter。在java.io 包中还有许多其他的流,主要是为了提高性能和使用方便

Struts2.0 面点

面点一、struts的工作的架构图以及原理介绍

 

原理介绍:

(1)客户端提交一个HttpServletRequest 请求(.action 或JSP 页面)

(2)请求被提交到一系列Filter 过滤器,如ActionCleanUp 和FilterDispatcher 等

(3)FilterDispatcher 是Struts2控制器的核心,它通常是过滤器链中的最后一个过滤器

(4)请求发到FilterDispatcher 后,FilterDispatcher 询问ActionMapper 是否需要调用某个Action来处理这个Request(一般根据URL 后缀是否为.action 来判断)

(5)如果ActionMapper 决定需要调用某个Action,FilterDispatcher 则把请求交到ActioProxy,由其进行处理.

(6)ActionProxy 通过Configuration Manager(它会访问struts.xml)询问框架的配置文件,找到需要调用的Action 类.

(7)ActionProxy 创建一个ActionInvocation 实例, 而ActionInvocation 通过代理模式调用

Action,(在调用之前会根据配置文件加载相关的所有Interceptor 拦截器)

(8)Action 执行完毕后,返回一个result 字符串,此时再按相反的顺序通过Interceptor 拦截器.

(9) 最后ActionInvocation 负责根据struts.xml 中配置的result 元素,找到与返回值对应的result,决定进行下一步输出.

面点二、Struts2.0 线程安全问题

Struts2 Action 对象为每一个请求产生一个实例,因此没有线程安全问题

面点三、什么是过滤器、拦截器以及有什么区别

什么是拦截器

 拦截器,在AOPAspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
   Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。


    谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈           Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
拦截器的实现原理

大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。
什么是过滤器

过滤器是一个程序,它先于与之相关的servletJSP页面运行在服务器上。过滤器可附加到一个或多个servletJSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:
以常规的方式调用资源(即,调用servletJSP页面)。
利用修改过的请求信息调用资源。
调用资源,但在发送响应到客户机前对其进行修改。
阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。
 
Servlet过滤器的基本原理

Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。例如,某网站里有提交修改的注册信息的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话是否有效;对提交的数据进行统一编码。这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。

Servlet过滤器会在请求还未到Servlet之前检查request对象,修改 Request Header Request 内容;在Servlet被调用后检查Response对象,修改 Response Header Response 内容
 
拦截器与过滤器的区别

 1. 拦截器是基于java反射机制的,而过滤器是基于函数回调
     2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
     3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
     4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
     5. action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

面点四、怎么定义过滤器和连接器,需要编写代码

1. 拦截器代码的实现

1xml文件中如何定义拦截器
<interceptors>
 <interceptor name="filterIPInterceptor"
                         class="com.xxxx.web.FilterIPActionInterceptor" />
<interceptor-stack name="filterIPStack">
<interceptor-ref name="defaultStack" />
                              
<interceptor-ref name="filterIPInterceptor" />
</interceptor-stack>
</interceptors>

2)编写拦截器代码

public class FilterIPActionInterceptor extends AbstractInterceptor
{
    /** 日志控制. */
    private final Log log = LogFactory.getLog(getClass());
 
    /**
     * @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
     */
    @Override
    @SuppressWarnings("unchecked")
    public String intercept(ActionInvocation invocation) throws Exception
    {
        String result = null;
        // 获得当前方法名.
        String methodName = invocation.getInvocationContext().getName();
        String currIp = null;
        try
        {
            if (invocation.getAction() instanceof PortletAction)
            {
                PortletAction action = (PortletAction) invocation.getAction();
                currIp = action.getRequest().getRemoteAddr();
            }

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值