天天看点

java笔试题

A.程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的

B.Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的

C.方法区用于存储JVM加载的类信息、常量、静态变量、即使编译器编译后的代码等数据,是线程隔离的

D.原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的

解析:方法区在JVM中也是一个非常重要的区域,它与堆一样,是被 线程共享 的区域。 在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

A.JDBC提供了Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程

B.对于PreparedStatement来说,数据库可以使用已经编译过及定义好的执行计划,由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象”

C.PreparedStatement中,“?” 叫做占位符,一个占位符可以有一个或者多个值

D.PreparedStatement可以阻止常见的SQL注入式攻击

解析:JDBC statement中的PReparedStatement的占位符对应着即将与之对应当值,并且一个占位符只能对应一个值,如果能对应多个就会引起混淆。sql语句是确定的,那么一个占位符必定只能对应一个值

A.servlet处于服务器进程中,它通过多线程方式运行其service方法

B.CGI对每个请求都产生新的进程,服务完成后就销毁

C.servlet在易用性上强于cgi,它提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等

D.cgi在移植性上高于servlet,几乎所有的主流服务器都直接或通过插件支持cgi

解析:servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。CGI不可移植,为某一特定平台编写的CGI应用只能运行于这一环境中。每一个CGI应用存在于一个由客户端请求激活的进程中,并且在请求被服务后被卸载。这种模式将引起很高的内存、CPU开销,而且在同一进程中不能服务多个客户。

A.不管是post还是get方法提交过来的连接,都会在service中处理

B.doGet/doPost 则是在 javax.servlet.GenericServlet 中实现的

C.service()是在javax.servlet.Servlet接口中定义的

D.service判断请求类型,决定是调用doGet还是doPost方法

解析:doGet/doPost 则是在 javax.servlet.http.HttpServlet 中实现的

A.在创建自己的Servlet时候,应该在初始化方法init()方法中创建Servlet实例

B.在Servlet生命周期的服务阶段,执行service()方法,根据用户请求的方法,执行相应的doGet()或是doPost()方法

C.在销毁阶段,执行destroy()方法后会释放Servlet 占用的资源

D.destroy()方法仅执行一次,即在服务器停止且卸载Servlet时执行该方法

解析:servlet是由Servlet容器负责加载Servlet类,创建Servlet对象并实例化,然后调用Servlet的init方法,进行初始化,之后调用Service方法。实例化和初始化不同

A.init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法

B.Service()方法处理客户机发出的所有请求

C.destroy()方法标志servlet生命周期的结束

D.servlet在多线程下使用了同步机制,因此,在并发编程下servlet是线程安全的

解析:servlet在多线程下其本身并不是线程安全的。如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写Servlet程序时要特别注意。线程安全问题主要是由实例变量造成的,因此在Servlet中应避免使用实例变量。如果应用程序设计无法避免使用实例变量,那么使用同步来保护要使用的实例变量,但为保证系统的最佳性能,应该同步可用性最小的代码路径。实例变量:定义在类中但在任何方法之外。

A.Struts1要求Action类继承一个抽象基类。Struts 2 Action类可以实现一个Action接口

B.Struts1 Action对象为每一个请求产生一个实例。Struts2 Action是单例模式并且必须是线程安全的

C.Struts1 Action 依赖于Servlet API,Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试

D.Struts1 整合了JSTL,Struts2可以使用JSTL,但是也支持OGNL

解析:

1.Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。 

2. Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

3. Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。 

4. Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。

5. Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。 

6. Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

forward,服务器获取跳转页面内容传给用户,用户地址栏不变

redirect,是服务器向用户发送转向的地址,redirect后地址栏变成新的地址

A.通过DriverManager.getConnection方法加载

B.调用方法 Class.forName

C.通过添加系统的jdbc.drivers属性

D.通过registerDriver方法注册

A.sleep是线程类(Thread)的方法,wait是Object类的方法;

B.sleep不释放对象锁,wait放弃对象锁

C.sleep暂停线程、但监控状态仍然保持,结束后会自动恢复

D.wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状态

Java中的多线程是一种抢占式的机制,而不是分时机制。抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行。 

共同点 : 

1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。 

2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。 

如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。 

需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。 

不同点 :  

1.每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。 

sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。 

2.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 

3.sleep必须捕获异常,而wait(可能会产生 InterruptedException),notify和notifyAll不需要捕获异常 

4.sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

5.wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

<code>Integer i01 = </code><code>59</code><code>;</code>

<code>int</code> <code>i02 = </code><code>59</code><code>;</code>

<code>Integer i03 =Integer.valueOf(</code><code>59</code><code>);</code>

<code>Integer i04 = </code><code>new</code> <code>Integer(</code><code>59</code><code>)。</code>

VM中一个字节以下的整型数据会在JVM启动的时候加载进内存,除非用new Integer()显式的创建对象,否则都是同一个对象,所有只有i04是一个新对象,其他都是同一个对象。所有A,B选项为true

C选项i03和i04是两个不同的对象,返回false,D选项i02是基本数据类型,比较的时候比较的是数值,返回true。另外Integer和int比较的时候是值,也就是Integer要进行拆箱的操作。

A.Jsp文件实现视图View的功能

B.ActionServlet这一个类是整个struts项目的控制器

C.ActionForm、Action都属于Model部分

D.一个struts项目只能有一个Servlet

解析:Model: MVC系统中的Model部分从概念上可以分为两类――系统的内部状态,和改变系统状态的动作。Struts为Model部分提供了Action和ActionForm对象:所有的Action处理器对象都是开发者从Struts的Action类派生的子类。Action处理器对象封装了具体的处理逻辑,调用业务逻辑模块,并且把响应提交到合适的View组件以产生响应。Struts提供的ActionForm组件对象,它可以通过定义属性描述客户端表单数据。开发者可以从它派生子类对象,利用它和Struts提供的自定义标记库结合可以实现对客户端的表单数据的良好封装和支持,Action处理器对象可以直接对它进行读写,而不再需要和request、response对象进行数据交互。通过ActionForm组件对象实现了对View和Model之间交互的支持。Struts通常建议使用一组JavaBean表示系统的内部状态,根据系统的复杂度也可以使用像Entity EJB 和 Session EJB等组件来实现系统状态。Struts建议在实现时把"做什么"(Action)和"如何做"(业务逻辑)分离。这样可以实现业务逻辑的重用。

A.动态INCLUDE:用jsp:include动作实现

B.静态INCLUDE:用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面&lt;%@ include file="included.htm" %&gt;

C.静态include的结果是把其他jsp引入当前jsp,两者合为一体;动态include的结构是两者独立,直到输出时才合并

D.静态include和动态include都可以允许变量同名的冲突.页面设置也可以借用主文件的

动态 INCLUDE 用 jsp:include 动作实现 &lt;jsp:include page="included.jsp" flush="true" /&gt; 它总是会检查所含文件中的变化 , 适合用于包含动态页面 , 并且可以带参数。各个文件分别先编译,然后组合成一个文件。

静态 INCLUDE 用 include 伪码实现 , 定不会检查所含文件的变化 , 适用于包含静态页面 &lt;%@ include file="included.htm" %&gt;。先将文件的代码被原封不动地加入到了主页面从而合成一个文件,然后再进行翻译,此时不允许有相同的变量。 

以下是对 include 两种用法的区别 , 主要有两个方面的不同 ;

    一 : 执行时间上 :

    &lt;%@ include file="relativeURI"%&gt; 是在翻译阶段执行

    &lt;jsp:include page="relativeURI" flush="true" /&gt; 在请求处理阶段执行 .

    二 : 引入内容的不同 :

    &lt;%@ include file="relativeURI"%&gt;

    引入静态文本 (html,jsp), 在 JSP 页面被转化成 servlet 之前和它融和到一起 .

    &lt;jsp:include page="relativeURI" flush="true" /&gt; 引入执行页面或 servlet 所生成的应答文本 .