当前位置: 首页 > 后端技术 > Java

JAVA中如何正确选择集合类型

时间:2023-04-01 18:31:07 Java

程序=数据结构+算法程序=数据结构+算法公式,我们也在不断的编程生涯中加深对这个公式的理解。现在有一些观点认为这个公式已经过时了,现在的程序包含的东西很多,数据结构和算法都不足以涵盖。但我认为这并不是公式过时了,而是我们对公式的理解需要与时俱进。这个中文公式很贴切。数据结构是数据的结构。这不仅指堆栈、数组和链表之类的东西。我们定义的实体和对象都是数据结构。算法是通过设定的计算步骤对数据进行处理的方法。这里不仅仅指排序、红黑树、递归等,只要是对数据进行处理,也是一种时间格式显示的算法。当我们以开放的眼光看待这些概念时,我们的程序仍然是由数据结构和算法组成的,但是复杂的程序数据结构和算法在不同的层次和不同的地方混合交织。有些算法旨在将一个数据结构转换为另一个数据结构,而有些算法则旨在修改一个数据结构的内容。一般来说,数据结构可以分为三类:一类是单一的数据结构,比如数字和字符串。第二类是复合数据结构,例如定义的实体和对象。第三类是集合数据集结构,如列表、字典等。单体数据结构大多是编程语言提供的基本类型或基本类型的扩展,如JAVA中的String、Integer。这种数据结构在写JAVA程序的时候会声明,编译的时候会检查,所以很难出错。大多数组合数据结构都是为业务设置的,一个一个组成实体类。这些类都包含业务含义。只要业务抽象得当,就很难错误地使用这样的对象。集合数据结构本身不具备程序的业务属性,在使用上也可以在一定程度上相互替代,但是在不同的算法场景下更适合哪种,如果集合数据结构用在一个不合适的地方,不是完全不能用,而是会增加编程的复杂度,容易出现BUG,一旦触发BUG,问题难以排查等负面影响。而且JAVA提供的集合数据结构种类繁多。经常看到有些孩子无法区分使用哪种收藏类型。今天就把之前画的图拿出来,一起来看看JAVA集合框架提供的这些不同集合类型的特点,适合在那些场景下使用,以及我们该如何选择。今天没有代码,只有工具。JAVA常用的集合类型JAVA常用的集合类型关系图上图主要列出了常用的集合类型以及它们之间的关系,并不是一个严格的类图,所以没有很多详细复杂的接口和类之间的关系。另外,这不是全部,只是列出了常用的。Queue在这里说明一下,这里没有列出所有的队列类型。主要原因是使用率没有别人高。主要说明异步的作用,忽略同步等待。队列。队列稍后将有机会扩展。OK,我们从左到右简单看一下。我们这里不看代码,看他们的特性。来源是JDK1.8的源码注释。列表(list)允许重复排序的集合。ArrayListResizable——List接口的数组实现。关键字:array:数组结构,查询分块,非有效端增删慢。可调整大小:数组本身的长度是不可变的。如果可以调整大小,说明需要开辟新的内存来回切换数据,末端增加也慢。LinkedListList和Deque接口的双向链表实现。Keyword:Doubly-linked:双向链表结构,增删快,无resize要求,查找不在手尾的其他元素慢。StackStack类表示对象的后进先出(LIFO)堆栈。关键字:LIFO:后进先出Queue(队列)旨在临时存储处理对象的集合。BlockingQueueBlockingQueue的JavaDoc并没有对这种类型做一般性的介绍。关键字生产消费模式适用于异步处理长流程。Set(Set)不允许重复的无序集合。HashSetThis类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证集合的迭代顺序;特别是,它不保证顺序会随着时间的推移保持不变。此类允许空元素。关键字:哈希表:哈希表结构,顺序不保证,增删改查都很快。noguaranteesastotheiterationorderoftheset:强调不能保证顺序。不保证订单会随着时间的推移保持不变:订单甚至可能会随着时间的推移而改变。Set接口的LinkedHashSetHash表和链表实现,具有可预测的迭代顺序。这个链表定义了迭代顺序,也就是元素被插入到setKeyword中的顺序:链表:加入了链表结构,哈希表也有了,两种结构一起工作,性能和内存占用略有不同下。可预测的迭代顺序:保证顺序性。orderinwhichelementswereinsertedintoset:元素插入的顺序。TreeSet基于TreeMap的NavigableSet实现。这些元素使用它们的Comparable自然顺序进行排序,或者由在集合创建时提供的Comparator进行排序,具体取决于使用的构造函数。关键词:TreeMap:基于TreeMap实现,采用红黑树结构,增删时数据结构实时变化。可比自然排序:使用自然排序。Comparatorprovided:或者提供一种排序方法。Map(字典/映射)提供一个对象与另一个对象之间的关系管理。HashMapHash基于表的Map接口的实现。此类不保证地图的顺序;特别是,它不保证顺序会随着时间的推移保持不变。关键词:哈希表:哈希表结构,不保证顺序,增删改查快速。noguaranteesastoorderofthemap:强调不能保证顺序。不保证订单会随着时间的推移保持不变:订单甚至可能会随着时间的推移而改变。Map接口的LinkedHashMapHash表和链表实现,具有可预测的迭代顺序。这个链表定义了迭代顺序,一般是key插入map的顺序关键字:linkedlist:加入链表结构,hashtable还是两种结构一起工作,性能和内存占用略逊一筹.可预测的迭代顺序:保证顺序性。orderinwhichkeysareinsertedintomap:元素插入的顺序。TreeMap一种基于红黑树的NavigableMap实现。映射根据其键的Comparable自然顺序进行排序,或者根据使用的构造函数在映射创建时提供的比较器进行排序。关键字:Red-Blacktreebased:使用红黑树结构,增删时数据结构实时变化。可比自然排序:使用自然排序。Comparatorprovided:或者提供一种排序方法。编码选择场景Cheatsheet如果在实际开发过程中遇到需要使用这些集合结构的情况,可以收藏下面的CheatSheet,根据实际编码场景选择合适的集合结构。