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()
显示答案/隐藏答案
正确答案: BgetInetAddress获取主机名和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 | public class Test{ |
- 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()方法
显示答案/隐藏答案
正确答案: ACreadObject ()对象反序列化
clone()只是拷贝而已
也就是说会绕过任何构造函数(有参和无参),因为clone方法的原理是从堆内存中以二进制流的方式进行拷贝,直接分配一块新内存。
考点9:
以下说法中正确的有?
- A StringBuilder是 线程不安全的
- B Java类可以同时用 abstract和final声明
- C HashMap中,使用 get(key)==null可以 判断这个Hasmap是否包含这个key
- D volatile关键字不保证对变量操作的原子性
显示答案/隐藏答案
正确答案: ADStringBuffer线程安全,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不是并发编程的同步器