【JAVA】集合

List、Set接口继承于Collection接口

List接口的实现类有 ArrayListLinkedList
还有一个实现类是Vector!
Set接口的实现类有 HashSet(常用,底层结构是HashMap,存key不存value) TreeSet(不常用)

Map接口

最长的见的实现类是HashMap,底层是数组+链表或红黑树
不常见的实现类有 HashTableTreeMap

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)

Collection接口

add()
remove()  // index,obj
size() 
isEmpty()
contains()
clear()

List接口

get() // index

Arraylist 基于数组初始大小为10, 1.5倍扩容
Vector,有synchronize关键字修饰方法,无参默认容量为10,2倍扩容
LinkedList 底层维护的是双向链表

Set接口

set.add(null)

添加和取出的顺序不一致(无序的)


  • list存储元素有序、可重复
  • set存储元素无序,不可重复
  • queue按照排队规则排序,元素可重复
  • map存储的是键值对

Arraylist : 底层obejct数组,查询快(根据索引查询),增删慢,线程不安全,效率高。

Vector : 底层object数组,查询快,增删慢,线程安全,效率低。几乎淘汰。

LinkedList:底层数据结构是链表,查询慢,增删快(依次插入),线程不安全,效率高

HashSet:基于HashMap 实现的,底层采⽤ HashMap 来保存元素 ,无序

TreeSet:底层通过TreeMap实现(TreeMap的实现就是红黑树算法)

ArrayQueue:底层 Object[]数组 + 双指针

PriorityQueue:底层Object[]数组来实现二叉堆。默认大顶堆。

HashMap:jdk1.7底层数组+链表,jdk1.8底层采用数组+链表/红黑树来存储key-value键值对。当链表的长度大于8时,链表会转化成红黑树。采用拉链法解决冲突(元素碰撞时,形成链表)。

HashTable:底层采用数组+链表来存储键值对,线程安全


  • PriorityQueue基于堆,TreeSet基于红黑树
  • 优先队列,插入删除复杂度低, TreeSet高效插入、删除、查找。优先队列不好查找
 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 来比较元素。

栈、双端队列、Queue

Java官方推荐使用Deque替代Stack使用
Deque是个接口,其实现类有:

  • ArrayDeque,使用“数组”存储数据
  • LinkedList,使用“链表”存储数据

【JAVA】集合_第1张图片

  1. 栈相关方法

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>();

你可能感兴趣的:(#,java,java,开发语言)