哈喽各位Java入门的宝子们~👋 上一篇刚把Collection和List的理论知识讲透,这篇直接上硬菜——精选20道高频练习题!从基础判断、选择,到代码阅读、实战编程,全方位帮你巩固知识点,避开高频坑!

毕竟学编程光听不练假把式,跟着这些题目过一遍,保证你对ArrayList、LinkedList的理解再上一个台阶~ 话不多说,开刷!

一、判断题:先踩稳基础坑

这部分全是入门高频考点,先自己做一遍,再看解析哦!答案已经标在题目后啦~

  • 1. Vector集合类是线程不安全的。×

  • 👉 解析:Vector是线程安全的!它的方法都加了synchronized锁,这也是它效率比ArrayList低、现在基本被淘汰的原因。

  • 2. ArrayList集合是基于数组实现的。√

  • 👉 解析:ArrayList的底层就是动态数组,能自动扩容,这也是它查询(get/set)快、增删慢的核心原因。

  • 3. List集合中的数据元素是有序可重复的。√

  • 👉 解析:这是List和Set最核心的区别!List保证“存取有序”(存的顺序和取的顺序一致),且元素可以重复;Set则是无序不可重复。

  • 4. ArrayList集合属于Map集合。×

  • 👉 解析:ArrayList继承自List,而List是Collection的子接口;Map是独立的双列集合体系(键值对存储),和Collection没有继承关系,完全是两个分支。

  • 5. ArrayList集合的长度是不可变的。×

  • 👉 解析:ArrayList是“动态数组”,长度可变!它会在元素存满时自动扩容(默认扩容为原来的1.5倍),解决了普通数组长度固定的痛点。

  • 6. Vector之所以称为遗留集合类是因为它出现在Collection之前,在Collection出现之后进行了改造,实现了List接口,融入了Collection集合框架。√

  • 👉 解析:Vector是Java早期的集合类,比Collection框架出现得早,后来为了兼容才实现了List接口,归入Collection体系,所以被称为“遗留类”。

  • 7. Vector集合类是基于数组实现的、线程同步的集合类。√

  • 👉 解析:Vector底层也是数组,核心特点就是线程同步(安全),但牺牲了效率,现在多用电竞CopyOnWriteArrayList替代。

二、选择题:吃透核心区别

选择题主要考察List子类的区别、方法使用,很多选项都是高频易错点,一定要仔细看解析!

1. 下面选项中哪些属于List集合?(ABD )

  • A. ArrayList集合 B. Vector集合 C. Set集合 D. LinkedList 集合

  • 👉 解析:List的核心实现类就是ArrayList、Vector、LinkedList;Set是和List平级的接口,不属于List体系。

2. 下面关于ArrayList集合与LinkedList集合之间区别的描述中,正确的有( ABCD )

  • A. ArrayList是基于数组结构的集合

  • B. ArrayList遍历和随机访问元素的效率比较高

  • C. LinkedList采用链表存储方式

  • D. LinkedList插入,删除元素效率比较高

  • 👉 解析:这是ArrayList和LinkedList的核心区别!数组结构支持随机访问(按下标找元素),所以查询快;链表结构通过指针连接,增删只需改指针,所以增删快。

3. 下面关于LinkedList集合的描述正确的有(ABCD )

  • A. 基于链表实现 B. 实现了List接口 C. 实现了Queue接口 D. 插入,删除元素效率比较高

  • 👉 补充:LinkedList还实现了Deque接口(Queue的子接口),所以既能当List用,也能当队列、双端队列用,功能很灵活。

4. 下面对LinkedList集合的描述正确的有( ABCD )

  • A. 允许元素为null B. 通过索引访问 C. 元素可以重复 D. 基于链表实现

  • 👉 易错点:很多人以为LinkedList不能通过索引访问!其实它实现了List接口,支持get(int index)方法,只是底层需要遍历链表,效率比ArrayList低,并非“不能访问”。

5. 在List集合中,如何获取第一个元素?(A)

  • A. get(0) B. getFirst() C. first() D. head()

  • 👉 解析:List的通用方法是get(index),下标从0开始,所以第一个元素是get(0);getFirst()是LinkedList的特有方法,不是所有List都支持;C、D是不存在的方法。

三、代码阅读:看透集合操作的执行过程

给出一段ArrayList操作代码,先自己分析执行结果,再看解析,锻炼对集合增删改操作的理解!


👉 关键:add(int index, E element)是“插入”不是“替换”,会导致后续元素后移;而set(int index, E element)才是替换指定下标的元素,不改变集合长度。

四、编程题:实战演练,巩固核心方法

编程题是重点!每道题都给出“思路+代码+注释”,建议先自己写,再对比参考代码~

编程题1:ArrayList综合操作

需求:

  1. 正确定义集合类

  2. 生成20个100以内的随机数并加入集合

  3. 使用for循环遍历集合并输出

  4. 遍历ArrayList集合,计算所有偶数的和

  5. 将集合中所有大于等于80的数字的值替换为79

  6. 查找集合中是否存在数字25,输出提示

  7. 遍历集合,删除集合中所有小于10的数字


👉 易错点:删除元素时,正序遍历会导致下标偏移(删了i位置,i+1位置元素移到i,下一次循环i++会跳过),所以用倒序遍历或迭代器更安全。

编程题2:List元素查找与删除

需求:

  1. 创建集合并加入数据:“jack”,“rost”,“lisi”,“zhangsan”,“lisi”,“jetty”。

  2. 查找lisi第一次出现的下标,最后一次出现的下标。

  3. 删除集合中第一个和最后一个元素


👉 关键方法:indexOf(元素)返回第一次出现的下标,lastIndexOf(元素)返回最后一次出现的下标;删除最后一个元素时,用size()-1获取最后一个元素的下标。

编程题3:LinkedList综合操作(含异常处理)

需求:

  1. 键盘输入10个整数添加到LinkedList中,要求必须包含异常处理机制,确保程序在输入非法数据时不会崩溃。

  2. 计算并输出列表中所有元素的平均值。

  3. 找出并输出列表中的最大值和最小值。

  4. 将列表中的所有元素按升序排序并输出排序后的列表(推荐使用Collections工具类)


👉 重点:异常处理部分,用try-catch捕获输入非整数的异常,并用scanner.next()清空无效输入,避免程序进入死循环;Collections.sort()是工具类方法,可直接对List排序(默认升序)。

编程题4:ArrayList的所有遍历方式

需求:ArrayList中存储的元素是整型数字1~5,请使用所有方法遍历每个元素,将每个元素顺序输出

👉 常见遍历方式:普通for循环、增强for循环(foreach)、迭代器(Iterator)、列表迭代器(ListIterator)


总结

这20道练习题基本覆盖了List集合的核心知识点:子类区别、核心方法(add/remove/indexOf等)、遍历方式、异常处理、工具类使用等。

建议大家把编程题亲手敲一遍,尤其是“遍历删除”“异常处理”这些易错点,只有动手实践才能真正掌握~ 如果某道题有疑问,或者想练更多拓展题,评论区告诉我!

觉得有用的话,别忘了点赞+收藏,关注我后续更新Map集合的刷题篇哦!😘

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐