List接口的实现类有 ArrayList 和 LinkedList
还有一个实现类是Vector!
Set接口的实现类有 HashSet(常用,底层结构是HashMap,存key不存value) TreeSet(不常用)
最长的见的实现类是HashMap,底层是数组+链表或红黑树
不常见的实现类有 HashTable、TreeMap
put(K key, V value) //将指定的值与此映射中的指定键关联(可选操作)。
remove(Object key) //如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
get(Object key) // 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
containsKey(Object key) //如果此映射包含指定键的映射关系,则返回 true。
keySet() //返回此映射中包含的键的 Set 视图。
map.getOrDefault(key,1)
map.put(key, map.getOrDefault(key) + 1)
add()
remove() // index,obj
size()
isEmpty()
contains()
clear()
get() // index
Arraylist 基于数组初始大小为10, 1.5倍扩容
Vector,有synchronize关键字修饰方法,无参默认容量为10,2倍扩容
LinkedList 底层维护的是双向链表
set.add(null)
添加和取出的顺序不一致(无序的)
Arraylist : 底层obejct数组,查询快(根据索引查询),增删慢,线程不安全,效率高。
Vector : 底层object数组,查询快,增删慢,线程安全,效率低。几乎淘汰。
LinkedList:底层数据结构是链表,查询慢,增删快(依次插入),线程不安全,效率高
HashSet:基于HashMap 实现的,底层采⽤ HashMap 来保存元素 ,无序
TreeSet:底层通过TreeMap实现(TreeMap的实现就是红黑树算法)
ArrayQueue:底层 Object[]数组 + 双指针
PriorityQueue:底层Object[]数组来实现二叉堆。默认大顶堆。
HashMap:jdk1.7底层数组+链表,jdk1.8底层采用数组+链表/红黑树来存储key-value键值对。当链表的长度大于8时,链表会转化成红黑树。采用拉链法解决冲突(元素碰撞时,形成链表)。
HashTable:底层采用数组+链表来存储键值对,线程安全
TreeSet<Node> treeSet = new TreeSet<>((node1,node2) -> {
if(node1.cap == node2.cap) return node1.id - node2.id;
return node1.cap - node2.cap;
}
);
Node resNode = treeSet.ceiling(tNode);
TreeSet的ceiling方法根据元素的自然顺序或指定的 Comparator 来比较元素。
Java官方推荐使用Deque
替代Stack
使用
Deque
是个接口
,其实现类有:
ArrayDeque
,使用“数组”存储数据LinkedList
,使用“链表”存储数据Deque
可以用作栈,支持 LIFO 操作:
push(E e):在头部添加元素(等同于 addFirst)。
pop():移除并返回头部元素(等同于 removeFirst)。
peek(): 返回栈顶元素
public static void main(String[] args) {
Deque<Integer> st = new ArrayDeque<>();
st.push(1);
st.push(2);
st.push(3);
st.pop();
System.out.println(st); // [2, 1]
st.push(4);
System.out.println(st); // [4, 2, 1]
System.out.println(st.peek()); // 4
}
操作 | 头部第一个元素 | 尾部最后一个元素 |
---|---|---|
抛出异常特殊值插入 | addFirst(e) | addLast(e) |
插入 | offerFirst(e) | offerLast(e) |
删除(返回并删除值)-不存在抛出异常 | removeFirst() | removeLast() |
删除(返回并删除值)- 不存在返回特殊值 | pollFirst() | pollLast() |
检查-不存在抛出异常 | getFirst() | getLast() |
检查-不存在返回特殊值 | peekFirst() | peekLast() |
// 定义双端队列
Deque<String> deque = new LinkedList<>( Arrays.asList("元素1", "元素2", "元素3"));
System.out.println(deque.peekFirst()); // 查看第一个元素
System.out.println(deque.pollLast()); // 删除最后一个元素
deque.offerFirst("元素"); // 队头插入元素
System.out.println(deque);
// Queue
public interface Queue<E> extends Collection<E> {
boolean add(E e); // 添加元素到队列中,相当于进入队尾排队。如果已满,抛出异常
boolean offer(E e); //添加元素到队列中,相当于进入队尾排队.
E remove(); //移除队头元素,如果为空,抛出异常
E poll(); //移除队头元素,如果为空,返回null
E element(); //获取但不移除队列头的元素,如果为空,抛出异常
E peek(); //获取但不移除队列头的元素,如果为空,返回null
}
Queue<String> queue = new LinkedList<String>();