进阶Java集合,权当查询手册

239 阅读7分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情


1 集合和数组的区别

学习了数组,那么我们也该学习下集合了。相对于数组而言,集合有以下几个特点:

👉I、数组声明了它容纳的元素的类型,而集合不声明。

👉II、数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。

👉III、数组不论是效率还是类型检查都是最好的。

用一个表格简单整理下:

数组集合
声明容纳大小需要声明容纳大小无需声明,但是可以声明大小
是否可变容量静态,创建后无法改变动态扩容
性能相对集合弱一些相对数组好一些

在Java中,集合同数组一样,主要是用于负责保存、盛放数据,因此这些Java对象还有另外一个名字——集合。

注意⚠️:当前实验环境JDK为1.8.0_202 ,实验使用的IDE为IDEA 2022.2

$ java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)

2 Java中集合的分类

在Java中,集合主要分为两个大类,分别是CollectionMap,他们都是接口类型,而且还都是根接口,这两个接口又分别包含一些子接口和一些实现类。Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。

2.1 Collection接口

方法名称说明
boolean add(E e)向集合中添加一个元素,如果集合对象被添加操作改变了,则返回 true。E 是元素的数据类型
boolean addAll(Collection c)向集合中添加集合 c 中的所有元素,如果集合对象被添加操作改变了,则返回 true。
void clear()清除集合中的所有元素,将集合长度变为 0。
boolean contains(Object o)判断集合中是否存在指定元素
boolean containsAll(Collection c)判断集合中是否包含集合 c 中的所有元素
boolean isEmpty()判断集合是否为空
Iteratoriterator()返回一个 Iterator 对象,用于遍历集合中的元素
Stream parallelStream()Java8新增,返回一个有序列的并行的数据流,作为数据的源头
boolean remove(Object o)从集合中删除一个指定元素,当集合中包含了一个或多个元素 o 时,该方法只删除第一个符合条件的元素,该方法将返回 true。
boolean removeAll(Collection c)从集合中删除所有在集合 c 中出现的元素(相当于把调用该方法的集合减去集合 c)。如果该操作改变了调用该方法的集合,则该方法返回 true。
boolean removeIf(Predicate<? super E> filter)Java8新增,增加断言过滤删除。移除此集合中满足给定谓词的所有元素。迭代期间或谓词抛出的错误或运行时异常被中继到调用方。
boolean retainAll(Collection c)从集合中删除集合 c 里不包含的元素(相当于把调用该方法的集合变成该集合和集合 c 的交集),如果该操作改变了调用该方法的集合,则该方法返回 true。
Stream stream()Java8新增,返回一个有序列的数据流,作为数据的源头
int size()返回集合中元素的个数
Object[] toArray()把集合转换为一个数组,所有的集合元素变成对应的数组元素。

2.2 Map接口

方法名称说明
interface Entry<K,V>Java8 中新增一些个比较器,该比较器按键的自然顺序比较、按键的给定顺序比较、按值的自然顺序比较和按值的给定顺序比较。
void clear()删除该 Map 对象中的所有 key-value 对。
V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)Java8 中新增一些个比较器。
V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)Java8 中新增一些个比较器。
V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)Java8 中新增一些个比较器。
boolean containsKey(Object key)查询 Map 中是否包含指定的 key,如果包含则返回 true。
boolean containsValue(Object value)查询 Map 中是否包含一个或多个 value,如果包含则返回 true。
V get(Object key)返回 Map 集合中指定键对象所对应的值。V 表示值的数据类型
V put(K key, V value)向 Map 集合中添加键-值对,如果当前 Map 中已有一个与该 key 相等的 key-value 对,则新的 key-value 对会覆盖原来的 key-value 对。
void putAll(Map m)将指定 Map 中的 key-value 对复制到本 Map 中。
V remove(Object key)从 Map 集合中删除 key 对应的键-值对,返回 key 对应的 value,如果该 key 不存在,则返回 null
boolean remove(Object key, Object value)Java8 新增,删除指定 key、value 所对应的 key-value 对。如果从该 Map 中成功地删除该 key-value 对,该方法返回 true,否则返回 false。
boolean replace(K key, V oldValue, V newValue)Java8 新增,仅当指定键当前映射到某个值时,才替换该项。
replaceAll(BiFunction<? super K, ? super V, ? extends V> function)Java8 新增,仅当当前映射到指定值时,才替换指定键的条目。
Set entrySet()返回 Map 集合中所有键-值对的 Set 集合,此 Set 集合中元素的数据类型为 Map.Entry
Set keySet()返回 Map 集合中所有键对象的 Set 集合
boolean isEmpty()查询该 Map 是否为空(即不包含任何 key-value 对),如果为空则返回 true。
int size()返回该 Map 里 key-value 对的个数
Collection values()返回该 Map 里所有 value 组成的 Collection

2.3 集合接口的子类和实现

  • 集合
    • Collection
      • List
        • ArrayList:基于动态数组实现,支持随机访问。
        • Vector:它和ArrayList类似,但它是线程安全的。
        • LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列
      • Queue
        • LinkedList:可以用它来实现双向队列。
        • PriorityQueue:基于堆结构实现,可以用它来实现优先队列。
      • Set
        • TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。
        • HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。
        • LinkedHashSet:具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。
    • Map
      • TreeMap:基于红黑树实现。
      • HashMap:基于哈希表实现。
      • HashTable:和 HashMap 类似,但它是线程安全的,这意味着同一时刻多个线程可以同时写入 HashTable 并且不会导致数据不一致。它是遗留类,不应该去使用它。现在可以使用 ConcurrentHashMap 来支持线程安全,并且 ConcurrentHashMap 的效率会更高,因为 ConcurrentHashMap 引入了分段锁。
      • LinkedHashMap:使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。

2.4 集合的优点

那么集合在使用过程中,有哪些优点呢?

  • 降低编程难度
  • 提高程序性能
  • 提高API间的互操作性
  • 降低学习难度
  • 降低设计和实现相关API的难度
  • 增加程序的重用性

总结

查看这个还不如去看下源码,这里整理的也比较随意。

参考

[1]pdai.tech/md/java/col…

[2]c.biancheng.net/view/6824.h…