2021年10月13日 java2

考点1:

在java中,已定义两个接口B和C,要定义一个实现这两个接口的类,以下语句正确的是()

  • A interface A extends B,C
  • B interface A eimplements B,C
  • C class A implements B,C
  • D class A implements B,implements C
显示答案/隐藏答案正确答案: C

类实现多个接口的时候,只需要一个implements,多个接口通过逗号进行隔开,先继承类再实现接口

考点2:

在socket编程中,可以使用方法( )获取本机的ip地址

  • A getInetAddress()
  • B getLocalAddress()
  • C getReuseAddress()
  • D getLocalPort()
显示答案/隐藏答案正确答案: B

getInetAddress获取主机名和IP地址
getLocalAddress()顾名思义,获取本地IP地址
getReuseAddress()返回布尔类型,表示复用地址
getLocalPort()API 的说明:“Returns the Internet Protocol (IP) port number of the interface on which the request was received. ”

考点3:

下面有关servlet中init,service,destroy方法描述错误的是?

  • A init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法
  • B service()方法处理客户机发出的所有请求
  • C destroy()方法标志servlet生命周期的结束
  • D servlet在多线程下使用了同步机制,因此,在并发编程下servlet是线程安全的
显示答案/隐藏答案正确答案: D

答案为D。

servlet在多线程下其本身并不是线程安全的。

如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。

考点4:

下面代码运行结果是()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Test{    
public int add(int a,int b){
try {
return a+b;
}
catch (Exception e) {
System.out.println("catch语句块");
}
finally{
System.out.println("finally语句块");
}
return 0;
}
public static void main(String argv[]){
Test test =new Test();
System.out.println("和是:"+test.add(9, 34));
}
}
  • A catch语句块 和是:43
  • B 编译异常
  • C finally语句块 和是:43
  • D 和是:43 finally语句块
显示答案/隐藏答案正确答案: C

为什么不是先输出:和是 finally块 43的原因。

1
System.out.println("和是:"+test.add(9, 34));

这是进行字符串拼接是一个整体,所以首先是进入add方法中,进去之后先把先不运算result,而是输出finally块。
注意:此时finally块输出结果是:finally语句块,这句话首先打印到控制台中。打印完后返回来执行try中的return得到43,所以此时再将结果与”和是:”进行拼接,得到:和是43
所以此时控制台又多了一句话:和是43。加上之前finally先在控制台上的输出,所以结果为:
finally语句块 和是:43

考点5:

容器panel缺省使用的布局编辑策略是( )

  • A Border Layout
  • B Flow Layout
  • C GridLayout
  • D Card Layout
显示答案/隐藏答案正确答案: B

考点6:

下面有关servlet和cgi的描述,说法错误的是?

  • A servlet处于服务器进程中,它通过多线程方式运行其service方法
  • B CGI对每个请求都产生新的进程,服务完成后就销毁
  • C servlet在易用性上强于cgi,它提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等
  • D cgi在移植性上高于servlet,几乎所有的主流服务器都直接或通过插件支持cgi
显示答案/隐藏答案正确答案: D

选择D,servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

概括来讲,Servlet可以完成和CGI相同的功能。

CGI 通用网管接口

CGI(Common Gateway Interface通用网关接口)程序来实现数据在Web上的传输,使用的是如Perl这样的语言编写的,它对于客户端作出的每个请求,必须创建CGI程序的一个新实例,这样占用大量的内存资源。由此才引入了Servlet技术。

Servlet是一个用java编写的应用程序,在服务器上运行,处理请求信息并将其发送到客户端。对于客户端的请求,只需要创建Servlet的实例一次,因此节省了大量的内存资源。Servlet在初始化后就保留在内存中,因此每次作出请求时无需加载。

CGI应用开发比较困难,因为它要求程序员有处理参数传递的知识,这不是一种通用的技能。CGI不可移植,为某一特定平台编写的CGI应用只能运行于这一环境中。每一个CGI应用存在于一个由客户端请求激活的进程中,并且在请求被服务后被卸载。这种模式将引起很高的内存、CPU开销,而且在同一进程中不能服务多个客户。

Servlet提供了Java应用程序的所有优势——可移植、稳健、易开发。使用Servlet Tag技术,Servlet能够生成嵌于静态HTML页面中的动态内容。

Servlet对CGI的最主要优势在于一个Servlet被客户端发送的第一个请求激活,然后它将继续运行于后台,等待以后的请求。每个请求将生成一个新的线程,而不是一个完整的进程。多个客户能够在同一个进程中同时得到服务。一般来说,Servlet进程只是在Web Server卸载时被卸载。

原文:https://blog.csdn.net/zdwzzu2006/article/details/5945635

考点7:

关于匿名内部类叙述正确的是? ( )

  • A 匿名内部类可以继承一个基类,不可以实现一个接口
  • B 匿名内部类不可以定义构造器
  • C 匿名内部类不能用于形参
  • D 以上说法都不正确
显示答案/隐藏答案正确答案: B

在使用匿名内部类的过程中,我们需要注意如下几点:
1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
2、匿名内部类中是不能定义构造函数的。
3、匿名内部类中不能存在任何的静态成员变量和静态方法。
4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

考点8:

下面的对象创建方法中哪些会调用构造方法 ()?

  • A new语句创建对象
  • B 调用Java.io.ObjectInputStream的readObject方法
  • C java反射机制使用java.lang.Class或java.lang.reflect.Constructor的newInstance()方法
  • D 调用对象的clone()方法
显示答案/隐藏答案正确答案: AC

readObject ()对象反序列化
clone()只是拷贝而已
也就是说会绕过任何构造函数(有参和无参),因为clone方法的原理是从堆内存中以二进制流的方式进行拷贝,直接分配一块新内存。

考点9:

以下说法中正确的有?

  • A StringBuilder是 线程不安全的
  • B Java类可以同时用 abstract和final声明
  • C HashMap中,使用 get(key)==null可以 判断这个Hasmap是否包含这个key
  • D volatile关键字不保证对变量操作的原子性
显示答案/隐藏答案正确答案: AD

StringBuffer线程安全,StringBuilder线程不安全
get(key)只是获取 key 对应的 value,无法判断是否 key 存在;

volatile轻量级的同步机制,能保证数据的可见性,但不能保证数据的原子性;

考点10:待学习:并发编程

JDK提供的用于并发编程的同步器有哪些?

  • A Semaphore
  • B CyclicBarrier
  • C CountDownLatch
  • D Counter
显示答案/隐藏答案正确答案: ABC

答案:ABC
A,Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过
acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
B,CyclicBarrier 主要的方法就是一个:await()。await()
方法没被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此 CyclicBarrier 上面阻塞的线程开始运行。
C,直译过来就是倒计数(CountDown)门闩(Latch)。倒计数不用说,门闩的意思顾名思义就是阻止前进。在这里就是指
CountDownLatch.await() 方法在倒计数为0之前会阻塞当前线程。
D,Counter不是并发编程的同步器