list和set简单理解

来源:互联网 发布:tensorflow的windows版 编辑:程序博客网 时间:2024/06/07 05:17



List和Set是集合包中最常用的两个接口,对它们进行比较深刻的理解是用好他们的基础。
         List和Set的区别很多,但是归根结底是由于它们的底层实现不一样所导致的。List的实现方式主要有:ArrayList和LinkedList,Set的实现方式主要有:HashSet、LinkedHashSet、TreeSet。
         ArrayList的底层实现是数组,当向其中添加一个元素时,会先检查数组容量,不足时会对数组进行扩容。由于扩容是比较消耗效率的,因此使用ArrayList时,应予以规避,但是LinkedList底层则是链表。所以,ArrayList比较LinkedList查询速度比较快,但是赠删改效率低于LinkedList
     同样的可以分析HashSet、LinkedHashSet和TreeSet。HashSet的底层实现是散列表,LinkedHashSet的底层实现是散列表加双向链表,TreeSet的底层实现的红黑树。它们元素位置取决于元素的hash值。因此采用Set进行存取的时候求取hash值是比较消耗资源的。有些便于快速获取hash值的方法是值得借鉴的,比如基本类型的包装器,当第一次运行hashCode方法,便会用一个静态变量将hash值存储起来,以后再次获取时便不需要重新计算。
     明白了底层实现的不同,就明白为什么List中元素可以重复而Set中元素不能重复,事实上将元素存储在数组同一元素的散列上,是非常影响散列表性能的,散列表专门提出线性散列法和平方散列法来予以规避,而重复元素势必会插入链表中,因此Set是不允许的。就能明白为什么List中元素是按照插入顺序而Set中元素是无序的(这一点对TreeSet无效),就能明白判断相等时,为什么List中元素大小与顺序要一致,而Set中却只需元素的大小一致。



0
 
原创粉丝点击