Java集合详解(万字图文总结)

Java集合详解(万字图文总结)-mikechen

Java集合经常在Java面试被问到,而且Java集合也是Java高级必备掌握内容,下面我来全面详解Java集合@mikechen

Java集合体系框架

Java集合框架主要包含以下几个部分,如下图所示:

Java集合详解(万字图文总结)-mikechen

  1. Collection接口:是所有集合接口的根接口,定义了所有集合共同具备的方法,如添加元素、删除元素、判断元素是否存在等操作。
  2. List接口:继承自Collection接口,表示一个有序集合,可以存储重复元素。
  3. Set接口:继承自Collection接口,表示一个不允许重复元素的集合。
  4. Map接口:表示键值对映射关系的集合。
  5. Queue接口:表示一个队列集合。

下面我分别详解Java集合的内容,包含:Collection、Java List、Java Set、Java Map、Java Queue。

 

Java集合Collection

Collection接口是所有集合接口的根接口,定义了所有集合共同具备的方法,如添加元素、删除元素、判断元素是否存在等操作。

如下图所示:
Java集合详解(万字图文总结)-mikechen

Collection派生出了三个子接口,分别是List、Set、Queue三个接口。

 

Java集合List

在 Java 集合框架中,Java List接口是一个有序集合,可以包含重复元素,Java List接口继承了 Collection 接口。

Java List常用的实现类有:ArrayListLinkedList等,如下图所示:

Java集合详解(万字图文总结)-mikechen

List集合特点

  • 集合中的元素允许重复;
  • 集合中的元素是有顺序的,各元素插入的顺序就是各元素的顺序;
  • 集合中的元素可以通过索引来访问或者设置;

 

List常用方法

下面是 List 接口的一些常用方法:

  1. add(E e):向 List 集合末尾添加一个元素 e。
  2. add(int index, E element):在 List 集合的指定位置 index 插入一个元素 element。
  3. remove(Object o):从 List 集合中删除指定元素 o。
  4. remove(int index):从 List 集合中删除指定位置 index 的元素。
  5. get(int index):获取 List 集合中指定位置 index 的元素。
  6. set(int index, E element):用指定的元素替换 List 集合中指定位置 index 的元素。
  7. indexOf(Object o):返回 List 集合中第一次出现指定元素 o 的位置。
  8. lastIndexOf(Object o):返回 List 集合中最后一次出现指定元素 o 的位置。
  9. size():返回 List 集合的大小。

 

List使用示例

import java.util.ArrayList;
import java.util.List;

public class ListExample {
    public static void main(String[] args) {
        // 创建一个 ArrayList 对象
        List<String> list = new ArrayList<>();

        // 向 list 中添加元素
        list.add("Java");
        list.add("Python");
        list.add("C++");

        // 获取 list 的元素个数
        int size = list.size();
        System.out.println("list 的元素个数:" + size);

        // 获取指定位置的元素
        String first = list.get(0);
        System.out.println("list 第一个元素:" + first);

        // 在指定位置插入元素
        list.add(1, "JavaScript");
        System.out.println("list 插入元素后:" + list);

        // 删除指定位置的元素
        list.remove(2);
        System.out.println("list 删除元素后:" + list);

        // 替换指定位置的元素
        list.set(1, "Go");
        System.out.println("list 替换元素后:" + list);

        // 获取指定元素的位置
        int index = list.indexOf("Java");
        System.out.println("Java 在 list 中的位置:" + index);
    }
}

 

Java List总结

1)ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高

2)Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低

3)LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高

 

Java集合Set

Java集合框架中,Set接口:继承自Collection接口,表示一个不允许重复元素的集合。

Set接口常用的实现类有:HashSetLinkedHashSetTreeSet

如下图所示:

Java集合详解(万字图文总结)-mikechen

HashSet

HashSet是Set集合最常用实现类,底层其实是包装了一个HashMap实现的,数据结构是数组+链表 + 红黑树。

LinkedHashSet

LinkedHashSet是Java集合框架中的一种Set实现类,它继承了HashSet类并实现了Set接口,底层数据结构采用链表和哈希表共同实现。

如下图所示:

Java集合详解(万字图文总结)-mikechen

TreeSet

TreeSet是一种排序的Set集合,底层是用TreeMap实现的,本质上是一个红黑树。

 

Set常用方法:

下面是 Set 接口的一些常用方法:

  1. add(E e):向 Set 集合添加一个元素 e。
  2. remove(Object o):从 Set 集合中删除指定元素 o。
  3. contains(Object o):判断 Set 集合中是否包含指定元素 o。
  4. size():返回 Set 集合的大小。

 

Set使用示例:

import java.util.HashSet;
import java.util.Set;

public class SetExample {
    public static void main(String[] args) {
        // 创建一个 HashSet 对象
        Set<String> set = new HashSet<>();

        // 向 set 中添加元素
        set.add("Java");
        set.add("Python");
        set.add("C++");
        set.add("Java");

        // 获取 set 的元素个数
        int size = set.size();
        System.out.println("set 的元素个数:" + size);

        // 判断 set 是否包含指定元素
        boolean containsJava = set.contains("Java");
        System.out.println("set 是否包含 Java:" + containsJava);

        // 删除指定元素
        set.remove("C++");
        System.out.println("set 删除元素后:" + set);
    }
}

 

Java集合Queue

Queue 接口继承了 Collection 接口,Queue 接口表示一种队列数据结构,即先进先出(FIFO)的数据结构。

如下图所示:

Java集合详解(万字图文总结)-mikechen

Queue常用类:

PriorityQueue

PriorityQueue是Java集合框架中的一个实现了Queue接口的类,是 Java 中基于优先级的队列的通用实现。

 

Deque

Deque接口是Queue接口的子接口,它代表一个双端队列,当程序中需要使用“栈”这种数据结构时,推荐使用ArrayDeque

 

Queue常用方法:

下面是 Queue 接口的一些常用方法:

  1. add(E e) / offer(E e):将指定元素添加到队列尾部,并返回 true。
  2. remove() / poll():移除并返回队列头部的元素。
  3. element() / peek():返回队列头部的元素,但不移除。

 

Queue使用示例:

import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String[] args) {
        // 创建一个 LinkedList 对象,即一个队列
        Queue<String> queue = new LinkedList<>();

        // 添加元素到队列尾部
        queue.add("Java");
        queue.offer("Python");
        queue.add("C++");

        // 获取队列头部的元素并移除
        String head1 = queue.remove();
        String head2 = queue.poll();
        System.out.println("remove() 方法移除的元素:" + head1);
        System.out.println("poll() 方法移除的元素:" + head2);

        // 获取队列头部的元素但不移除
        String head3 = queue.element();
        String head4 = queue.peek();
        System.out.println("element() 方法获取的元素:" + head3);
        System.out.println("peek() 方法获取的元素:" + head4);

        // 输出队列中所有元素
        System.out.println("队列中所有元素:" + queue);
    }
}

 

Java集合Map

在 Java 集合框架中,Map 接口是一个键值对的集合,即每个元素都是由一个键和一个值组成的。

常用的Map:

 

Java集合详解(万字图文总结)-mikechen

1.HashMap

HashMap类实现了Map接口,内部使用哈希表存储键值对,查找键值对的效率很高,但不保证键值对的顺序。

HashMap底层数据结构,如下所示:

Java集合详解(万字图文总结)-mikechen

HashMap线程不安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap类。

2.Hashtable

Hashtable和HashMap从存储结构和实现来讲有很多相似之处,不同的是它承自Dictionary类,而且是线程安全的,并发性不如ConcurrentHashMap

3.LinkedHashMap

LinkedHashMap继承了HashMap,是Map接口的哈希表和链接列表实现,它维护着一个双重链接列表。

4.TreeMap

TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序)。

 

Map常用方法:

下面是 Map 接口的一些常用方法:

  1. put(K key, V value):将指定的键值对添加到 Map 集合中。
  2. get(Object key):获取指定键对应的值。
  3. remove(Object key):从 Map 集合中删除指定键的键值对。
  4. containsKey(Object key):判断 Map 集合中是否包含指定的键。
  5. containsValue(Object value):判断 Map 集合中是否包含指定的值。
  6. keySet():返回 Map 集合中所有键的 Set 视图。
  7. values():返回 Map 集合中所有值的 Collection 视图。
  8. entrySet():返回 Map 集合中所有键值对的 Set 视图。

 

Java Map总结

Java集合详解(万字图文总结)-mikechen

以上就是Java集合的详解,希望对你掌握好Java集合有所帮助!

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法