Java容器

本文详细介绍了Java集合框架中List(有序可重复)、Set(唯一无序)、Queue(先进先出)和Map(键值对)的区别,包括它们的实现类如ArrayList、HashSet、LinkedList和TreeSet,以及各自在实际开发中的应用场景。同时讨论了线程安全性和底层数据结构。
摘要由CSDN通过智能技术生成

Java集合概述

Java集合,也叫容器,主要是由两个接口派生来的,

  • 一个Collection接口,主要存放单一元素。他有三个子接口
    • List
    • Set
    • Queue
  • 一个Map接口,主要存放键值对

说说List、Set、Queue、Map的区别

List(对付顺序):存储的元素有序、可重复
Set(实现独一无二):存储的元素无序、不可重复
Queue(排队):有序、可重复
Map(key搜索):使用键值对(key-value)存储,key无序、不可重复。value无序、可重复,每个建最多映射一个值

集合框架底层数据结构总结

List

  • ArrayList:Object[ ] 数组
  • Vector: Object[] 数组
  • LinkList:双向链表,jdk1.6之前是循环链表

Set:

  • HashSet(无序、唯一):基于HashMap实现,底层采用HashMap来保存元素
  • LinkedHashSet:LinkedHashSet是HashSet的子类,内部是通过LinkedHashMap来实现
  • TreeSet(有序、唯一):红黑树(自平衡的排序二叉树)

为什么要使用集合

当我们需要保存一组类型相同的数据的时候,我们应该用数组保存,但是数组存储对象具有一定的弊端,因为平时开发的时候,存储数据的类型是多种的,于是就出现了集合,集合同样是用来存储多个数据的。
数组的缺点是一旦声明之后,长度就不可变了,同时声明数组的数据类型也就决定了这个数组的存储数据的类型。数组存储的数据是有序的,可重复的,特点单一。但是集合提高了数据存储的灵活性,Java集合不仅可以存储不同类型不同数量的对象,还可以保存具有映射关系的数据。

ArrayList和Vector的区别

ArrayList是List的主要实现类,底层使用Object[] 存储,适用于频繁1查找工作,线程不安全
Vector是List的古老实现类,底层采用Object[] 存储,线程安全

ArrayList和LinkedList的区别

  • 是否线程安全:都是不同步的,不保证线程安全
  • 底层数据结构:ArrayList是Object数组;ListedList是双向链表
  • 插入和删除是否手元素位置的影响:
    • ArrayList采用数组存储,所以时间复杂度受到元素位置的影响。
      -LinkedList采用链表存储,在头部和尾部插入删除不受元素的影响,但是如果要在指定位置的话,时间复杂度O(n),因为需要先移动到指定的位置再插入。
  • 是否支持快速随机访问:(通过元素的需要快速获取元素对象)
    • ListedList不支持高效的随机元素访问
    • ArrayList支持
  • 内存空间的占用:ArrayList的空间浪费主要体现在List列表会预留一定的容量空间;LinkedList的空间浪费是体现在他的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)

Collection子借口Set

comparable 和Comparator的区别

  • comparable接口实际上是出资java.lang包 他有一个compareTo(Object obj)方法来排序
  • comparator接口实际上是出自java.util包,他有一个compare(Object obj1,Object obj2)方法用来排序
    一般我们需要对一个集合使用自定义排序时,我们就要重写compareTo()方法

比较HashSet、LinkedHashSet、TreeSet三者的异同

  • 三者都是Set接口的实现类,都能保证元素唯一,并且都不是线程安全。
  • 主要区别是底层数据结构不同。
    • HashSet的底层数据结构是哈希表(基于HashMap实现)
    • LinkedHashSet的底层数据结构是链表和哈希表,元素的插入和取出顺序满足FIFO
    • TreeSet底层数据结构是红黑树,元素有序,排序的方式有自然排序和定制排序
  • 应用场景不同:
    • HashSet:不需要保证元素插入和取出顺序
    • LinkedHashSet:保证元素的插入和取出满足FIFO
    • TreeSet:支持对元素自定义排序规则

COllection子接口Queue

Queue与Deque的区别

Queue是单端队列,只能从一段插入元素,一段删除元素,先进先出
Deque是双端队列,队列的两端均可以插入和删除元素

ArrayDeque和LinkedList的区别

都实现了Deque的接口,两者都有队列的功能

  • ArrayDeque是基于可变长的数组和双指针来实现,LinkedList通过链表来实现
  • ArrayDeque不支持存储Null数据,LinkedList支持
  • ArrayDeque插入可能存在扩容过程,不过均摊后插入操作依然为O(1)。LinkedList不需要扩容,但是每次插入数据都需要申请新的堆空间,均摊性能相比更慢
    性能角度考虑,ArrayDeque来实现队列比LinkedList更好

PriorityQueue

元素出队的顺序是与优先级有关的,优先级高的优先出队

  • 利用二叉堆的数据结构实现,底层使用可变长的数组来存储数据
  • 通过堆元素的上浮和下沉,实现O(logn)的时间复杂度插入元素和删除堆顶元素
  • 非线程安全,不支持粗糙你Null和non-comparable对象
  • 默认小顶堆,但可以接受Comparator作为构造函数,自定义元素优先级的先后。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值