hashset是无序的,list是有序的,请问这句话是啥意思,怎么理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hashset是无序的,list是有序的,请问这句话是啥意思,怎么理解相关的知识,希望对你有一定的参考价值。

List,Set都是继承自Collection接口。List特点:元素有放入顺序,元素可重复 。Set特点:元素无放入顺序,元素不可重复。注意,元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的。

有序或无序是指是否按照其添加的顺序来存储对象。List 是按照元素的添加顺序来存储的。而 Set 的实现类都有一套自己的排序算法,每添加一个元素,都会按照其内部算法将元素添加到合适的位置,所以Set集合不能有重复的元素,也不能保证内部存储是按元素添加的顺序而存储的。

List接口有三个实现类:LinkedList,ArrayList,Vector ,Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet。

扩展资料:

HashSet输入顺序:

1、当输入的值大小和底层数组大小差不多的时候,HashSet的输入顺序是无序的,但输出是有序的,因为这些数的哈希值,在底层是顺序拍的,故输出也是有序的。

2、而当输入的值大小和底层数组相差很大时,大的数的哈希值有可能是小于比他小的数的,这时候输出的结果就是无序的。




参考技术A 有序指的是存储顺序和添加顺序是相同的,并且可通过它的下标进行访问。而无序则刚好相反,它存储顺序和添加顺序无关,它是没有下标的,当然也就不能通过下标访问喽 参考技术B 举个简单的例子吧,比如有元素1,2,3,4
那么按顺序插入hashset与list中,但输出不同
hashset无序,所以各种可能的输出都有可能,比如4,2,3,1
而list有序,肯定会输出1,2,3,4追问

我试过N次了,hashset跟List输出结果都是一样的。。。

追答

我需要修改一下答案,不过我可以告诉你Hashset就是无序的,但不是我之前说的都有可能,hashset不会按顺序存储你输入的数据你说你测试过n次了 我想问问你用了几个数据测试?3个还是10个,如果再用多一点数据,你会发现是无序的,之前的所谓“有序”只是偶合罢了,另外如果你使用String这类的特殊类型,你会发现,用三个数据来测试就会发现是无序的。

本回答被提问者采纳
参考技术C 首先说明一下:HashSet和List集合底层都是数组,这个是前提
1.List集合是有序的,是指集合元素的添加顺序和底层数组的索引的顺序是一致的,比如插入第一个元素,索引就是0,插入第二元素索引为1...依次类推
2.hashSet底层也是一个数组.数组本身是有索引的,数组本身肯定是有序的.但是我们这里说的无序指的是元素的插入顺序跟底层保存在数组中的索引位置没有关系,也就是插入的第一个元素其底层数组中对应的索引不一定是0.
最后说下自己关于hashSet数据结构的理解(可能不准确,接受和平批判,不接受喷子/杠精):hashSet保存元素到数组的时候是这么保存的,会根据保存元素的hashCode(),算出来一个hashCode值,然后hashCode值再经过一些算法算出来索引,然后根据这个索引保存这个元素.
参考技术D 0就是指定HashSet的初始容量为0的意思 不过你构造初始容量为0好像没啥意义

以上是关于hashset是无序的,list是有序的,请问这句话是啥意思,怎么理解的主要内容,如果未能解决你的问题,请参考以下文章

java:Set对象TreeSet有序子类,HashSet无序子类,重复对象二

java: Set类及子类:TreeSet有序子类,HashSet无序子类

HashSet的contains()和ArrayList的contains()方法哪个更快一些?

java中collection是啥?怎么理解?怎么使用?

HashSet集合

集合 Set——HashSet和TreeSet