List和Set区别深度解析
2015-06-23 21:12
183 查看
List和Set是集合包中最常用的两个类,对它们进行比较深刻的理解是用好他们的基础。
List和Set的区别很多,但是归根结底是由于它们的底层实现不一样所导致的。List的实现方式主要有:ArrayList和LinkedList,Set的实现方式主要有:HashSet、LinkedHashSet、TreeSet。
ArrayList的底层实现是数组,当向其中添加一个元素时,会先检查数组容量,不足时会对数组进行扩容。由于扩容是比较消耗效率的,因此使用ArrayList时,应予以规避。
同样的可以分析HashSet、LinkedHashSet和TreeSet。HashSet的底层实现是散列表,LinkedHashSet的底层实现是散列表加双向链表,TreeSet的底层实现的红黑树。它们元素位置取决于元素的hash值。因此采用Set进行存取的时候求取hash值是比较消耗资源的。有些便于快速获取hash值的方法是值得借鉴的,比如基本类型的包装器,当第一次运行hashCode方法,便会用一个静态变量将hash值存储起来,以后再次获取时便不需要重新计算。
明白了底层实现的不同,就明白为什么List中元素可以重复而Set中元素不能重复,事实上将元素存储在数组同一元素的散列上,是非常影响散列表性能的,散列表专门提出线性散列法和平方散列法来予以规避,而重复元素势必会插入链表中,因此Set是不允许的。就能明白为什么List中元素是按照插入顺序而Set中元素是无序的(这一点对TreeSet无效),就能明白判断相等时,为什么List中元素大小与顺序要一致,而Set中却只需元素的大小一致。
List和Set的区别很多,但是归根结底是由于它们的底层实现不一样所导致的。List的实现方式主要有:ArrayList和LinkedList,Set的实现方式主要有:HashSet、LinkedHashSet、TreeSet。
ArrayList的底层实现是数组,当向其中添加一个元素时,会先检查数组容量,不足时会对数组进行扩容。由于扩容是比较消耗效率的,因此使用ArrayList时,应予以规避。
同样的可以分析HashSet、LinkedHashSet和TreeSet。HashSet的底层实现是散列表,LinkedHashSet的底层实现是散列表加双向链表,TreeSet的底层实现的红黑树。它们元素位置取决于元素的hash值。因此采用Set进行存取的时候求取hash值是比较消耗资源的。有些便于快速获取hash值的方法是值得借鉴的,比如基本类型的包装器,当第一次运行hashCode方法,便会用一个静态变量将hash值存储起来,以后再次获取时便不需要重新计算。
明白了底层实现的不同,就明白为什么List中元素可以重复而Set中元素不能重复,事实上将元素存储在数组同一元素的散列上,是非常影响散列表性能的,散列表专门提出线性散列法和平方散列法来予以规避,而重复元素势必会插入链表中,因此Set是不允许的。就能明白为什么List中元素是按照插入顺序而Set中元素是无序的(这一点对TreeSet无效),就能明白判断相等时,为什么List中元素大小与顺序要一致,而Set中却只需元素的大小一致。
相关文章推荐
- (六十七)Xcode导入XMPPFramework框架
- C# 连接 Oracle 的几种方式
- 22Spring基于配置文件的方式配置AOP
- 如何退出App之前唤醒另一个App?
- 历史表创建
- Java多线程 多个生产者和多个消费者实现同步 jdk1.5
- 静态方法
- 一个整数二进制中1的个数
- hdu4283 you are the one 区间DP
- 继承
- 封装
- js冒泡排序
- jdbc连接mysql的方法
- 关于 error while loading shared libraries: libXXX.so.1.2.3: cannot open shared object file: No such fi
- ASP.NET编程总结
- 数据表创建
- 方法Demo
- linux基础2——gdb调试器
- MySQL 触发器 语法实例
- html meta标签详解