集合常见面试题

一.List,Set,Map集合是否都继承自Collection接口

1.List,Set和Map的基本概念

  • List:一个有序集合(也称序列)。List中的元素是有序的,且可以重复。List接口的常用实现类由ArrayList,LinkedList等。
  • Set:一个不包含重复元素的集合。Set中的元素是无序的(虽然某些Set实现可能会维护元素的某种顺序,但这并不是Set接口的契约)。Set接口的常用实现类由HashSet,TreeSet。
  • Map:一个键值对映射。Map中的每一个元素都是一个键值对(Key-value),键(key)是唯一的,而值(value)可以是重复的。Map接口的常用实现类有HashMap,TreeMap。

2.List和Set

  • List和Set都是Collection接口的子接口。
  • 这意味着实现了List或Set接口的类都自动实现了Collection接口中定义的方法,如add(),remove(),contains(),size()等。

3.Map

  • Map接口并不继承自Collection接口。
  • Map表示一个键值对映射,而不是一个元素集合。因此,他又自己的方法来操作键值对,如put(),get(),remove()等。

二.阐述ArrayList,Vector,LinkedList的存储性能和特性

1.ArrayList

  • 存储性能:ArrayList基于动态数组实现,这意味着它在内存中分配一个数组来存储元素。当数组的容量不足以容纳更多元素时,ArrayList会创建一个更大的数组,并将旧数组中的所有元素复制到新数组中。
  • 添加和删除:在列表的末尾添加元素或访问元素时,ArrayList通常提供很好的性能。但是,如果在列表的中间或开始添加或删除元素,性能会下降,因为这需要移动插入点之后的所有元素。
  • 随机访问:ArrayList支持快速随机访问,即通过索引直接访问元素,这使得get和set操作非常快。
  • 线程安全:ArrayList不是线程安全的。

2.Vector

  • 存储性能:Vector也是基于动态数组实现的,与ArrayList相似,但它是同步的,即它的所有公共方法都是线程安全的。
  • 添加和删除:由于同步机制,Vector在添加或删除元素时可能会比ArrayList慢,因为每次都需要获取锁。
  • 随机访问:与ArrayList一样,Vector也支持快速访问
  • 线程安全:Vector是线程安全的,这种安全性是以牺牲性能换取的。

3.LinkedList

  • 存储性能:LinkedList是基于双向链表实现的,每个元素都包含对前一个和后一个元素的引用。
  • 添加和删除:LinkedList在列表的任何位置添加或删除元素都非常高效,因为它只需要改变几个节点的引用。但是,由于需要遍历链表来找到插入点,所以添加和删除元素的性能可能会受到列表大小的影响。
  • 随机访问:LinkedList不支持快速随机访问,因为要访问特定索引的元素,可能需要从头到尾遍历链表,这使得get和set操作比ArrayList慢。
  • 线程安全:LinkedList不是线程安全的。

4.总结:

  • 如果你需要频繁的随机访问元素,并且不关心线程安全,那么ArrayList是一个好的选择。
  • 如果你需要线程安全的集合,并且可以接受性能上的折中,那么可以选择Vector。
  • 如果你需要频繁的在列表中插入或删除元素,尤其是在列表的开始或中间位置,那么LinkedList是一个好的选择。

三.Collection和Collections的区别

1.Collection:

  • Collection是一个接口,他是Java集合框架中最基本的接口之一。
  • 它定义了一组方法,这些方法可以对集合进行操作,如添加,删除,遍历等。
  • Collection接口是List,Set和Queue等其他集合接口的父接口。
  • 他提供了一些通用的方法,如add(),remove(),contains(),size(),isEmpty(),iterator()等。

2.Collections:

  • Collections是一个包含静态方法的工具类,它提供了一系列操作或返回各种类型的Collections实例的方法。
  • 它位于java.util包中,用于操作或返回集合实例,而不是定义集合的结构。
  • Collections类中包括的方法:
    • 排序方法:如sort(),reverseOrder()等
    • 搜索和修改方法:binarySearch(),max(),min()等
    • 同步包装器:synchronizedList(),synchronizedSet(),用于提供线程安全的集合试图
    • 空集合:如emptyList(),emptySet()等,返回不可变的空集合

3.区别:

  • Collection是一个接口,定义了集合的行为和操作。
  • Collections是一个工具类,提供了一系列静态方法来操作或返回集合。

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

1.存放时:

List存放元素可以重复,存放元素是有序的(按插入顺序)

  • ArrayList,Vector(线程安全),根据特定的索引来存放元素。
  • linkedList:队列的实现,元素总是存放于尾部。
  • 方法:add(E e) :将指定的元素添加到此列表的尾部。add(int index, E element) :将指定的元素插入此列表中的指定位置。offer(E e) :将指定元素添加到此列表的末尾(最后一个元素)等。

Set存放元素不可重复

  • HashSet存放元素时无序的,根据元素hashcode存放元素;
  • LinkedHashSet存放元素是有序的,根据元素hashcode存放元素,但在HashSet的基础上同时使用链表,保证插入顺序。
  • TreeSet存放元素是有序的,根据指定数据内容存放,利用红黑树进行排序。

Map键值对,键不可重复,值可重复

  • HashMap,HashMap(线程安全)存放元素无序,根据键的hashcode存放键值对;
  • LinkedHashMap存放键值对有序,根据键的hashcode存放键值对,但在HashMap的基础上同时使用链表,保证插入顺序。
  • TreeMap存放键值对是有序的,根据键的指定内容存放,利用红黑树进行排序。

2.取出时:

List取出元素

(1)get(index)、poll()、peek()等方法;
(2)for循环;
(3)foreach循环;
(4)Iterator迭代器迭代。

Set取出元素

(1)foreach循环;
(2)Iterator迭代器迭代。

Map取出元素

(1)get(key)方法;
(2)entrySet()获得Set<Map.Entry<K,V>>,然后进行Set集合迭代;
(3)keySet()获得Set,然后结合get(key)方法,进行Set集合迭代;
(4).foreach(new BiConsumer(){}),进行迭代。

posted @ 2024-09-05 11:24  哒喇  阅读(29)  评论(0)    收藏  举报