前言

介绍Java集合相关的内容。


集合体系结构

集合整体上来说可以分为两类:

  • Collection:单列集合。(集合元素为一个数据)
  • Map:双列集合。(集合元素为一对数据(键值对))

下面将展开详细介绍。

Collection(单列集合)

Collection集合又可以分为两类:

  • List:添加的元素有序可重复有索引
  • Set:添加的元素无序不重复无索引

Collection接口的一些常用方法:

方法名称 说明
public boolean add (E e) 把给定的对象添加到当前集合中
public void clear ( ) 清空集合中所有的元素
public boolean remove (E e) 把给定的对象在当前集合中删除
public boolean contains (Object obj) 判断当前集合中是否包含给定的对象
public boolean isEmpty ( ) 判断当前集合是否为空
public int size ( ) 返回集合中元素的个数/集合的长度

List集合

List集合的特点:

  • 有序:存和取的元素顺序一致。
  • 有索引:可以通过索引操作元素。
  • 可重复:存储的元素可以重复。

List接口一些常用的特有方法(有索引):

方法名称 说明
void add (int index, E element) 在此集合中的指定位置插入指定的元素
E remove (int index) 删除指定索引处的元素,返回被删除的元素
E set (int index, E element) 修改指定索引处的元素,返回被修改的元素
E get (int index) 返回指定索引处的元素

ArrayList

  • 底层是数组结构。

其他无需特别说明,如有再补充。

LinkedList

  • 底层是双向链表的数据结构。
  • 查询慢,增删快。

LinkedList集合一些特有的方法(针对首尾元素):

方法名称 说明
public void addFirst (E e) 在该列表开头插入指定元素
public void addLast (E e) 将指定的元素追加到此列表的末尾
public E getFirst ( ) 返回此列表中的第一个元素
public E getLast ( ) 返回此列表中的最后一个元素
public E removeFirst ( ) 从此列表中删除并返回第一个元素
public E removeLast ( ) 从此列表中删除并返回最后一个元素

Vector

已淘汰。

Set集合

Set集合的特点:

  • 无序:存和取的元素顺序不一致。
  • 无索引:没有带索引的方法,不能通过索引来操作元素。
  • 不重复:存储的元素不可以重复。(可以利用该特性进行元素去重)

Set集合的一些实现类通过底层的数据结构可以实现部分特有属性:

  • HashSet:无序、不重复、无索引。
  • LinkedHashSet:有序、不重复、无索引。
  • TreeSet:可排序、不重复、无索引。

HashSet

  • 底层采用哈希表存储数据。

    • 哈希表是一种对增删改查数据性能都较好的数据结构。
    • 在JDK8之后,哈希表的组成结构为:数组 + 链表 + 红黑树

LinkedHashSet

  • 底层采用哈希表存储数据,但是在每个元素上又增加了双链表机制记录存储顺序。

  • 特性:有序、不重复、无索引。

    可以保证存和取的元素顺序一致。

TreeSet

  • 底层基于红黑树的数据结构实现元素排序,增删改查性能都较好。

  • 特性:可排序、不重复、无索引。

    按照元素的默认规则(由小到大)排序:

    • 对于数值类型(Integer、Double),默认按照从小到大的顺序进行排序。
    • 对于字符、字符串类型,默认按照字符在ASCII码表中的数字升序进行排序。

Map(双列集合)

Map双列集合的特点:

  • 双列集合一次需要存取一对数据(键 + 值)
  • 键不能重复,值可以重复
  • 键和值是一一对应的,每一个键只能找到自己对应的值
  • “键 + 值” 这个整体称之为 “键值对” / “键值对对象”,在Java中叫做 “Entry对象”

Map接口的一些常用方法:

方法名称 说明
V put (K key, V value) 添加元素
V remove (Object key) 根据键删除键值对元素
void clear ( ) 移除所有键值对元素
boolean containsKey (Object key) 判断集合是否包含指定的键
boolean containsValue (Object value) 判断集合是否包含指定的值
boolean isEmpty ( ) 判断集合是否为空
int size ( ) 集合的长度,也就是集合中键值对的个数

HashMap

  • 底层基于哈希表结构实现。
  • 特性由键决定:无序、不重复、无索引。
  • 如果存储的是自定义对象,则需要重写hashCode()和equals()方法;如果存储的是自定义对象,则无需重写hashCode()和equals()方法。

LinkedHashMap

  • 底层采用哈希表存储数据,但是在每个键值对元素上又增加了双链表机制记录存储顺序。
  • 特性由键决定:有序、不重复、无索引。

TreeMap

  • 底层基于红黑树的数据结构实现元素排序,增删改查性能都较好。

  • 特性由键决定:可排序、不重复、无索引。

    可排序:对键进行排序。

Collections

Collections不是集合,而是集合的工具类。

Collections常用的方法:

方法名称 说明
public static < T > boolean addAll (Collection < T > c, T … elements) 批量添加元素
public static void shuffle (List < ? > list) 打乱List集合元素的顺序
public static < T > sort (List < T > list) 排序
public static < T > sort (List < T > list, Comparator < T > c) 根据指定的规则进行排序
public static < T > int binarySearch (List < T > list, T key) 以二分法查找元素
public static < T > copy (List < T > dest, List < T > src) 拷贝集合中的元素
public static < T > fill (List < T > list, T obj) 使用指定的元素填充集合
public static < T > max/min (Collection < T > coll) 根据默认的自然排序获取最大/最小值
public static < T > (List < ? > list, int i, int j) 交换集合中指定位置的元素

后记

长时间不用java基础的内容,偶然刷leetcode时发现忘记了,故写此篇总结一下。