java集合(一)——数据结构详解:http://www.gaodaima.com/java-article-354226.html
框架是指一个类的集,在集中有很多超类和接口,这些超类中实现了很多高级的机制、功能和策略。框架的使用者可以创建子类来实现和扩展超类,而不用来重新创建这些基本的机制。在日常工作中,我们用到的技术基本都是框架,我们去使用那些包,去调用那些函数时都会用到这种框架的思想。在集合(一)中分析完集合的数据结构,今天我们就一起来继续讨论一下集合的框架。
(一)集合数据结构回顾
基本 | 类型 | 实现接口 | 说明 |
---|---|---|---|
List | 链表LinkedList | Deque,List,Queue | 通过存放前后结点的引用,实现双向链表 |
数组列表ArrayList | List,RandomAccess | 数据传入动态数组中,自动扩充数组大小 | |
Set | 散列集HashSet | Set | 哈希法存储数据,无序但查找时效率高 |
树集TreeSet | NavigableSet,Set,SortedSet | 按照一定方法排序,输出有顺序的集合 | |
Queue | 优先级队列PriorityQueue | Queue | 按照堆排序的方法排序的队列树 |
双端队列ArrayDeque | Deque, Queue | 可以在两端添加和删除,不能操作中间的队列 | |
Map | 散列表HashMap | Map | 用哈希法存放的,键值映射的表 |
树表TreeMap | Map,NavigableMap,SortedMap | 将键按照一定方法排序的表 | |
注:前六种(不包括Map)都实现了Collection和Iterator接口,因为篇幅限制没有写出。 |
(二)视图
在集合类库中,我们已经用了非常大的比例来构建实现类的接口,那么这些接口有什么用呢?如果我们直接把接口中方法写在实现类中不也起到一样的效果么?实际情况远非我们想的这么简单,有很多复杂的东西需要我们通过这些接口来操作。比如,我们把某些类的公有接口类型的对象称为视图对象。这些对象的类型并不是具体的某个实现类,而是一些实现类的公有接口。视图有很多作用,主要本文来源[email protected]搞@^&代*@码)网5的有以下这几点:
1. 视图是轻量级的集包装器
我们可以通过方法,将普通数组包装成类型为List的视图对象。这个视图对象的类型是List,这听上去可能有些不可思议,因为List是一个接口,并不能实例化。但这就是视图对象的优势,这个视图对象可以通过一定的方法被赋予到任何实现了List接口的集合类中,比如常见的ArrayList、LinkedList等等,从而达到我们将一个普通类包装成集合类的目的。
package SetViews;import java.util.Arrays;import java.util.Collections;import java.util.LinkedList;/** * * @author QuinnNorris * 视图是一个轻量级的集包装器,下面有两个例子 */public class Views { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //-----------------------例1---------------------- int[] arr = new int[10]; //创建一个普通的int数组 Arrays.asList(arr); //通过asList方法,我们将一个普通的数组转换成List类型的视图对象。 //-----------------------例2----------------------- List<String> ll = new LinkedList<>(); //创建一个LinkedList对象ll。 ll.addAll(Collections.nCopies(10, "ok")); //nCopies是Collections类的静态方法,可以将“ok”复制10次,并返回一个List类型的视图对象。 //在这里我们不可以直接把Collections.nCopies的类型强转成LinkedList,因为语法不能上转下 //我们通过addAll方法将这个内容填充到LinkedList对象ll中。 ll.set(2, "no"); //我们看看它是否能正常工作,我们试着将第三个链表中的String换成no。 //请注意,链表最好不要使用get和set方法,这里只是为了实验。 for(String s : ll){ System.out.println(s); } //输出结果第三个是no,其他全是ok,没有任何问题。 }}