Java类集(List,Vector,map……) (1)

1.1在介绍类集框架之前,先来思考这样一个问题,如果现在要保存一组对象,按照初级的做法只能使用对象数组,但是使用对象数组操作本身有一个限制,就是数组有长度的限制;而通过一些数据结构的操作,如链表,则可以完成动态对象数组的操作,但是这些如果全部由开发人员来做,肯定非常麻烦。

 

类集框架恰好解决了以上问题,所谓的类集就是一个动态的对象数组,是对一些实现好的数据结构进行了包装,这样在使用时就会非常方便,而且最重要的是类集框架本身不受对象数组长度的限制。

类集框架被设计成拥有以下几个特性:

1.这种框架是高性能的,对基本类集(动态数组,链表,树和散列表)的实现是高效率的,一般很少人工去对这些‘数据引擎’编写代码。

2.框架必须允许不同类型的类集以相同的方式和高度互操作方式工作。

3.类集必须是容易拓展和修改的。为了实现这一目标,类集框架被设计成包含了一组标准接口。

 

关于相同的方式及高度的解释:

在类集的操作中因为使用类的形式实现的动态对象数组,所以对于任何对象所有的操作形式都是一样的。例如,添加内容一定使用add()方法。

高度一般指的是类集中的元素类型是统一的,一个集合中要么都是A对象,要么都是B对象。

 

 

1.2.类集框架的主要接口

在整个Java类集中最常使用是:Collection,List,Set,Map,Iterator,ListIterator,Enumeration,SortedSet,SortedMap,Quene,Map.Entry,这些接口的具体特点以下分步骤详解。

他们的继承关系如下:

           collection                                                    Map

 List  Set  Quene  SortedSet                               SortedMap

Collection底下为四个,Map底下为SortedMap

而关于SortedXx定义的接口都是排序接口。

 

1.2.1 Collection

关于Collection,在一般开发中,基本不直接使用,都是使用它的子接口,如List,Set……

List大家很熟悉,在这里就不赘述了。

我来先介绍一下一个挽救的子类,Vector!

在List接口中还有一个子类Vector,这个类属于一个挽救的子类,在整个Java集合发展历史来看,Vector是一个元老级的类了,在JDK1.0就已经存在,到了Java1.2之后重点强调了集合框架的概念,所以定义了许多新的接口,而考虑到一大部分用户已经习惯了Vector,所以Java设计者就让Vector实现了一个List接口保留下来。因为实现了List接口,所以Vector的使用和List没有太大区别。

Public class Vector<E>extends AbstracList<E>

implements List<E>,RandomAccess,Cloneable,Serializable

从定义来看,和ArrayList一样继承了AbstracList类

代码如下:

 1 package com.zhengyu.java;
 2 
 3 import java.util.List;
 4 import java.util.Vector;
 5 
 6 public class Vector_demo {
 7 
 8     public static void main(String[] args) {
 9         List<String> allList=null;
10         allList=new Vector<String>();
11         allList.add("hello");
12         allList.add(0,"before hello");
13         allList.add("lastone");
14         for (int i = 0; i < allList.size(); i++) {
15             System.out.println(allList.get(i)+" ");
16         }
17 
18     }
19 
20 }

以上代码和List操作没什么区别,但是呢,由于是元老级的类啦,还有许多List没有的方法,例如,addElement(E o)方法,是最早的增加操作,JDK1.2之后此方法和add是一致的。

代码如下:

 1 package com.zhengyu.java;
 2 
 3 
 4 import java.util.Vector;
 5 
 6 public class Vector_demo {
 7 
 8     public static void main(String[] args) {
 9 
10         Vector<String> allList = new Vector<String>();
11         allList.addElement("hello");
12         allList.addElement("world");
13         for (int i = 0; i < allList.size(); i++) {
14             System.out.println(allList.get(i));
15         }
16 
17     }
18 
19 }

 

那么,子类的差异:ArrayList和Vector的区别在哪里呢?

到底使用哪一个子类,主要区别如下:

1.在推出时间来看,JDK1.2推出ArrayList,JDK1.0推出Vector。

2.在性能上,ArrayList属于异步处理,性能更高,so,Vertor属于同步处理,性能较低。

3.线程安全来说,ArrayList属于非线程安全,因为异步性能更高速度快普遍不安全啊。那么Vector属于线程安全的。

4.输出来说,ArrayList只能用Iterator,foreach。Vector可以多一个Enumeration。

 

 

 

1.2.2 LinkedList子类和Quene接口。


下面来聊聊链表和Quene接口。

LinkedList表示的是一个链表的操作类,即java中已经开发好的链表程序,你直接用就行了。

定义如下:

public class LinkedList<E> extends AbstractSequentiaList<E> 

implements List<E> ,Quene<E>,Cloneable,Serializable

可以发现,虽然实现了List接口,但是也实现了Quene接口,Quene表示的就是队列操作接口,采用FIFO(先进先出),是不是很熟悉,Stack栈内存的特点。Quene上面提到了,是Collection的子接口

public interface Quene<E> extends Collection<E>

 1 package com.zhengyu.java;
 2 
 3 import java.util.LinkedList;
 4 
 5 public class LinkedList_demo {
 6 
 7     public static void main(String[] args) {
 8         LinkedList<String> link = new LinkedList<String>();
 9         link.add("demo1");
10         link.add("demo2");
11         link.add("demo3");
12         System.out.println("element()方法找到表头:" + link.element());
13          //     element()方法找到表头:A
14         System.out.println("找完之后链表的内容:" + link);
15      //找完之后链表的内容:A,B,C
16         System.out.println("peek()方法找到表头:" + link.peek());
17        //peek()方法找到表头:A
18         System.out.println("找完之后链表的内容:" + link);
19 //找完之后链表的内容:
20         System.out.println("poll()方法找到表头:" + link.element());
21 //poll()方法找到表头:A
22         System.out.println("找完之后链表的内容:" + link);
23 //找完之后链表的内容:B,C
24     }
25 
26 }

几个方法区别如下:

找到表头,public E element()

找到表头不删除表头:public E peek()

找到表头删除表头:  public E poll()

那么用poll方法的话,就用for循环取数据,拿一个删一个,最后删光了也全部拿出来了。

比如在以上代码更改最后的输出为;

for(int i=0,i<link.size(),i++){

 System.out.print(link.poll());

}

结果也为A,B,C

 

今天有点事先聊到这,下次再补充其它的集合框架接口。

 

posted @ 2016-04-23 18:42  Spring5945  阅读(768)  评论(1编辑  收藏  举报