集合相关面试题

List、Set、Map 是否继承自Collection 接口?

  1. List 是一个接口,它继承自 Collection 接口。List 接口定义了一个有序的集合,可以包含重复的元素。
  2. Set 也是一个接口,它继承自 Collection 接口。Set 接口定义了一个不允许重复元素的集合。
  3. Map 则不同,它不是一个继承自 Collection 接口的接口。Map 提供了键值对的存储,它继承自 Map 接口本身,而不是 CollectionMap 接口不继承自 Collection,因为它的行为和 Collection 接口所定义的行为不同。Map 接口中的集合视图(键集视图、值集视图和条目集视图)实现了 Collection 接口。

所以,总结来说,ListSet 继承自 Collection 接口,而 Map 则不继承自 Collection 接口。

阐述ArrayList、Vector、LinkedList 的存储性能和特性?

  1. ArrayList
    • 底层结构ArrayList 基于动态数组实现,可以看作是可以动态增长和缩小的数组。
    • 插入和删除性能:在列表的末尾添加元素(或在任何位置插入元素,但不包括列表的开头)时,性能较好,因为只需要移动插入点后面的元素。但如果在列表的开头或中间插入或删除元素,可能需要移动大量元素,这会导致性能下降,时间复杂度为 O(n)。
    • 内存占用ArrayList 通常占用的内存比 LinkedList 少,因为它不需要为每个元素存储额外的指针。
    • 线程安全ArrayList 是非线程安全的。
  2. Vector
    • 底层结构Vector 也是基于动态数组实现的,与 ArrayList 类似,但它是同步的。
    • 随机访问性能:和 ArrayList 一样,Vector 在随机访问时性能也很好,时间复杂度为 O(1)。
    • 插入和删除性能:与 ArrayList 类似,Vector 在列表末尾添加元素时性能较好,但在列表开头或中间插入或删除元素时性能较差,时间复杂度为 O(n)。
    • 内存占用Vector 通常比 ArrayList 占用更多的内存,因为它是同步的,需要额外的内存来支持线程安全。
    • 线程安全Vector 是线程安全的,因为它的所有公共方法都是同步的,这在多线程环境中很有用,但也意味着在单线程环境中可能会有性能损失。
  3. LinkedList
    • 底层结构LinkedList 是基于双向链表实现的。
    • 随机访问性能:由于是基于链表实现的,LinkedList 在随机访问时性能较差,时间复杂度为 O(n),因为它需要从头开始遍历链表直到找到目标元素。
    • 插入和删除性能LinkedList 在列表的任何位置插入或删除元素时性能都很好,时间复杂度为 O(1),因为只需要更改几个节点的指针即可。
    • 内存占用LinkedList 通常比 ArrayList 占用更多的内存,因为每个元素都需要存储额外的指针(指向前一个和后一个元素的指针)。
    • 线程安全LinkedList 是非线程安全的。

在选择这三种列表实现时,需要根据具体的应用场景来决定。如果需要频繁的随机访问,ArrayList 可能是更好的选择。如果需要频繁的插入和删除操作,尤其是在列表的开头或中间,LinkedList 可能更合适。而如果需要线程安全的集合,可以考虑使用 Vector 或者 Collections.synchronizedList 方法包装 ArrayList

Collection 和Collections 的区别?

  1. Collection
    • Collection 是一个接口,它是Java集合框架中最基本的接口之一。
    • 它定义了一组方法,这些方法可以对集合进行操作,如添加、删除、遍历等。
    • Collection 接口是其他具体集合接口的父接口,如 ListSet
    • Collection 接口本身不提供任何实现,它只是定义了一组操作集合的标准方法。
  2. Collections
    • Collections 是一个包含静态方法的工具类,它提供了一系列操作或返回各种类型的不可变或可变集合的实用方法。
    • 它包含了一些有用的静态方法,如排序(sort)、搜索(binarySearch)、反转(reverse)、填充(fill)等。
    • Collections 类还提供了一些工厂方法来创建不可修改的集合、同步集合等。
    • Collections 类中的所有方法都是静态的,因此你可以直接通过类名调用它们,而不需要创建 Collections 类的实例。

List、Map、Set 三个接口存取元素时,各有什么特点?`

  1. List
    • 存元素:在 List 中,元素是按照它们被插入的顺序存储的。你可以使用 add(index, element) 方法在特定位置插入元素,或者使用 add(element) 在列表末尾添加元素。
    • 取元素:可以通过索引直接访问元素,例如 get(index) 方法。也可以使用迭代器或增强的for循环遍历 List
    • 特点:允许元素重复,可以有多个相同的元素。
  2. Map
    • 存元素:在 Map 中,元素是以键值对的形式存储的。使用 put(key, value) 方法将键和值存入 Map。如果键已经存在,则其对应的值会被更新。
    • 取元素:可以通过键来获取对应的值,使用 get(key) 方法。也可以通过键集视图、值集视图或条目集视图来遍历 Map
    • 特点:不允许键重复,每个键最多只能映射到一个值。值可以重复。
  3. Set
    • 存元素:在 Set 中,元素是唯一的,不允许有重复的元素。使用 add(element) 方法添加元素。如果集合中已经存在该元素,则添加操作不会改变集合。
    • 取元素:通常使用迭代器或增强的for循环来遍历 Set,因为 Set 通常不保证元素的顺序。
    • 特点:不允许元素重复,每个元素都是唯一的。
posted @   蜡笔小新Belief  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示