今天来聊聊收藏。它们在面试中出现的频率很高,在开发中也经常用到。经常听人说List是有序的,Set是无序的,那么这个有序和无序到底指的是什么呢?这里有两个概念,一个是访问元素的顺序,比如我保存的时候是34512,那么应该是34512或者21543。另一个是容器中元素的大小顺序,更准确地说是排序。如果说区分这两个概念,那还好说。看上面的系统图,List家族有两个将军,分别是ArrayList和LinkedList。Set家族主要有两个将军,HashSet和TreeSet。如果要按照存储和检索的顺序,ArrayList和LinkedList属于有序集合,因为ArrayList底层是动态数组实现的,数组是一个连续的空间。每次存的时候都找索引,一个接一个的存储,取的时候也是根据索引遍历。链表也是如此,要么存放在链表的头部,要么存放在链表的末尾。因为存储和检索的顺序是有序的,所以也很容易模拟栈(先进后出)和队列(先进先出)两种数据结构。但是这两种结构都不能自己对元素进行排序,这也决定了我在数组或者链表中不能轻易找到最大值和最小值,或者说元素与元素之间没有规律性。同样,在存储顺序上,HashSet依赖于哈希存储。计算出哈希值后,会分散到不同的存储位置。这意味着在存储的时候,元素不是一个一个存储的,而是根据每个元素的哈希值哈希到不同的位置。访问的顺序也不保证,元素的排序顺序也不保证,但是优点是访问效率高。而TreeSet依赖于树存储。在树结构中,无论是二叉查找树还是红黑树,在存储元素的时候,都会自己比较元素,根据大小将元素放在合适的位置。这意味着,元素将根据树的性质存储,因此无法保证存储和获取元素的顺序。但是元素在存储的时候可以按照自己的大小排序,这样就可以方便的找到最大值,最小值,并且给定一个元素,找到比他大和比他小的元素。总结:在元素访问顺序上,List是有序的,Set是无序的。根据元素与元素之间的关系,List是无序的,TreeSet是有序的。并且HashSet在任何方面都是无序的。
