Set和List的区别

来源:互联网 发布:gps航迹编辑软件 编辑:程序博客网 时间:2024/06/13 11:58
Collection
    |--List:列表。
            特点:

            1,有序(存储元素的顺序和取出元素的顺序一致)

            2,该集合中的元素都有索引,所以可以通过索引(角标)来访问元素。 
            3,它可以存储重复元素。 
            
            常见子类对象:记住:具体的子类对象,我们要学习应该是该对象的特有的数据结构,以及相关的特点。
            |--Vector:jdk1.0就存在了。底层是数组结构的。可变长度数组,
                        原理:一旦原数组长度不够,会创建新数组,将原数组的元素复制到新数组中,并将新元素添加到新数组中。
                        Vector是同步的。
            |--ArrayList:底层是数组结构,也是支持长度可变数组的。是不同步的。替代了Vector.因为效率高。 查询效率很高。 但是增删的效率很低。
            |--LinkedList:底层是链接列表结构,简称链表结构。是不同步的。这个中结构的好处:对元素的增删非常效率很高。 查询的效率很低。
            
    |--Set:集:中的方法和Collection一致,只要重点注意它的子类对象即可。取出元素只能使用迭代器。
            特点:
            1,不包含重复元素。(最大的特点)
            2,这个集合存入元素的顺序和取出元素的顺序不一定一致。(具体的容器对象数据结构不同,顺序也有不同)
            |--HashSet:底层数据结构是哈希表,不保证顺序,是不同步的。
                        哈希表:提供数组的查询效率而出现的。
                                将要存储的元素先通过哈希算法算出一个哈希值来标识存储的位置,代表着元素。
                                要找元素时,先将该元素通过哈希算法算出哈希值,在通过哈希值到哈希表中去查找。
                                特点:
                                1,不关系元素的顺序。
                                2,提高了查询效率。
                                3,不可能出现重复元素,因为哈希值都不同。即使相同,会再次判断两个元素的equals,内容是否相同。
                                    如果内容也相同,不存,如果内容不同,存储。
                                所以哈希表要保证元素的唯一性,必须要依赖于两个方法。
                                1,hashCode
                                2,equals    
                                
            |--TreeSet:可以给Set集合中的元素进行指定顺序的排序。非同步的。 
                        默认情况下,是通过元素的自然顺序排的序。
                        它保证元素唯一性的依据是看比较方法的返回结果是否是0.是0.就视为元素相同。不存。
                        TreeSet排序的方式一:让元素自身具备比较性,需要实现Comparable接口,覆盖compareTo方法。
                        这种比较方式成为自然顺序排序。
                        
                        如果元素自身不具备比较性或者具备的比较性(自然顺序)不是所需要的。
                        这时只能用第二种方式 。
                        TreeSet排序的方式二:让容器自身具备比较性。容器一初始化就具备了比较功能。
                        因为容器时在对象构造时完成的。通过查阅,有一个构造方法TreeSet(Comparator).
                        在容器初始化时可以指定一个比较器。 
                        需要实现Comparator接口,覆盖compare方法即可。

                        所以这种方式成为比较器排序。 

LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素的次序. 

【什么时候选择List ,什么时候选择Set 呢?】

当存入的的对象有重复时,用List,没有重复元素时,用Set。

0 0
原创粉丝点击