集合相关面试题
List、Set、Map 是否继承自Collection 接口?
List是一个接口,它继承自Collection接口。List接口定义了一个有序的集合,可以包含重复的元素。Set也是一个接口,它继承自Collection接口。Set接口定义了一个不允许重复元素的集合。Map则不同,它不是一个继承自Collection接口的接口。Map提供了键值对的存储,它继承自Map接口本身,而不是Collection。Map接口不继承自Collection,因为它的行为和Collection接口所定义的行为不同。Map接口中的集合视图(键集视图、值集视图和条目集视图)实现了Collection接口。
所以,总结来说,List 和 Set 继承自 Collection 接口,而 Map 则不继承自 Collection 接口。
阐述ArrayList、Vector、LinkedList 的存储性能和特性?
- ArrayList
- 底层结构:
ArrayList基于动态数组实现,可以看作是可以动态增长和缩小的数组。 - 插入和删除性能:在列表的末尾添加元素(或在任何位置插入元素,但不包括列表的开头)时,性能较好,因为只需要移动插入点后面的元素。但如果在列表的开头或中间插入或删除元素,可能需要移动大量元素,这会导致性能下降,时间复杂度为 O(n)。
- 内存占用:
ArrayList通常占用的内存比LinkedList少,因为它不需要为每个元素存储额外的指针。 - 线程安全:
ArrayList是非线程安全的。
- 底层结构:
- Vector
- 底层结构:
Vector也是基于动态数组实现的,与ArrayList类似,但它是同步的。 - 随机访问性能:和
ArrayList一样,Vector在随机访问时性能也很好,时间复杂度为 O(1)。 - 插入和删除性能:与
ArrayList类似,Vector在列表末尾添加元素时性能较好,但在列表开头或中间插入或删除元素时性能较差,时间复杂度为 O(n)。 - 内存占用:
Vector通常比ArrayList占用更多的内存,因为它是同步的,需要额外的内存来支持线程安全。 - 线程安全:
Vector是线程安全的,因为它的所有公共方法都是同步的,这在多线程环境中很有用,但也意味着在单线程环境中可能会有性能损失。
- 底层结构:
- LinkedList
- 底层结构:
LinkedList是基于双向链表实现的。 - 随机访问性能:由于是基于链表实现的,
LinkedList在随机访问时性能较差,时间复杂度为 O(n),因为它需要从头开始遍历链表直到找到目标元素。 - 插入和删除性能:
LinkedList在列表的任何位置插入或删除元素时性能都很好,时间复杂度为 O(1),因为只需要更改几个节点的指针即可。 - 内存占用:
LinkedList通常比ArrayList占用更多的内存,因为每个元素都需要存储额外的指针(指向前一个和后一个元素的指针)。 - 线程安全:
LinkedList是非线程安全的。
- 底层结构:
在选择这三种列表实现时,需要根据具体的应用场景来决定。如果需要频繁的随机访问,ArrayList 可能是更好的选择。如果需要频繁的插入和删除操作,尤其是在列表的开头或中间,LinkedList 可能更合适。而如果需要线程安全的集合,可以考虑使用 Vector 或者 Collections.synchronizedList 方法包装 ArrayList。
Collection 和Collections 的区别?
- Collection
Collection是一个接口,它是Java集合框架中最基本的接口之一。- 它定义了一组方法,这些方法可以对集合进行操作,如添加、删除、遍历等。
Collection接口是其他具体集合接口的父接口,如List和Set。Collection接口本身不提供任何实现,它只是定义了一组操作集合的标准方法。
- Collections
Collections是一个包含静态方法的工具类,它提供了一系列操作或返回各种类型的不可变或可变集合的实用方法。- 它包含了一些有用的静态方法,如排序(
sort)、搜索(binarySearch)、反转(reverse)、填充(fill)等。 Collections类还提供了一些工厂方法来创建不可修改的集合、同步集合等。Collections类中的所有方法都是静态的,因此你可以直接通过类名调用它们,而不需要创建Collections类的实例。
List、Map、Set 三个接口存取元素时,各有什么特点?`
- List
- 存元素:在
List中,元素是按照它们被插入的顺序存储的。你可以使用add(index, element)方法在特定位置插入元素,或者使用add(element)在列表末尾添加元素。 - 取元素:可以通过索引直接访问元素,例如
get(index)方法。也可以使用迭代器或增强的for循环遍历List。 - 特点:允许元素重复,可以有多个相同的元素。
- 存元素:在
- Map
- 存元素:在
Map中,元素是以键值对的形式存储的。使用put(key, value)方法将键和值存入Map。如果键已经存在,则其对应的值会被更新。 - 取元素:可以通过键来获取对应的值,使用
get(key)方法。也可以通过键集视图、值集视图或条目集视图来遍历Map。 - 特点:不允许键重复,每个键最多只能映射到一个值。值可以重复。
- 存元素:在
- Set
- 存元素:在
Set中,元素是唯一的,不允许有重复的元素。使用add(element)方法添加元素。如果集合中已经存在该元素,则添加操作不会改变集合。 - 取元素:通常使用迭代器或增强的for循环来遍历
Set,因为Set通常不保证元素的顺序。 - 特点:不允许元素重复,每个元素都是唯一的。
- 存元素:在
浙公网安备 33010602011771号