Map接口和Collection接口是所有集合框架的父接口:
Collection接口的子接口包括:Set接口和List接口
Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等
Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
List接口及其实现
ArrayList
基于动态数组实现
允许快速随机访问元素
插入和删除操作可能需要移动其他元素,因此在中间位置插入和删除的时间复杂度为O(n)
非同步,不是线程安全的,可以使用使用Collections.synchronizedList(new ArrayList<>()) 创建一个同步的 ArrayList。
LinkedList
基于双向链表实现
允许快速插入删除元素
不能快速随机访问,访问元素的时间复杂度为O(n)
非同步,不是线程安全的。可以使用 Collections.synchronizedList(new LinkedList<>()) 创建一个同步的 LinkedList。
可以用做队列或双向队列
依赖于两个节点(一个头节点一个尾节点)
常用方法
添加
add(E e):在链表后添加一个元素; 通用方法 addFirst(E e):在链表头部插入一个元素; 特有方法 addLast(E e):在链表尾部添加一个元素; 特有方法
删除
removeFirst(E e):删除头,获取元素并删除; 特有方法 removeLast(E e):删除尾; 特有方法
查看
getFirst():获取第一个元素; 特有方法 getLast():获取最后一个元素; 特有方法
Stack
基于Vector实现,代表了后进先出()
是同步的,是线程安全的
push入栈、peek查看栈顶元素、pop出栈、empty是否为空、size()获取数目
Vector
基于动态数组实现,类似于ArrayList
同步的,是线程安全的
是需要线程安全的动态数组是使用,但是通常使用ArrayList和Collections.syschronizedList来代替
Set接口及其实现类
set其实一直在用map那一套
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable {
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT) == null;
}
// Other methods delegate to the underlying map
}
HashSet
元素存储HashSet 将元素添加到底层的 HashMap 中,键是元素的哈希码,值是一个占位符对象。HashSet的实现是基于HashMap的,他使用HashMap来存储元素,在HashSet中,元素被当作HashMap的键,而HashMap的值则是一个固定的占位符,通常是 PRESENT 对象(一个静态内部类对象)。这样做是为了节省空间,因为 HashSet 只关心元素的唯一性,不需要存储额外的值。
去重:HashSet 使用了 HashMap 键的唯一性来确保 HashSet 中不会有重复的元素。
不保证集合的迭代顺序,顺序可能会随时间变化。
方法委派:HashSet 的许多方法(如 add、remove、contains 等)都是通过调用底层 HashMap 的对应方法来实现的。
性能:由于 HashSet 是基于 HashMap 实现的,所以其性能与 HashMap 类似,添加、删除和查找操作的平均时间复杂度为 O(1)。
允许存储null值。
LinkedHashSet
LinkedHashSet 是 HashSet 的一个子类,它继承了 HashSet 的特性,并且保持了元素的插入顺序。下面是关于 LinkedHashSet 的一些关键点:
继承自HashSet并且使用链表维护元素的插入顺序
保证迭代顺序与插入顺序一致
允许存储null值。
插入、删除、和查找操作的时间复杂度为O(1)。
实现细节
当你向 LinkedHashSet 添加元素时,它会使用 LinkedHashMap 来存储元素。
每个元素被当作 LinkedHashMap 的键,值则是一个固定的占位符对象。
LinkedHashSet 通过委派 LinkedHashMap 来实现其 add、remove 和 contains 等方法。
TreeSet
TreeSet 是 Java 中实现 SortedSet 接口的一个集合类,它基于 TreeMap 实现,并且元素是按照自然顺序(或通过提供的比较器)排序的。以下是 TreeSet 的一些关键点:
基于红黑树(自平衡二叉搜索树)实现
元素是有序的,元素按照自然顺序(或通过Comparator指定的顺序)排
不允许存储null值(会抛出NullPointerException)
插入、删除、和查找操作的时间复杂度为O(log n)。