热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java各大集合的区别

java各大集合的区别​Java集合也
java各大集合的区别

​ Java集合也称呼为容器,他是由2大接口组曾,一个是Collection主要用来存放单一的元素,另一个是Map接口,主要用来存放K-V的数据。

**List:**存储的元素是有序的,可重复得到。

Set: 存储的元素是无序了,但是不可以重复。

**Queue: **使用特定的排序规则来确定排序顺序,存储的元素是有序的,可以重复的

Map: 使用k-v存储。key是无序的,不可以重复。val是无序的可以重复。

List

ArrayList: Object[] Arrays

Vector: Object[] arrays

LinkedList: 双向链表(JDK1.6之前未循环链表,JDK1.7取消的循环)

Set

HashSet: (无序,唯一)基于HashMap实现,底层采用HashMap来保存元素

**LinkedHashSet: ** LinkedHashSet是HashSet的子类,内部是通过LinkedHashMap来实现。

TreeSet: 有序唯一:红黑树(自平衡的排序二叉树)

Queue

**PriortyQueue: ** Object[] array 数组来实现二叉堆

ArrayQueue: Object[] arrays 数组 + 双指针

Map

HashMap: JDK1.8之前是由数组+链表组成,数组是HashMap的主体,链表主要是为了解决hash冲突存在的,使用拉链法解决hash冲突。在JDK1.8以后在解决hash冲突有了很大的变化,当链表长度大于阈值8并且数组长度大于等于64的时候就会转换为红黑树,否则就是进行数组扩容数组。

LinkedHashMap: LinkedHashMap继承自HashMap,它和hashmap的结构大致相同,只不过他在上面的结构上添加了双向链表,这样可以保证k-v的形式插入,同事也可以通过链表进行相应的操作。

HashTable 数组+链表组成,数组是HashTable的主体,链表主要解决hash冲突。

TreeMap : 红黑树(自平衡的排序二叉树)

Collection

​ 对于Coleection来说,它主要有3大子接口List、Set、Queue

ArrayList和vector的区别

ArrayList是list的主要实现类,底层使用Object[]存储,适合频繁的查找工作,线程不安全

Vector是list的古老的类,底层使用Object[]存储,是线程安全的

ArrayList和LinkedList的去呗

他们都是线程不安全的,ArrayList的底层是数组,LinkedList的底层是双向链表

插入的区别:

当我们Arraylist尾插入的情况时间复杂度就是O(1),如果我们插入的位置不是尾巴,是某个index的位置,那么时间复杂度就是O(n-index)。删除也是同理,因为我们要实现向前向后的移动。

当我们LinkedList实现头插入和尾巴插入删除的时候时间复杂度是O(1),当我们要再在位置i插入或者删除元素的时候,时间复杂度是i,因为我们在移动到指定的位置在开始插入。

随机访问的区别

LinkedList不支持随机访问,但是ArrayList支持随机访问,因为ArrayList实现了RandomAccess接口,所以支持快速随机访问也就是get方法。

内存的占用

​ ArrayList的内存占用是它内部的数组所占用的大小,而LinkedList内存占用的内存是根据元素的个数。

​ ArrayList底层实现了RandomAccess接口,但是这个接口里面是空空的什么也没有写,我想,**这个接口可能就是一个标识吧,标识告诉我们ArrayList是可以实现的随机访问的。**LinkedList没有实现RandomAccess接口时因为它的底层数据结构,而ArrayList的底层是数组天然支持随机访问,而数组要到置顶的位置才可以时间复杂是O(节点的位置),所以不支持随机访问,

Queue

​ Queue是单端队列,遵循这FIFO(先进先出)的规则

ArrayDeque和LinkedList的区别

虽然他们都实现了Deque接口,两者都有队列的功能,他们的区别如下

​ ArrayDeque是基于可变长的数组和双指针实现的。而LinkedList是通过链表来实现的。

​ ArrayDeque不支持NUll值,但是LinkedList支持

​ ArrayDeue插入的时候可能会出现扩容的过程,不过均摊后他的时间复杂度依然是O(1),然后Linked不需要扩容,但是每次插入数据需要申请新的堆空间,均摊的话性能很慢。

PriorityQueue

​ PriorityQueue利用了二叉堆的数据结构实现,底层使用可变长的数组来存数据。

​ PriorityQueue通过堆元素的上符合下沉,实现了在O(Longn)的时间复杂度内插入元素和删除堆顶元素。

​ PriorityQueue不是线程安全的,不支持存储NUll和non-comparable对象

​ priorityQueue默认是小顶堆,达到你是可以接受一个COmparator作为构造参数来改变优先级的规则

Set

hashSet,linkedhashset,treeste都是通过set接口实现的,都可以保证元素的唯一,但是他们都不是线程安全的。

他们的区别主要在他们的底层不一样,hashset的底层是hash表,linkedhashset是链表+hash表元素的插入取出的顺序满足fifo,treeset的底层是红黑树,元素是有序的,排序由自然排序和自定义排序规则。


推荐阅读
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 使用WinForms 实现 RabbitMQ RPC 示例
    本文通过两个WinForms应用程序演示了如何使用RabbitMQ实现远程过程调用(RPC)。一个应用作为客户端发送请求,另一个应用作为服务端处理请求并返回响应。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • Kubernetes 持久化存储与数据卷详解
    本文深入探讨 Kubernetes 中持久化存储的使用场景、PV/PVC/StorageClass 的基本操作及其实现原理,旨在帮助读者理解如何高效管理容器化应用的数据持久化需求。 ... [详细]
  • 深入解析for与foreach遍历集合时的性能差异
    本文将详细探讨for循环和foreach(迭代器)在遍历集合时的性能差异,并通过实际代码示例和源码分析,帮助读者理解这两种遍历方式的不同之处。文章内容丰富且专业,旨在为编程爱好者提供有价值的参考。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
author-avatar
渐我素小黑陈琼敏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有