List有序,Set无序,真的是这样嘛?

开发 前端
今天说一说集合,在面试的时候出现的频率非常高,开发中使用的频率也非常高。经常听到有人说List是有序,Set是无序,那么这个有序和无序指的究竟是什么呢?

 [[283143]]

今天说一说集合,在面试的时候出现的频率非常高,开发中使用的频率也非常高。经常听到有人说List是有序,Set是无序,那么这个有序和无序指的究竟是什么呢?

 

List有序,Set无序,真的是这样嘛?

 

这里有两个概念,一个是存取元素的顺序,比如我存的时候是3 4 5 1 2 ,那么取出来也应该是3 4 5 1 2 或者 2 1 5 4 3 。另一个是元素在容器中大小顺序,更准确说是排序。如果说区分了这两个概念,就好说了,看上面的体系图,List家族有两名大将,分别是ArrayList和LinkedList。而Set家族里主要有HashSet和TreeSet两名大将。

如果要按照存和取的顺序来讲,ArrayList和LinkedList就属于有序集合,因为ArrayList底层是动态数组实现的,而数组是一块连续的空间,每次存的时候都是找到索引,一个接着一个的存储,取的时候也要按照索引遍历出来。

 

List有序,Set无序,真的是这样嘛?

 

链表也是一样,不是存到链表头就是存到链表尾。因为存和取的顺序有序,模拟栈(先进后出)和队列(先进先出)这两种数据结构也很容易。但这两种结构它们本身并不能对元素进行排序,这也决定了我不能轻易的找到数组或链表中的最大值和最小值,或者说元素和元素之间存储的并没有什么规律。

 

List有序,Set无序,真的是这样嘛?

 

同样,按照存储顺序来讲,HashSet依赖哈希存储,计算哈希值之后,会分散到不同的存储位置上,这也就代表存储的时候,元素不是一个挨着一个存储的,而是根据每个元素的hash值,散列到了不同的位置。存取的顺序也是不能保证的,元素的排序顺序也是不能保证的,但好处就是存取效率高。

 

List有序,Set无序,真的是这样嘛?

 

而TreeSet依赖的是树存储,在树这种结构中,无论是二分查找树,还是红黑树,在存储元素的时候都会对元素本身进行比较,按照大小放到合适的位置,这也就说明,元素会按照树的性质去存储,那么也就无法保证存和取元素的顺序。但是元素可以在存储的时候根据自身的大小排好序,从而可以很轻易的找到最大值,最小值,以及给定一个元素,找到比他大和比他小元素等操作。

 

List有序,Set无序,真的是这样嘛?

 

总结:按元素存取顺序来说,List是有序的,Set是无序的。按照元素和元素之间的关系来说,List是无序的,TreeSet是有序的。而HashSet怎么说都是无序的。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2024-01-31 16:46:24

SQL数据库

2015-08-27 09:21:20

程序员青春饭

2016-03-15 09:53:43

5GHz5G

2021-01-29 10:23:45

无序数组元素

2020-02-20 10:45:57

代码JS开发

2018-08-22 13:11:35

中数经纬舆情监测中央厨房

2020-12-24 06:00:27

Python编程语言开发

2022-05-13 09:05:37

JSObject无序

2018-09-29 15:34:34

JavaList接口

2020-04-03 21:36:54

数据科技

2015-05-20 14:01:27

程序程序会做饭

2019-11-11 14:55:25

Redis数据类型命令

2020-04-16 11:17:28

MacOSWindows安全

2016-09-23 18:40:42

微软开源代码开源社区

2022-04-29 14:08:50

技术人工智能

2023-12-01 11:13:50

JavaTreeSet

2013-09-11 09:49:18

Java数组集合

2021-12-29 06:07:59

微信安卓腾讯

2010-03-30 14:06:35

2023-05-04 11:35:15

无人机
点赞
收藏

51CTO技术栈公众号