一.选择题
1. 一个栈的输入序列为 1 2 3 4 5,下列不可能是栈的输出序列的是(A)
A. 5 4 1 3 2
B. 2 3 4 1 5
C. 1 5 4 3 2
D. 2 3 1 4 5
2. 不同用户对同一对象拥有不同访问权限或某个客户端不能直接操作某个对象,但又必须 与之有所互动,这种情况最好使用什么设计模式(B)
A. Bridge 模式
B. Proxy 模式
C. Adapter 模式
D. Facade 模式
3. Integer a=127,b=127,c=128,d=128;a == b 与 c == d 的结果分别是(A )。
A. true; false
B. true; true;
C. false; false;
D. false; true
注:int基础类最大只能为127,在它的对象类中-128到127的数保存在静态区,而大于127的数保存在对象区,所以直接比较,相当于比较他们的地址,所以就是不相等的,但是比较他们的内容确实一样的
4. 以下哪项陈述是正确的? (D)
A. 垃圾回收线程的优先级很高,以保证不再使用的内存将被及时回收
B. 垃圾回收机制保证了 JAVA 程序不会出现内存溢出
C. 进入”Dead”状态的线程将被垃圾回收器回收
D. CMS 垃圾回收器一次回收周期会有第 2 次 STW;
E. 以上都不对
注:CMS 回收器在一次 GC 过程中会有两次短暂的 STW,一次是 initial mark 阶段,一次是 remark 阶段。
5. 指出下列程序运行的结果 (A)
A. Wicresoft and SSA
B. Wicresoft and SOA
C. Wicrecend and SSA
D. Wicrecend and SOA
```bash
这是一个 Java 代码示例,它的输出结果是 "Wicresoft and SSA"。在 main 方法中,创建了一个 Example 对象 ex,并调用了它的 change 方 法,传入了 ex.str 和 ex.ch 作为参数。在 change 方法中,对 str 进行了重新赋值,但是由于 Java 中的字符串是不可变的,所以实际上并没有改 变原来的字符串。而对 ch 数组进行了修改,将第二个元素 'O' 改为了 'S'。因此,输出结果中的 ex.str 仍然是 "Wicresoft",而 ex.ch 变成了 "SSA"。
```
7. 二分查找需求查找的元素是(),查找时间复杂度为()? C
A. 有序的,O(n)
B. 无序的,O(n)
C. 有序的,O(log n)
D. 无序的,O(log n)
E. 有序的,O(1)
F. 无序的,O(1)
注:二分查找又叫折半查找,需求待查找的"序列有序"。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找过程。直到查找到了为止,否则序列中没有待查的关键字
String str = new string(“x”+“y”)最终创建几个对象 C
A .1
B .2
C. 3
D. 4
首先,“x”和“y”是两个字符串常量,它们放在常量池中。当使用字符串连接运算符“+”时,会创建一个新的string对象作为连接结果,
这个对象也会放在常量池中。因此,第一个string对象是“xy”,存在于常量池中。接着,使用new操作符创建了另一个string对象。由于该字符串并没有在常量池中找到相同的字符串对象(“xy”),因此系统将创建一个新的string对象,并将其放置在堆上。所以最终一共创建了3个string对象。
List list = new ArrayList(20); list集合扩容了几次 A
A.0
B.1
C.2
D.3
这个问题需要知道 arraylist 这个类的内部机制。在 java 中,当我们创建一个指定了初始容量的 arraylist 对象时,实际上底层会创建一个长度为 0 的数组,并且当第一次添加元素时,数组的容量会被扩充为 10。
当数组中元素数量超出容量时,arraylist 会进行扩容,新容量的大小是当前容量的 1.5 倍(即增加原来容量的 50%)。因此,根据本题提供的代码,当 list 集合中存储的元素数量超过 20 时,就开始扩容。具体扩容次数取决于往该集合添加的元素数量和默认的扩容因子大小。也就是说,无法确定 list 集合最终扩容了多少次。
List、Set、Map哪个继承自Collection接口,一下说法正确的是©
A. List Map
B. Set Map
C. List Set
D. List Map Set
list 和 set 都继承自 collection 接口,而 map 不是。因此选项 a、b、d 都不正确。
在 java 中,list 表示有序的、可重复的集合,set 表示无序的、不可重复的集合。所以 list 和 set 可以视为 collection 接口的两个基本子类。
map 表示映射表,它提供了将键映射到值的方法,存储的元素是键值对(key-value pairs),而不是单独的元素。因此,map 不属于 collection 接口的直接子类。
以下结构中,插入性能最高的是(B)
A. ArrayList
B. Linkedlist
C. HashSet
D. TreeSet
Arraylist:
优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。
缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。
LinkedList:
优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。
缺点:因为LinkedList要移动指针,所以查询操作性能比较低。
以下结构中,哪个具有同步功能(B)
A. HashMap
B. ConcurrentHashMap
C. WeakHashMap
D. TreeMap
A,C,D都线程不安全,B线程安全,所以具有同步功能
下面哪个流类属于面向字符的输入流(D)选择一项)
A. BufferedWriter
B. FileInputStream
C. ObjectInputStream
D. InputStreamReader
BufferedWriter:字符输出的缓冲流
FileInputStream:字节输入流
ObjectInputStream:对象输入流
java类库中,将信息写入内存的类是(B)
A. Java.io.FileOutputStream
B. java.ByteArrayOutputStream
C. java.io.BufferedOutputStream
D. java,.io.DataOutputStream
ACD都是io到文件
下面程序的运行结果(B)(选择一项)
public static void main(String[] args) {
Thread t=new Thread(){
public void run(){
pong();
}
};
t.run();
System.out.println(“ping”);
}
static void pong(){
System.out.println(“pong”);
}
A. pingpong
B. pongping
C. pingpong和pongping都有可能
D. 都不输出
**启动线程需要调用start()方法,而t.run()方法,则是使用对象名**
下列哪个方法可用于创建一个可运行的类( A,B)
A. public class X implements Runnable{public void run() {……}}
B. public class X extends Thread{public void run() {……}}
C. public class X extends Thread{public int run() {……}}
D. public class X implements Runnable{protected void run() {……}}
AB继承Thread和实现Runable接口
在Java多线程中,请用下面哪种方式不会使线程进入阻塞状态(D)
A. sleep()
B. Suspend()
C. wait()
D. yield()
yield会是线程进入就绪状态
关于sleep()和wait(),以下描述错误的一项是(D)
A. sleep是线程类(Thread)的方法,wait是Object类的方法
B. Sleep不释放对象锁,wait放弃对象锁
C. Sleep暂停线程、但监控状态任然保持,结束后会自动恢复
D. Wait后进入等待锁定池,只针对此对象发出notify方法后获取对象锁进入运行状态。
针对此对象的notify方法后获取对象锁并进入就绪状态,而不是运行状态。另外针对此对象的notifyAll方法后也可能获取对象锁并进入就绪状态,而不是运行状态
以下锁机机制中,不能保证线程安全的是(C)
A. Lock
B. Synchronized
C. Volatile
下面所述步骤中,是创建进程做必须的步骤是(BC)
A. 由调度程序为进程分配CPU
B. 建立一个进程控制块
C. 为进程分配内存
D. 为进程分配文件描述符
B. 建立一个进程控制块是创建进程必须的步骤。当操作系统决定为一个新的进程分配资源时,它会建立一个进程控制块(process control block,pcb),即该进程在系统中的代表。pcb 包含了该进程的所有信息,如进程状态、优先级、寄存器值、进程 id、父子进程关系等。其它选项中的任务可以在后续的进程调度和内存管理中完成,但是没有建立进程控制块则不能算成一个完整的进程。
以下结构中,哪个最适合当作stack使用(C)
A. LinkedHashMap
B. LinkedHashSet
C. LinkedList
Stack是先进后出的线性结构;所以链表比较合适;不需要散列表的数据结构
下列叙述中正确的是(D)
A. 循环队列有队头和队尾两个指针,因此,循环队列是非线性结构
B. 在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况
C. 在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况
D. 在循环队列中元素的个数是由队头指针和队尾指针共同决定的
分析:循环队列中元素的个数是由队首指针和队尾指针共同决定的,元素的动态变化也是通过队首指针和队尾指针来反映的,当队首等于队尾时,队列为空。
Java中接口的修饰符可以为(D)(选择一项)
A.private
B.protected
C.final
D.abstract
接口中的访问权限修饰符只可以是public或default
接口中的所有的方法必须要实现类实现,所以不能使用final
接口中所有的方法默认都是abstract的,所以接口可以使用abstract修饰,但通常abstract可以省略不写
给定以下代码,程序将输出 (B)(选择一项)
class A {
public A(){
System.out.println(“A”);
}
}
class B extends A{
public B(){
System.out.println(“B”);
}
public static void main(String[] args) {
B b=new B();
}
}
A.不能通过编译
B.通过编译,输出AB
C.通过编译,输出B
D.通过编译,输出A
在继承关系下,创建子类对象,先执行父类的构造方法,再执行子类的构造方法。
下列关于关键字的使用说法错误的是(D)
A.abstract不能与final并列修饰同一个类
B.abstract类中可以有private的成员
C.abstract方法必须在abstract类中
D.static方法能处理非static的属性
因为static得方法在装载class得时候首先完成,比 构造方法早,此时非static得属性和方法还没有完成初始化所以不能调用。
下列哪些语句关于内存回收的说法是正确的(B)
A.程序员必须创建一个线程来释放内存
B.内存回收程序负责释放无用内存
C.内存回收程序允许程序员直接释放内存
D.内存回收程序可以在指定的时间释放内存对象
A. 程序员不需要创建线程来释放内存.
C. 也不允许程序员直接释放内存.
D. 不一定在什么时刻执行垃圾回收.
选出合理的标识符(AC)
A._sysl_111
B.2 mail
C.$change
D.class
标识符的命令规范,可以包含字母、数字、下划线、$,不能以数字开头,不能是Java关键字
下列说法正确的是(CD)(选择多项)
A.java.lang.Cloneable是类
B.java.langRunnable是接口
C.Double对象在java.lang包中
D.Double a=1.0是正确的java语句
a. java.lang.cloneable是接口,不是类。
b. java.lang.runnable是接口,不是类。
c. double是java中用于表示双精度浮点数的一个类,它在java.lang包中。
d. 这个java语句是正确的,它创建了一个double类型的变量a,并将其初始化为1.0。
以下对继承的描述锚误的是 (A)
A Java中的继承允许一个子类继承多个父类
B. 父类更具有通用性,子类更具体
C. Java中的继承存在着传递性
D. 当实例化子类时会递归调用父类中的构造方法
二.问答题
1、ThreadLocal 的使用场景,使用时需要注意什么?
使用场景:
1.对象跨层传递 2.线程间数据隔离。
3.进行事务操作,用于储存线程事务信息。
注:最常用存储用户Session等等
注意项:
1.ThreadLocal申明为private static final。
2.ThreadLocal使用后务必调用remove方法。
2、ThreadPoolExcutor 运行参数有哪些,平时使用 Executors 下封装过的线程池有什么风险吗?
参数:
corePoolSize:核心池的大小,最多可执行几条线程
maximumPoolSize:线程池最大线程数,线程池中最多能创建多少个线程;
keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。
unit:参数keepAliveTime的时间单位,例如:TimeUnit.SECONDS
workQueue:一个阻塞队列,用来存储等待执行的任务,缓存没有执行的线程,一般来说,一般使用LinkedBlockingQueue和SynchronousQueue。
threadFactory:用于设置创建线程的工厂,可实现RejectedExecutionHandler接口自定义策略。如记录日志或持久化不能处理的任务。
弊端:
FixedThreadPool 和 SingleThreadExecutor:允许请求的队列长度过大,可能堆积大量的请求,从而导致内存溢出。
CachedThreadPool 和 ScheduledThreadPool:允许创建的线程数量过大可能会创建大量线程,从而导致内存溢出。