一.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(){}),进行迭代。