Java的集合框架基本知识点总结(List,Set,Map)

本文深入解析Java集合框架,涵盖List、Set、Map的主要实现类,如ArrayList、LinkedList、HashSet、TreeSet、HashMap、HashTable及TreeMap。对比各集合类的特点、适用场景及时间复杂度,助你高效运用Java集合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合Collection

要用一个东西首先最重要的是,你为什么要用它,它有什么用,能解决什么问题。这三个问题其实是一个问题,现在来具体的说一下集合的作用。

  • 支持泛型,泛型也就是我们常说的简单易用,灵活性高,还比较安全(指编译时检查类型安全)。
  • 可变长度,集合和我们平时用的数组比起来,最大的特点就是长度是灵活可变的,会根据情况自动的扩张自己的容量。
  • 操作性强且简单上手,集合本身是个接口,内置的方法可以让我们更容易操作其中的元素(添加啊,删除等,反正肯定比数组容易的),而且我们平时根本不需要去重写接口,Java内置的接口已经是非常好用了。

1. List

List也是一个接口,而且是Collection的子接口,继承List接口的类最大的特点就是:

  • 元素有序排列。
  • 元素可重复出现。

1.1 ArrayList

ArrayList,内部是一个动态的数组来存放元素,数组长度可变。
动态数组的本质是:一开始定义一个长度为10的数组,每当要到达上限的时候,先创建一个容量更大的数组,再把所有的元素转过去。
特点是:

  • 查询效率高,可以直接通过get(i)的方法获取第i个元素,一步到位可以说是不能再快了,时间复杂度O(1)。
  • 增删效率低,当ArrayList要往中间插入元素的时候,那就表示后面的元素都要往后移动一格,时间复杂度O(n)(如果是末尾插入则是O(1)),而且容量不够的时候还会创建新数组,耗时更长。
  • 线程不安全,没有特地解决线程安全的类都会有的标准问题。

1.2 LinkedList

LinkedList,内部是一个链表来存放元素,链表肯定是长度可变,特点:

  • 查询效率低,由于不支持随机访问(就是访问元素必须要从第一个开始一个个看),所以查询就相比ArrayList而言慢,时间复杂度O(n)。
  • 增删效率高,其实也没有那么高,插入元素也一样要O(n)的复杂度,但是相比ArrayList它不用创建新数组,这相对一比就高了起来。
  • 线程不安全,此条同上。

1.3 Vector

Vector,简单来说就是ArrayList的线程安全版,由于线程安全,特点也很明显了:

  • 线程安全,当需要用到多线程的时候就可以用上它。
  • 效率低,多线程自带副作用,由于每个方法都synchronized了,自然而然就会慢一点(对于Java而言,实现线程同步这一点本身就有性能消耗,不是说你Vector用单线程效率就和ArrayList一样)。

如果被问到为什么Vector的使用率低之类的问题,请直接回答因为线程同步效率低这一点。

1.4 总结

要注意的是,虽然我有在前面列出时间复杂度,但是实际上效率并不是一个只看时间复杂度就可以决定的东西。

List查询效率增删效率线程安全
ArrayList高 O(1)低 O(n)加扩容不安全
LinkedList低 O(n)高 稳定O(n)不安全
Vector低 同步开销低 同步开销安全

2. Set

Set当然也是接口且是Collection的子接口,继承Set接口的类的特点:

  • 元素无序排列。
  • 元素不可重复。
  • 没有get()方法,因为是无序存储。

实际上底层是是通过Map实现的。

2.1 HashSet

HashSet的底层是HashMap,实际上在存储的时候就是在hashMap中以<E, Object>的方式存储元素。Object就是我们熟知的那个Object类,里面啥都没;E则是泛型,在创建HashSet时指定。

  • 没什么特点,主要是其底层是由HashMap实现,就是个只有一半的hashMap。其特点就基本上等同于hashMap的特点。

2.2 TreeSet

TreeSet的底层是TreeMap,同HashSet,TreeSet存储的时候也是在TreeMap中以<E, Object>的方式存储元素,E依然是泛型。

2.3 总结

Set的内容比较少,主要是Set的底层其实就是Map,基本上就是拥有Map中所有Key(键值)的特性,具体看Map部分。

3. Map

Map以键值对(key/Value)的方式存储元素,每个key可以对应一个Value,存储有对应关系的数据。

  • Key不能重复,但是Value可以重复,以<String, Integer>为例,我可以同时存入<“111”, 111>, <“222” , 111>,但是不能同时存入<“111”, 111>,<“111”, 222>,这种情况下后者刷新前者。
  • 拥有较好的的删改查询效率。

3.1 HashMap和HashTable

HashMap是通过Hash算法实现的存储结构,平时我们都用这个,底层是一个Hash表,在存储的时候键不能重复,重复的时候新的值会替换原有的值

  • 查询速度极快,时间复杂度是O(1)。
  • 线程不安全。
  • 允许key或者Value为null。

HashTable简单来说就是HashMap的线程安全版,底层基本相同,在大部分方法中都用上了synchronized关键字。

  • 线程安全。
  • 不允许key或value为null。
  • 虽然底层基本相同,不过由于线程同步效率较慢。

3.2 TreeMap

TreeMap是红黑二叉树的实现,底层就是一个红黑二叉树。

  • 和HashMap相比,调用起来没有差别。
  • 查询效率较好,时间复杂度是O(logn)。
  • TreeMap的内部元素是有序的。
  • 线程不安全。

参考材料

Java SE 核心 II【Collection 集合框架】 - 404boom - 博客园
https://www.cnblogs.com/cao-yin/p/9608250.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值