一、选择题

1. Java语言中负责并发管理机制是 ( D )

A. 垃圾回收
B. 虚拟机
C. 代码安全
D. 多线程

2.下列关于线程的说法,正确的是 ( B )

A. 两个线程可以共享各类资源
B. 一个进程可以包含多个线程
C. 一个线程可以包含多个进程
D. 单个CPU的计算机上,2个线程实际上不能并发执行

解析:
在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)。
但无论如何,都是通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)。

并发和并行是即相似又有区别(微观概念):

  • 并行:指两个或多个事件在同一时刻点发生;
  • 并发:指两个或多个事件在同一时间段内发生。

3. 当线程调用start()方法后,其所处状态为 ( C )

A. 阻塞状态
B. 运行状态
C. 就绪状态
D. 新建状态

解析:线程的五个状态也就是它的生命周期:
新建状态----通过new关键字来创建线程对象
就绪状态----调用start()方法
运行状态----调用run()方法
阻塞状态----调用sleep()、wait()、join() 、yield()、interrupt ()等方法
消亡状态----调用stop()方法,但是此方法已经过时

4. 下列关于线程的优先级说法中,正确的是 ( BD )

A. 线程的优先级是不能改变的
B. 线程的优先级是在创建线程时设置的
C. 在创建线程后的任何时候都可以重新设置
D. 线程的优先级的范围在1-10之间

解析:线程的优先级可以通过setPriority(int newPriority)的方法进行设置
线程一共有三个优先级,分别是:最低优先级(1) 中等优先级(5)
最高优先级(10),咱们经常写的main方法就是中等优先级线程。

A:线程的优先级是可以更改也可以获取,但是有一点,即使设置为最高优先级也不一定先执行,只是它优先执行的几率比较高。
B:线程的优先级是在创建时进行设置,通过setPriority()方法设置
C:正在执行的线程是不允许重新设置线程优先级的。

5. 以下选项中关于Java中线程控制方法的说法正确的是 ( AD )

A. join () 的作用是阻塞指定线程等到另一个线程完成以后再继续执行
B. sleep () 的作用是让当前正在执行线程暂停,线程将转入就绪状态
C. yield () 的作用是使线程停止运行一段时间,将处于就绪状态
D. setDaemon()的作用是将指定的线程设置成守护线程

解析:
A:join()方法—线程的强制加入,加入的线程执行完毕之后再执行其他线程
B:sleep()方法—线程休眠,等时间过时,线程处于运行状态
C:yield()方法—线程礼让,让出CUP资源,其他线程先执行,有些与join()。
D:setDaemon()方法--将指定的线程设置成后台线程

6. 关于sleep()和wait(),以下描述错误的一项是 ( D ) 单选题

A. sleep是线程类(Thread)的方法,wait是Object类的方法
B. sleep不释放对象锁,wait放弃对象锁
C. sleep暂停线程、但监控状态任然保持,结束后会自动恢复
D. wait后进入等待锁定池,只针对此对象发出notify方法后获取对象锁进入运行状态。

解析:
针对此对象的notify方法后获取对象锁并进入就绪状态,而不是运行状态。另外针对此对象的notifyAll方法后也可能获取对象锁并进入就绪状态,而不是运行状态

7. 以下锁机机制中,不能保证线程安全的是 ( C ) 单选题

A. Lock
B. Synchronized
C. Volatile

8. 下面关于线程池好处说法不正确的是 ( D )

A. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
B. 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
C. 提高线程的可管理性。
D. 建立线程池会额外增加系统开销

9. 单选题 以下说法错误的是? ( D )

A. sleep方法的参数是以毫秒为单位的
B. 使用实现Runnable接口的方式创建线程,一定要重写run方法
C. 当创建线程对象,线程即进入新建状态
D. 调用sleep方法时,不需要处理异常

10. 下列对关键字synchronized说法错误的是 ( C )

A. synchronized(同步),即协调不同线程之间的工作
B. synchronized关键字可以用在成员方法中
C. 保证多个线程可以同时执行和结束
D. 保证共享对象在同一时刻只能被一个线程访问

11. 以下说法错误的是?(选择一项) ( D )

A. wait()方法用于使线程等待
B. notify()方法用于唤醒一个线程
C. notifyAll()方法用于唤醒多个线程
D. 使用wait()方法阻塞的线程,可以不用唤醒

12. 如果一个list初始化为{5,3,1},执行以下代码后,其结果为 ( B )

nums.add(6);
nums.add(0,4);
nums.remove(1);

A. [5, 3, 1, 6]
B. [4, 3, 1, 6]
C. [4, 3, 6]
D. [5, 3, 6]

13. 单选题 已知ArrayList的对象是list,以下哪个方法是判断ArrayList中是否包含”Hello”? ( A )

A. list.contains("hello");
B. list.add("hello");
C. list.remove("hello");
D. list.get("hello");

14. 单选题 下列哪个方法可以获取列表指定位置处的元素 ( D )

A. add(E e)
B. remove()
C. size()
D. get(int index)

15. 多选题 下列有关HashSet的描述正确的是 ( AC )

A. HashSet是Set的一个重要实现类
B. HashSet中的元素无序但可以重复
C. HashSet中只允许一个null元素
D. 不适用于存取和查找

16. 单选题 以下关于Set对象的创建错误的是? ( A )

A. Set set=new Set();
B. Set set=new HashSet();
C. HashSet set=new HashSet();
D. Set set=new HashSet(10);

17.以下关于Set和List的说法,正确的是? ( C )

A. Set中的元素是可以重复的
B. List中的元素是无序的
C. HashSet中只允许有一个null元素
D. List中的元素是不可以重复的

18. 下面哪个Set是排序的? ( C )

A. LinkedHashSet
B. HashSet
C. TreeSet
D. AbstractSet

19. 下列关于泛型的说法,错误的是 ( C )

A. 泛型是一种参数化类型
B. 增强了程序的灵活性和安全性
C. 可以取代继承机制
D. 泛型是JDK1.5出现的新特性

20. 关于枚举说法不正确的是 ( D )

A. 枚举是一组常量的集合
B. 不需要提供Set方法,枚举对象值通常为只读。
C. 对枚举对象/属性使用final和static关键字修饰,实现底层优化
D. 枚举对象名通常使用全部小写,常量的命名规范


二、简答题

1. ArrayList和LinkedList的区别

  • 数据结构不同 (数组 双向链表)

2.List和Set的区别

  • List:有序可重复
  • Set:无序不可重复

3.Set集合如何确保数据的不重复?

  • 重写hashcoce()和equals()

4.run()和start()的区别

  • start()启动线程,线程进入就绪状态
  • run() 执行线程任务,线程是running运行状态

三、上机题

第一题:把成绩低于80的成绩从集合中删除

首先定义一个ArrayList集合,在生成随机数,把成绩随机生成出来存到集合中,
最后在遍历集合,把成绩小于80的从集合中删除,删除用到remove()方法
import java.util.ArrayList;
import java.util.Random;
 
//成绩低于80的从集合中删除
public class ArrayList01 {
    public static void main(String[] args) {
 
        ArrayList<Integer> list = new ArrayList<>();
        Random r = new Random();
        for (int i = 0; i < 20; i++) {
            int i1 = r.nextInt(100);
            list.add(i1);
        }
 
        for (int i = 0; i < list.size(); i++) {
            int score = list.get(i);
            if (score < 80){
                list.remove(i);
                i--;
            }
        }
        System.out.println(list);
    }
}

第二题:写两个线程,一个线程打印 1-52,另一个线程打印A-Z,打印顺序是12A34B…5152Z

class Print1{
    private int flag=1;
    private int count=1;
    public synchronized void printNum(){
            while (flag!=1){
                try{
                    wait();
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
        System.out.print(2*count-1 );
        System.out.print(2*count);
        flag=2;
        notify();
        }

    public synchronized void Zimu(){
            while (flag!=2){
                try{
                    wait();
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
            System.out.print((char)(count-1+'A'));
            count++;
            flag=1;
            notify();
    }
}

public class TestAA {
    public static void main(String[] args) {
        Print1 print=new Print1();
        new Thread (()->{
            for(int i=0;i<26;i++){
                print.printNum();
            }
        }).start();

        new Thread(()->{
            for(int i=0;i<26;i++){
                print.Zimu();
            }
        }).start();
    }
}
最后修改:2023 年 01 月 09 日
如果觉得我的文章对你有用,请随意赞赏