集合之间的对比

501 阅读2分钟

不积跬步无以至千里,学知识亦是如此。java中的集合有许多,我们可能常用几种,其他的集合却不熟悉,根据场景选择合适的集合,才能真正将集合用活,写出优雅的代码。

这里以java中的集合为例,探讨下集合的种类及用法。

集合概述

image.png

上图可见:java 的集合主要分为Collection与Map两大类,Collection存储一个元素集合,Map中存储一个键值对映射。Collection接口又分为三种子类型,List、Set、Queue,常见的实现类有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等。

List和Set的区别

  • List接口实例存储的数据是有序的,可重复的。Set接口实例存储的数据是无序的,不可重复的。
  • List的查询效率高,插入删除效率低,类似于数组,插入和删除会影响元素位置。
  • Set查询效率低,插入删除效率高,插入和删除不会影响元素位置,如HashSet、TreeSet。

各种集合介绍

  • ArrayList 该类实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供了不错的性能。插入和删除效率低。在扩容时增长当前长度的50%。非线程安全。

  • LinkedList 该类实现了List的接口,允许有空元素。主要用于创建链表数据结构非线程安全,可以在创建的时候构造一个同步的List实现线程安全。

List list = Collections.synchronizedList(new LinkedList(...));

  • HashSet 该类实现了Set接口,不允许出现重复元素,允许包含至多一个值为null的元素。

  • HashMap HashMap是一个散列表,存储K-V键值对映射。该类实现了Map接口,根据键的HashCode值存储数据。访问速度快,不支持线程同步,多线程下请使用CurrentHashMap。实现为通过将键值对存储在数组上,当存储的元素数量达到 最大长度*负载因子 时扩容,扩容时长度加倍。后续可能会出一篇文章深入介绍,敬请期待。

  • LinkedHashMap 继承于HashMap,使用自然顺序对元素进行排序。

关于集合的遍历,自从接触了java8之后,使用stream遍历数据已经成了习惯,希望大家去学习下java8的语法,推荐《Java8实战》一书。