• 1、List

    在Java中,List是一个接口,它继承自Collection接口。List接口的实现类可以存储一个有序的集合(也称为序列)。

    这个集合允许包含重复的元素,并且每个元素都有其对应的索引。List接口提供了许多方法来操作列表中的元素,比如

    添加、删除、获取、修改元素等。

    List接口的主要实现类

    • ArrayList:基于动态数组的数据结构,允许null值和重复值。查询速度快,但插入和删除操作(尤其是在列表的开头或中间)可能相对较慢,因为需要移动元素。

    • LinkedList:基于链表的数据结构,同样允许null值和重复值。插入和删除操作(尤其是在列表的开头或结尾)速度较快,因为只需要改变节点之间的链接。但是,查询特定索引位置的元素可能较慢,因为需要从头节点开始遍历链表。

    • Vector:与ArrayList类似,但它是同步的。这意味着在多线程环境中,Vector提供了线程安全性的保证,但这也带来了性能上的开销。由于ArrayList在大多数情况下提供了更好的性能,并且可以使用Collections.synchronizedList方法来获得同步的ArrayList,因此Vector现在较少使用。

    List接口的主要方法

    • boolean add(E e):将指定的元素添加到列表的末尾。

    • void add(int index, E element):在列表的指定位置插入指定的元素。

    • boolean remove(Object o):从列表中移除指定元素的第一个匹配项(如果存在)。

    • E remove(int index):移除列表中指定位置的元素。

    • E get(int index):返回列表中指定位置的元素。

    • E set(int index, E element):用指定的元素替换列表中指定位置的元素。

    • int size():返回列表中的元素数量。

    • boolean isEmpty():如果列表不包含元素,则返回true

    • boolean contains(Object o):如果列表包含指定的元素,则返回true

    • Iterator<E> iterator():返回按适当顺序在列表的元素上进行迭代的迭代器。

    • List<E> subList(int fromIndex, int toIndex):返回列表中指定的fromIndex(包括)和toIndex(不包括)之间的部分视图。

    示例代码

    image.png




  • 2、Set

    在Java中,Set是一个接口,它同样继承自Collection接口。与List不同,Set接口不允许其实现类包含重复的元素。

    Set接口的实现类主要用于存储不重复的元素集合。

    Set接口的主要实现类

    • HashSet:基于HashMap实现,不保证集合的迭代顺序;允许使用null元素(但最多只能有一个null元素,因为HashSet

    • 是通过元素的hashCode()equals()方法来确定元素是否重复的)。HashSet提供了较快的查找、添加和删除操作,因为

    • 它们的性能主要取决于底层HashMap的性能。

    • LinkedHashSet:具有HashSet的所有特性,同时维护了一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照元素被添加到LinkedHashSet中的顺序(插入顺序)进行迭代。

    • TreeSet:基于TreeMap实现,能够按照自然顺序或者根据创建TreeSet时提供的Comparator进行排序。TreeSet不允许null元素。

    Set接口的主要方法

    Set接口继承了Collection接口的所有方法,但由于Set不允许重复元素,因此一些方法的行为在Set中有所不同。例如,

    add(E e)方法在添加元素时,如果Set已经包含了该元素(根据equals()方法判断),则不会添加该元素,并且返回false

    以下是一些Set接口特有的(或行为不同的)方法:

    • boolean add(E e):如果指定元素尚未存在于集合中,则将其添加到集合中。

    • boolean remove(Object o):如果集合包含指定的元素,则将其从集合中移除。

    • boolean contains(Object o):如果集合包含指定的元素,则返回true

    • int size():返回集合中的元素数(即唯一元素的数量)。

    • boolean isEmpty():如果集合不包含元素,则返回true

    • Iterator<E> iterator():返回按某种顺序(具体取决于Set的实现)在集合的元素上进行迭代的迭代器。

    示例代码

    image.png





  • 3、Map

    在Java编程语言中,Map是一个至关重要的接口,它隶属于java.util包。Map接口主要用来存储键值对(key-value pairs),

    其中每个键(key)都是独一无二的,并且与一个特定的值(value)形成关联。这种数据结构使得我们能够以极快的速度,通过

    键来检索或更新与之关联的值。

    Map接口的核心实现类

    • HashMapHashMap是基于哈希表的映射实现,它并不保证映射的次序会按照键的自然顺序或添加顺序来排列。需要留意的是,HashMap允许键或值为null(但每个HashMap实例中只能有一个null键)。

    • LinkedHashMapLinkedHashMapHashMap的一个子类,它维护了一个双向链表,该链表记录了所有条目的插入顺序。因此,LinkedHashMap能够按照条目被插入的顺序进行迭代。

    • TreeMapTreeMap则是基于红黑树的数据结构来实现映射的,它能够确保映射按键的自然顺序(或创建TreeMap时指定的Comparator顺序)进行排序。TreeMap不允许键为null

    • Hashtable:尽管Hashtable也是一个早期的、实现了Map接口的类,但它与HashMap在同步性上存在差异。Hashtable是线程安全的,这意味着它在多线程环境中使用时,无需额外的同步措施。然而,Hashtable不允许键或值为null

    • PropertiesProperties类继承自Hashtable,它主要用于处理配置数据。Properties类允许使用字符串键和值,并且提供了一些便捷的方法来加载和存储属性。

    Map接口的关键方法

    Map接口定义了一系列用于操作键值对的方法,这些方法大致可以分为以下几类:

    • 添加、更新或移除键值对

      • V put(K key, V value):将一个键值对存入映射中。如果该键已存在,则更新其对应的值。

      • V remove(Object key):根据键来移除映射中的键值对。

    • 检索值

      • V get(Object key):根据键来检索映射中的值。如果键不存在,则返回null

    • 检查映射内容

      • boolean containsKey(Object key):检查映射中是否包含指定的键。

      • boolean containsValue(Object value):检查映射中是否包含指定的值。

      • boolean isEmpty():检查映射是否为空。

      • int size():返回映射中键值对的数量。

    • 遍历映射

      • Set<K> keySet():返回一个包含映射中所有键的Set视图。

      • Collection<V> values():返回一个包含映射中所有值的Collection视图。

      • Set<Map.Entry<K, V>> entrySet():返回一个包含映射中所有键值对(作为Map.Entry对象)的Set视图。

    示例代码

    image.png