在 Applet 中,方法执行的顺序是 ?( )

正确答案: A   你的答案: B (错误)

init(), start(), paint(),stop(),destroy().
init(),paint(),start(),stop(),destroy().
paint(),start(),stop(),destroy().
init(), start(),stop(),destroy(),paint().

解析:

        init 初始化,start启动运行,paint 窗口最小化等时候需要暂停,stop 停止,destory 销毁;

通过HttpServletRequest. getParameter获取的参数.

正确答案: C   你的答案: D (错误)

总是采用UTF-8编码
总是采用lS08859-1编码
由客户端浏览器和Web容器配置共同决定编码
由服务器所在的操作系统决定编码

解析:

        1、浏览器根据jsp页面开头声明的编码方式对request中参数编码;
        2、tomcat默认解码是ISO-8859-1, 但是我们可以显示指定解码格式通过调用 request.setCharacterEncoding("UTF-8"),或者修改tomcat的配置文件server.xml中的编码,添加uriEncoding属性

对于java类型变量char c,short s,float f,double d,表达式c*s+f+d的结果类型为()

正确答案: D   你的答案: D (正确)

float
char
short
double

解析:

        自动类型转换遵循下面的规则:
                1.若参与运算的数据类型不同,则先转换成同一类型,然后进行运算。
                2.转换按数据长度增加的方向进行,以保证精度不降低。例如int型和long型运算时,先把int量转成long型后再进行运算。
                3.所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
                4.char型和short型参与运算时,必须先转换成int型。
                5.在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型将转换为左边变量的类型。如果右边表达式的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度。
                下图表示了类型自动转换的规则:
                

观察以下代码:

class Car extends Vehicle
{
    public static void main (String[] args)
    {
        new  Car(). run();
    }
    private final void run()
    {
        System. out. println ("Car");
    }
}
class Vehicle
{
    private final void run()
    {
        System. out. println("Vehicle");
    }
}
下列哪些针对代码运行结果的描述是正确的?

正确答案: A   你的答案: B (错误)

Car
Vehicle
Compiler error at line 3
Compiler error at line 5
Exception thrown at runtime

解析:    

        首先final声明的方法是不能被覆盖的,但是这里并不错误,因为方法是private的,也就是子类没有继承父类的run方法,因此子类的run方法跟父类的run方法无关,并不是覆盖。new Car().run()也是调用子类的run方法。

如下代码的输出是

package Test;
public class Test {
    private static void test(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            try {
                if (arr[i] % 2 == 0) {
                    throw new NullPointerException();
                } else {
                    System.out.print(i);
                }
            } finally {
                System.out.print("e");
            }
        }
    }
 
    public static void main(String[]args) {
        try {
            test(new int[] {0, 1, 2, 3, 4, 5});
        } catch (Exception e) {
            System.out.print("E");
        }
    }
 
}
可以得到的结论是( )

正确答案: B   你的答案: A (错误)

编译出错
eE
Ee
eE1eE3eE5
Ee1Ee3Ee5

解析:

        由于arr[0] =0,所以在进入 test()方法里面会在第一个if 上抛出一个 NullPointerException,接着会执行 finally 的语句, (finally语句先于 return 和 throw语句执行),输出一个'e,然后回到 main方法中,由于捕捉到异常,所以进入到catch语句中,然后打印一个'E',所以最终结果为"eE"

下面哪个不属于HttpServletResponse接口完成的功能?

正确答案: C   你的答案: D (错误)

设置HTTP头标
设置cookie
读取路径信息
输出返回数据

解析:
        A:设置HTTP头标  
 1
response.setHeader("Refresh","3"); //三秒刷新页面一次
        B:设置cookie
1
2
Cookie c1 = newCookie("username","only");
response.addCookie(c1);
        C(错误):读取路径信息,request读取路径信息
1
2
3
4
5
从request获取各种路径总结
request.getRealPath("url"); // 虚拟目录映射为实际目录
request.getRealPath("./");    // 网页所在的目录
request.getRealPath("../"); // 网页所在目录的上一层目录
request.getContextPath();    // 应用的web目录的名称

        D:输出返回数据
1
HttpServleteResponse.getOutputStream().write();


运行代码,输出的结果是()

public class P {
public static int abc = 123;
static{
System.out.println("P is init");
}
}
public class S extends P {
static{
System.out.println("S is init");
}
}
public class Test {
public static void main(String[] args) {
System.out.println(S.abc);
}
}

正确答案: A   你的答案: D (错误)

P is init<br />123
S is init<br />P is init<br />123
P is init<br />S is init<br />123
S is init<br />123

解析:

        属于被动引用不会出发子类初始化 
               1.子类引用父类的静态字段,只会触发子类的加载、父类的初始化,不会导致子类初始化 
               2.通过数组定义来引用类,不会触发此类的初始化 
               3.常量在编译阶段会进行常量优化,将常量存入调用类的常量池中, 本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化。 

已知如下的命令执行 java MyTest a b c 请问哪个语句是正确的? ( )

正确答案: C D   你的答案: C D (正确)

args[0] = "MyTest a b c"
args[0] = "MyTest"
args[0] = "a"
args[1]= "b"

解析:

        对于java命令,类名后面跟着的就是main函数的参数,多个参数则用空格隔开。 main方法的形参是一个string数组所以对于java mytest a b c传入的参数算是一个string数组。 即args[0]=a args[1]=b args[2]=c

下面属于JSP内置对象的是?

正确答案: A B C D   你的答案: C D (错误)

out对象
response对象
application对象
page对象

解析:

    JSP内置对象有:
        1.request对象
             客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
        2.response对象
             response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
        3.session对象
             session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例.
        4.out对象
             out对象是JspWriter类的实例,是向客户端输出内容常用的对象
        5.page对象
             page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
        6.application对象
             application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
        7.exception对象
              exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
        8.pageContext对象
              pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本 类名也叫pageContext。
        9.config对象
              config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)

CMS垃圾回收器在那些阶段是没用用户线程参与的

正确答案: A C   你的答案: C D (错误)

初始标记
并发标记
重新标记
并发清理

解析:

CMS全称 Concurrent Mark Sweep,是一款并发的、使用标记-清除算法的垃圾回收器,以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器,对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。
CMS的基础算法是:标记—清除。
它的过程可以分为以下6个步骤:
  1. 初始标记(STW initial mark)
  2. 并发标记(Concurrent marking)
  3. 并发预清理(Concurrent precleaning)
  4. 重新标记(STW remark)
  5. 并发清理(Concurrent sweeping)
  6. 并发重置(Concurrent reset)

  1. 初始标记:在这个阶段,需要虚拟机停顿正在执行的任务,官方的叫法STW(Stop The Word)。这个过程从垃圾回收的"根对象"开始,只扫描到能够和"根对象"直接关联的对象,并作标记。所以这个过程虽然暂停了整个JVM,但是很快就完成了
  2. 并发标记:这个阶段紧随初始标记阶段,在初始标记的基础上继续向下追溯标记。并发标记阶段,应用程序的线程和并发标记的线程并发执行,所以用户不会感受到停顿
  3. 并发预清理:并发预清理阶段仍然是并发的。在这个阶段,虚拟机查找在执行并发标记阶段新进入老年代的对象(可能会有一些对象从新生代晋升到老年代, 或者有一些对象被分配到老年代)。通过重新扫描,减少下一个阶段"重新标记"的工作,因为下一个阶段会Stop The World。
  4. 重新标记:这个阶段会暂停虚拟机,收集器线程扫描在CMS堆中剩余的对象。扫描从"根对象"开始向下追溯,并处理对象关联。
  5. 并发清理:清理垃圾对象,这个阶段收集器线程和应用程序线程并发执行
  6. 并发重置:这个阶段,重置CMS收集器的数据结构,等待下一次垃圾回收。
        CMS不会整理、压缩堆空间,这样就带来一个问题:经过CMS收集的堆会产生空间碎片,CMS不对堆空间整理压缩节约了垃圾回收的停顿时间,但也带来的堆空间的浪费。
        为了解决堆空间浪费问题,CMS回收器不再采用简单的指针指向一块可用堆空 间来为下次对象分配使用。;而是把一些未分配的空间汇总成一个列表,当JVM分配对象空间的时候,会搜索这个列表找到足够大的空间来hold住这个对象。
        从上面的图可以看到,为了让应用程序不停顿,CMS线程和应用程序线程并发执行,这样就需要有更多的CPU,单纯靠线程切 换是不靠谱的。并且,重新标记阶段,为空保证STW快速完成,也要用到更多的甚至所有的CPU资源。
        B.并发标记 和 D.并发清理 这两个阶段是有用户线程参与的,所以答案选A和C。