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

    xiaoxiao2021-04-14  61

    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

    转载请注明原文地址: https://ju.6miu.com/read-670196.html

    最新回复(0)