不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 :php
此 20 题,绝对不仅是 20 题!html
免责声明:本博客为学习笔记,若有侵权请联系删除java
(1)下面有关 JVM 内存,说法错误的是?mysql
(2)下面有关 jdbc statement 的说法错误的是?spring
(3)下面有关 SPRING 的事务传播特性,说法错误的是?sql
(4)下面有关 servlet 和 cgi 的描述,说法错误的是?数据库
(5)下面有关 servlet service 描述错误的是?编程
(6)下列有关 Servlet 的生命周期,说法不正确的是?后端
(7)下面有关servlet中init,service,destroy方法描述错误的是?浏览器
(8)下面有关 struts1 和 struts2 的区别,描述错误的是?
(9)关于 AWT 和 Swing 说法正确的是?
(10)看如下代码:
文件名称:forward.jsp
<html> <head><title> 跳转 </title> </head> <body> <jsp:forward page="index.htm"/> </body> </html>
若是运行以上jsp文件,地址栏的内容为:
(11)下面哪一项不是加载驱动程序的方法?
(12)关于 sleep() 和 wait(),如下描述错误的一项是( )
(13)根据下面的程序代码,哪些选项的值返回 true?
public class Square { long width; public Square(long l) { width = l; } public static void main(String arg[]) { Square a, b, c; a = new Square(42L); b = new Square(42L); c = b; long s = 42L; } }
(14)在 jdk1.5 的环境下,有以下 4 条语句:
Integer i01 = 59; int i02 = 59; Integer i03 =Integer.valueOf(59); Integer i04 = new Integer(59);
如下输出结果为false的是:
(15)下面哪一个不对?
(16)关于如下程序代码的说明正确的是?
public class HasStatic{ private static int x=100; public static void main(String args[]){ HasStatic hs1=new HasStatic(); hs1.x++; HasStatic hs2=new HasStatic(); hs2.x++; hs1=new HasStatic(); hs1.x++; HasStatic.x--; System.out.println("x="+x); } }
(17)关于 struts 项目中的类与 MVC 模式的对应关系,说法错误的是:
(18)下面有关 jsp 中静态 include 和动态 include 的区别,说法错误的是?
(19)给定如下 JAVA 代码,这段代码运行后输出的结果是()
public class Test { public static int aMethod(int i)throws Exception { try{ return i / 10; } catch (Exception ex) { throw new Exception("exception in a Method"); } finally{ System.out.printf("finally"); } } public static void main(String [] args) { try { aMethod(0); } catch (Exception ex) { System.out.printf("exception in main"); } System.out.printf("finished"); } }
(20)对于 JVM 内存配置参数:
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
,其最小内存值和 Survivor 区总大小分别是()
原文地址:查看原文
选项从上到下为,A,B,C,D
(1)下面有关 JVM 内存,说法错误的是?
答案:C 、解析:
大多数 JVM 将内存区域划分为:
Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) , VM Stack(虚拟机栈,也有翻译成 JAVA 方法栈的),Native Method Stack ( 本地方法栈 )
其中 Method Area 和 Heap 是 线程共享的 ,
VM Stack,Native Method Stack 和 Program Counter Register 是非线程共享 的。
为何分为 线程共享和非线程共享的呢?请继续往下看。
首先咱们熟悉一下一个通常性的 Java 程序的工做过程。一个 Java 源程序文件,会被编译为字节码文件(以 class 为扩展名),每一个 java 程序都须要运行在本身的 JVM 上,而后告知 JVM 程序的运行入口,再被 JVM 经过字节码解释器加载运行。那么程序开始运行后,都是如何涉及到各内存区域的呢?
归纳地说来,JVM 初始运行的时候都会分配好 Method Area(方法区) 和 Heap(堆) ,而 JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器), VM Stack(虚拟机栈)和Native Method Stack(本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为何我把内存区域分为线程共享和非线程共享的缘由,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与 JAVA 程序运行的生命周期相同,因此这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来讲知发生在 Heap上)的缘由。
(2)下面有关 jdbc statement 的说法错误的是?
答案:C、解析:
JDBC statement 中的 PReparedStatement 的占位符对应着即将与之对应当值,而且一个占位符只能对应一个值,若是能对应多个就会引发混淆。sql 语句是肯定的,那么一个占位符一定只能对应一个值。
(1)Statement、PreparedStatement 和 CallableStatement 都是接口(interface)。
(2)Statement 继承自 Wrapper、PreparedStatement 继承自 Statement、CallableStatement 继承自 PreparedStatement。
(3)
Statement 接口提供了执行语句和获取结果的基本方法;
PreparedStatement 接口添加了处理 IN 参数的方法;
CallableStatement 接口添加了处理 OUT 参数的方法。
(4)
a.Statement:
普通的不带参的查询 SQL;支持批量更新,批量删除;
b.PreparedStatement:
可变参数的SQL,编译一次,执行屡次,效率高;
安全性好,有效防止 SQL 注入等问题;
支持批量更新,批量删除;
c.CallableStatement:
继承自PreparedStatement,支持带参数的SQL操做;
支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持;
(5)
Statement 每次执行 sql 语句,数据库都要执行 sql 语句的编译 ,
最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement。
PreparedStatement 是预编译的,使用 PreparedStatement 有几个好处
1.在执行可变参数的一条 SQL 时,PreparedStatement 比 Statement 的效率高,由于 DBMS 预编译一条 SQL 固然会比屡次编译一条 SQL 的效率要高。
2.安全性好,有效防止 SQL 注入等问题。
3.对于屡次重复执行的语句,使用 PreparedStament 效率会更高一点,而且在这种状况下也比较适合使用 batch;
4.代码的可读性和可维护性。
(3)下面有关 SPRING 的事务传播特性,说法错误的是?
答案:B、解析:
PROPAGATION_SUPPORTS -- 支持当前事务,若是当前没有事务,就以非事务方式执行。
PROPAGATION_REQUIRED -- 支持当前事务,若是当前没有事务,就新建一个事务。这是最多见的选择。
PROPAGATION_MANDATORY -- 支持当前事务,若是当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW -- 新建事务,若是当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操做,若是当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER -- 以非事务方式执行,若是当前存在事务,则抛出异常。
扩展:
事务属性的种类: 传播行为、隔离级别、只读和事务超时
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(2) 隔离级别
在操做数据时可能带来 3 个反作用,分别是脏读、不可重复读、幻读。为了不这 3 中反作用的发生,在标准的 SQL 语句中定义了 4 种隔离级别,分别是未提交读、已提交读、可重复读、可序列化。而在 spring 事务中提供了 5 种隔离级别来对应在 SQL 中定义的 4 种隔离级别,以下:
|
|
|
|
|
|
|
|
|
|
|
|
(3)只读
若是在一个事务中全部关于数据库的操做都是只读的,也就是说,这些操做只读取数据库中的数据,而并不更新数据,那么应将事务设为只读模式( READ_ONLY_MARKER ) , 这样更有利于数据库进行优化 。
由于只读的优化措施是事务启动后由数据库实施的,所以,只有将那些具备可能启动新事务的传播行为 (PROPAGATION_NESTED 、 PROPAGATION_REQUIRED 、 PROPAGATION_REQUIRED_NEW) 的方法的事务标记成只读才有意义。
若是使用 Hibernate 做为持久化机制,那么将事务标记为只读后,会将 Hibernate 的 flush 模式设置为 FULSH_NEVER, 以告诉 Hibernate 避免和数据库之间进行没必要要的同步,并将全部更新延迟到事务结束。
若是一个事务长时间运行,这时为了尽可能避免浪费系统资源,应为这个事务设置一个有效时间,使其等待数秒后自动回滚。与设
置“只读”属性同样,事务有效属性也须要给那些具备可能启动新事物的传播行为的方法的事务标记成只读才有意义。
(4)下面有关 servlet 和 cgi 的描述,说法错误的是?
答案:D、解析:
servlet 处于服务器进程中,它经过多线程方式运行其 service 方法,一个实例能够服务于多个请求,而且其实例通常不会销毁,而 CGI 对每一个请求都产生新的进程,服务完成后就销毁,因此效率上低于 servlet。
扩展:
Servlet 与 CGI 的比较
和 CGI 程序同样,Servlet 能够响应用户的指令(提交一个 FORM 等等),也能够象 CGI 程序同样,收集用户表单的信息并给予动态反馈(简单的注册信息录入和检查错误)。
然而,Servlet 的机制并不只仅是这样简单的与用户表单进行交互。传统技术中,动态的网页创建和显示都是经过 CGI 来实现的,可是,有了Servlet,您能够大胆的放弃全部 CGI(perl?php?甚至asp!),利用Servlet代替CGI,进行程序编写。
对比一:当用户浏览器发出一个 Http/CGI 的请求,或者说 调用一个 CGI程序的时候,服务器端就要新启用一个进程 (并且是每次都要调用),调用 CGI 程序越多(特别是访问量高的时候),就要消耗系统越多的处理时间,只剩下愈来愈少的系统资源,对于用户来讲,只能是漫长的等待服务器端的返回页面了,这对于电子商务激烈发展的今天来讲,不能不说是一种技术上的遗憾。
而 Servlet 充分发挥了服务器端的资源并高效的利用。每次调用Servlet时并非新启用一个进程 ,而是在一个 Web 服务器的进程敏感词享和分离线程,而线程最大的好处在于能够共享一个数据源,使系统资源被有效利用。
对比二:传统的 CGI 程序,不具有平台无关性特征,系统环境发生变化,CGI 程序就要瘫痪,而 Servlet 具有 Java 的平台无关性,在系统开发过程当中保持了系统的可扩展性、高效性。
对比三:传统技术中,通常大都为二层的系统架构,即 Web 服务器+数据库服务器,致使网站访问量大的时候,没法克服 CGI 程序与数据库创建链接时速度慢的瓶颈,从而死机、数据库死锁现象频繁发生。而咱们的 Servlet 有链接池的概念,它能够利用多线程的优势,在系统缓存中事先创建好若干与数据库的链接,到时候若想和数据库打交道能够随时跟系统"要"一个链接便可,反应速度可想而知。
(5)下面有关 servlet service 描述错误的是?
答案:B、解析:
doGet/doPost 则是在 javax.servlet.http.HttpServlet 中实现的
而 GenericServlet 抽象类 给出了设计 servlet 的一些骨架,定义了 servlet 生命周期,还有一些获得名字、配置、初始化参数的方法,其设计的是和应用层协议无关的
(6)下列有关 Servlet 的生命周期,说法不正确的是?
答案:A、解析:
建立 Servlet 的实例是由 Servlet 容器来完成的,且建立 Servlet 实例是在初始化方法 init() 以前
Servlet 的生命周期:
Servlet 的生命周期分为5个阶段:加载、建立、初始化、处理客户请求、卸载。
(7)下面有关servlet中init,service,destroy方法描述错误的是?
答案:D、解析:
servlet 在多线程下其自己并非线程安全的。
若是在类中定义成员变量,而在 service 中根据不一样的线程对该成员变量进行更改,那么在并发的时候就会引发错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。因为方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,所以才作到线程安全。
(8)下面有关struts1和struts2的区别,描述错误的是?
答案:B、解析:
从 action 类上分析:
1.Struts1 要求 Action 类继承一个抽象基类。Struts1 的一个广泛问题是使用抽象类编程而不是接口。
从 action 线程模式分析:
(9)关于 AWT 和 Swing 说法正确的是?
答案:D、解析:
AWT,抽象窗口工具包,是 Java 提供的创建图形用户界面的工具集,可用于生成现代的、鼠标控制的图形应用接口,且无需修改,就能够在各类软硬件平台上运行。
而 swing 是 Java 语言在编写图形用户界面方面的新技术,Swing 采用模型-视图-控制设计范式,Swing 可使 Java 程序在同一个平台上运行时可以有不一样外观以供用户选择。
二者不一样在于一个是初代工具集,一个是进化版的工具集,用户不会再知足于初始的功能,而是更加注重于附加价值,明显从这点上,Swing 是比 AWT 要好不少。
写法上,Swing 的头文件引用包须要用到 Javax,组件调用时也须要在 AWT 的基础上加上 “J”。
(10)看如下代码:
文件名称:forward.jsp
<html> <head><title> 跳转 </title> </head> <body> <jsp:forward page="index.htm"/> </body> </html>
若是运行以上jsp文件,地址栏的内容为:
答案:A、解析:
redirect:请求重定向:客户端行为,本质上为2次请求,地址栏改变,前一次请求对象消失。举例:你去银行办事(forward.jsp),结果告诉你少带了东西,你得先去公安局办(index.html)临时身份证,这时你就会走出银行,本身前往公安局,地址栏变为index.html.
forward:请求转发:服务器行为,地址栏不变。举例:你把钱包落在出租车上,你去警察局(forward.jsp)报案,警察局说钱包落在某某公司的出租车上(index.html),这时你不用亲自去找某某公司的出租车,警察局让出租车本身给你送来,你只要在警察局等就行。因此地址栏不变,依然为forward.jsp
(11)下面哪一项不是加载驱动程序的方法?
答案:A、解析:
加载驱动方法:
1.Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
2.DriverManager.registerDriver(new com.mysql.jdbc.Driver());
3.System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
(12)关于sleep()和wait(),如下描述错误的一项是( )
答案:D、解析:
Java中的多线程是一种抢占式的机制,而不是分时机制。抢占式的机制是有多个线程处于可运行状态,可是只有一个线程在运行。
共同点 :
1.他们都是在多线程的环境下,均可以在程序的调用处阻塞指定的毫秒数,并返回。
不一样点 :
1.每一个对象都有一个锁来控制同步访问。Synchronized 关键字能够和对象的锁交互,来实现线程的同步。
sleep 方法没有释放锁,而 wait 方法释放了锁,使得其余线程可使用同步控制块或者方法。
2.wait,notify 和 notifyAll 只能在同步控制方法或者同步控制块里面使用,而sleep能够在任何地方使用
3.sleep 必须捕获异常,而 wait,notify 和 notifyAll 不须要捕获异常
4.sleep 是线程类(Thread)的方法,致使此线程暂停执行指定时间,给执行机会给其余线程,可是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释放对象锁。
5.wait 是 Object 类的方法,对此对象调用 wait 方法致使本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或notifyAll)后本线程才进入对象锁定池准备得到对象锁进入运行状态。
(13)根据下面的程序代码,哪些选项的值返回 true?
public class Square { long width; public Square(long l) { width = l; } public static void main(String arg[]) { Square a, b, c; a = new Square(42L); b = new Square(42L); c = b; long s = 42L; } }
答案:C、解析:
a = new Square(42L); b = new Square(42L);
这里 new 了两个对象,因此 a,b 不是同一个引用 a!=b
s 的类型跟 a,b 不一样类型,因此 s!=a,s!=b
c = b;
这里 b,c 是同一个对象的引用,因此 b==c 是 true
(14)在 jdk1.5 的环境下,有以下 4 条语句:
Integer i01 = 59; int i02 = 59; Integer i03 =Integer.valueOf(59); Integer i04 = new Integer(59);
如下输出结果为false的是:
答案:C、解析:
JVM 中一个字节如下的整型数据会在 JVM 启动的时候加载进内存,除非用 new Integer() 显式的建立对象,不然都是同一个对象
全部只有 i04 是一个新对象,其余都是同一个对象。全部 A,B 选项为 true
C选项 i03 和 i04 是两个不一样的对象,返回 false
D选项 i02 是基本数据类型,比较的时候比较的是数值,返回 true
(15)下面哪一个不对?
答案:C、解析:
四个选项都来自于Java API原文
A选项是RuntimeException的定义;
B选项是把Error的第二段定义拿来改掉换成RuntimeException,但这样说对于RuntimeException也没错;
C选项也是把Error的定义换成了RuntimeException,但这里的"indicates serious problems"不该该用在RuntimeException上,Error才表示严重的错误,RuntimeException并非.
D选项显然.
运行时异常:
都是 RuntimeException 类及其子类异常,如 NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中能够选择捕获处理,也能够不处理。这些异常通常是由程序逻辑错误引发的,程序应该从逻辑角度尽量避免这类异常的发生。
运行时异常的特色是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即便没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译经过。
非运行时异常 (编译异常): 是 RuntimeException 之外的异常,类型上都属于 Exception 类及其子类。从程序语法角度讲是必须进行处理的异常,若是不处理,程序就不能编译经过。如 IOException、SQLException 等以及用户自定义的 Exception 异常,通常状况下不自定义检查异常。
(16)关于如下程序代码的说明正确的是?
public class HasStatic{ private static int x=100; public static void main(String args[]){ HasStatic hs1=new HasStatic(); hs1.x++; HasStatic hs2=new HasStatic(); hs2.x++; hs1=new HasStatic(); hs1.x++; HasStatic.x--; System.out.println("x="+x); } }
答案:D、解析:
main 是 HasStatic 的静态方法,在其内部可直接访问静态变量,不存在由于私有变量不能经过编译的问题;若是在其余类中,包括 HasStatic 的派生类中,均不能访问其私有静态变量
(17)关于struts项目中的类与MVC模式的对应关系,说法错误的是:
答案:C、D 解析:
(18)下面有关 jsp 中静态 include 和动态 include 的区别,说法错误的是?
答案:D、解析:
动态 INCLUDE 用 jsp:include 动做实现
静态 INCLUDE 用 include 伪码实现 , 定不会检查所含文件的变化 , 适用于包含静态页面 <%@ include file="included.htm" %> 。先将文件的代码被原封不动地加入到了主页面从而合成一个文件,而后再进行翻译,此时不容许有相同的变量。
如下是对 include 两种用法的区别 , 主要有两个方面的不一样 ;
一 : 执行时间上 :
<%@ include file="relativeURI"%> 是在翻译阶段执行
二 : 引入内容的不一样 :
<%@ include file="relativeURI"%>
引入静态文本 (html,jsp), 在 JSP 页面被转化成 servlet 以前和它融和到一块儿 .
(19)给定如下JAVA代码,这段代码运行后输出的结果是()
public class Test { public static int aMethod(int i)throws Exception { try{ return i / 10; } catch (Exception ex) { throw new Exception("exception in a Method"); } finally{ System.out.printf("finally"); } } public static void main(String [] args) { try { aMethod(0); } catch (Exception ex) { System.out.printf("exception in main"); } System.out.printf("finished"); } }
答案:B、解析:
i / 10;不管 i 是多少,永远不会抛出异常,因此 catch 语句不会执行。
而 finally 语句是一定执行的语句。
因此先指向 aMathod() 的 finally 代码块,输出 finally
而后执行 main() 方法的最后一条输出语句,输出 finished
(20)对于 JVM 内存配置参数:
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
,其最小内存值和 Survivor 区总大小分别是()
答案:D、解析: -Xmx:最大堆大小 -Xms:初始堆大小 -Xmn:年轻代大小 -XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值 年轻代5120m, Eden:Survivor=3,Survivor区大小=1024m(Survivor区有两个,即将年轻代分为5份,每一个Survivor区占一份),总大小为2048m。 -Xms 初始堆大小即最小内存值为 10240m