在jdk提供的List,Set,Map实现中,Set类型依赖于Map的存储方式,Map对象采用树形结构以及哈希(散列表)结构存储;List对象则依赖于数组和链表结构。
类型 实现类 存储结构
List ArrayList 数组
LinkedList 链表
Set HashSet 哈希(散列)表
TreeSet 树形结构
Map HashMap 哈希(散列)表
TreeMap 树形结构
List类型存放的数据不要求唯一,即在List中的数据可以有多个数据是相同的,即list.get(i).equals(list.get(j))=true(i!=j).
Set类型存放的数据必须是唯一的,即在List中不可能存在多个数据相同的情况,如果存放相同的数据进入Set类型中,后一个数据将覆盖前一个数据。
Map采用的是K-V的存放方式,在Map对象中,Key是不允许重复,如果重复,后一个key覆盖前个key,但是Value是可以重复的。
在工作当中如何选用相应的数据对象可根据数据存储的需求做出选择。如存储数据可能有重复的数据,那么就不能选择set的存储方式,而采用Map或者List。
当然List,Set,Map在存放数据时都有优点和缺点。
实现类 存储结构 优点 缺点
ArrayList 数组 能够快速的查询,插入少量数据。 插入大量数据以及移除数据时性能较低。
LinkedList 链表 能够快速的插入,移除 查询数据时性能不及ArrayList
HashSet 哈希 在存储数据过程中性能都比较理想 哈希是存在数据冲突的情况,这中情况
虽然少见但存放大量数据时时不可避免
在初始化时如果不设定容量大小,默认
大小为2的30次方,浪费空间,如果设
定大小,又需要用户估计数据量。
TreeSet 树形 插入,移除效率都不错 查询数据效率不及HashSet.
HashMap 同HashSet
TreeMap 同TreeSet
结后语:这段时间项目空闲期,阅读了一下常用的collections类型,感觉还不错,体会到“阅读源代码确实是提高代码质量的最佳方法”,目前准备阅读一下collections框架中的排序以及Iterator接口。