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
今天有点事先聊到这,下次再补充其它的集合框架接口。