JAVA中的Collection接口和其主要实现的类

JAVA中的Collection接口和其主要实现的类

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set,详细信息可见官方文档http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/Collection.html,下面我们来讨论继承它的接口list,Set,这两个接口实现了主要的方法,但是还是有一些拓展的,不如list中的迭代就和collection中的有些不同,下面会详细介绍,这里我们用一个例子体会一下这里的接口的实现:

 Collection<Integer> list=new LinkedList<>();  

list

  • list是有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
  • listSet不同,list允许重复的元素插入
  • list接口提供了两种在列表的任意位置高效插入和移除多个元素的方法。
  • 下面我们来具体介绍一下它的实现的类

LinkedList

从文档中可以看到这个listedList实现的不只是list接口,比如还是实现了Deque接口,这个为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。这里的LinkedList都是用双向链表实现的,这个类不是同步的,因此在多个线程中有修改其中的元素操作时必须实现外部的线程同步

构造方法

  • LinkedList() 创建一个空的链表
  • LinkedList(Collection<? extends E> c) 构造一个包含指定 collection 中的元素的列表,这些元素按其 collection 的迭代器返回的顺序排列,构造如下:
        ArrayList<Integer> arrayList=new ArrayList<>();  //这里新建一个线性列表
        LinkedList<Integer> linkedList=new LinkedList<Integer>(arrayList);  //用线性列表新建一个链表
        System.out.println(linkedList.getFirst());      

方法摘要

  • boolean add(E e) 将指定元素添加到此列表的结尾。成功插入返回True
  • void add(int index, E element) 在此列表中指定的位置插入指定的元素。
  • boolean addAll(Collection<? extends E> c) 添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序。例子如下:
 ArrayList arrayList=new ArrayList();//新建一个线性表
        arrayList.add(10);
        arrayList.add(100);
        arrayList.add(2);
        LinkedList linkedList=new LinkedList();
        linkedList.add(100);
        linkedList.add("chenjiabing");

        linkedList.addAll(arrayList);  //将线性表中所有的元素添加到链表中
        for(Object i:linkedList)
        {
            System.out.println(i);
        }

  • boolean addAll(int index, Collection<? extends E> c) 将指定 collection 中的所有元素从指定位置开始插入此列表。
  • addFirst 将指定的元素添加到开头
  • addLast 将指定的元素添加到末尾
  • clear() 从列表中移除全部的元素
  • clone() 得到一个链表的副本,由于其返回的类型是Object,因此需要进行强制转换成LinkedList类型
 LinkedList list=(LinkedList)linkedList.clone();
  • contains(Object o) 如果此列表中包含元素o返回True
  • element() 获取但不移除此列表的头(第一个元素)。
  • iterator() 返回列表中的元素的迭代器
Iterator iter=list.iterator();      //返回一个迭代器类型
while(iter.hasNext())     //判断迭代器中是否存在元素
{
    Object o=iter.next();    
    if(o.equals(1))
    {
    System.out.println(o);   //输出迭代器中的元素
    iter.remove();   //移除这个元素,这个是从列表中直接移除的
}
    
}
  • listIterator() 返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始
ListIterator iterator = list.listIterator();
        while (iterator.hasNext())     //首先将迭代器一直运行到末尾
        {
            Object o = iterator.next();
            if (o.equals(1)) {
                iterator.add(100);   //将元素插入到当前元素的前面,这个在Iterator是不存在的方法
            }

        }

        while (iterator.hasPrevious())   //这时的迭代器是从末尾开始的,因此这里相当与逆序输出
        {
            System.out.println(iterator.previous());
        }
  • get(int index) 返回此列表中指定位置处的元素。这里要注意的是虽然这种方式能够得到指定索引的值,但是这里对于链表中的操作开销是非常大的,因此这个方法不主张使用,如果需要遍历列表可以使用迭代器和for-each语句
LinkedList list=new LinkedList();
for(int i=0;i<10;i++)
{
    list.add(i);
}
for(Object o:list){     //使用for-each遍历列表
System.out.println(o); 
}

Iterator iter=list.iterator();      //返回一个迭代器类型

while(iter.hasNext())     //判断迭代器中是否存在元素
{
    System.out.println(iter.next());   //输出迭代器中的元素
}

  • getFirst() 返回此列表的第一个元素。
  • getLast() 返回此列表的最后一个元素
  • indexOf(Object o) 返回元素第一次出现的索引
  • lastIndexOf(Object o) 返回元素最后一次出现的索引
  • toArray() 返回以适当顺序(从第一个元素到最后一个元素)包含此列表中所有元素的数组
  • set(index,element) 将指定索引的元素替换成element
  • size() 返回元素的个数
  • remove() 移除表头的元素
  • remove(index) 移除此列表中指定位置处的元素。

ArrayList

  • List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。)
  • 每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。
  • 注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法将该列表“包装”起来

构造函数

  • ArrayList() 构造一个初始容量为 10 的空列表。
  • ArrayList(Collection<? extends E> c) 构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
  • 构造一个具有指定初始容量的空列表。

方法摘要

由于和LinkedList继承了同一个接口,因此大部分的函数都是相同的,只是在拓展了一些特有的方法,共有的方法有:add,addAll,get,clone,clear,contains,indexOf,remove,set,size,toArray,lastIndexOf,iterator,listIterator。特有的方法如下:

  • isEmpty() 如果此列表中没有元素,则返回 true
  • void trimToSize() 将此 ArrayList 实例的容量调整为列表的当前大小。因为这里的线性列表的容量会随着加入的元素而增加,因此这个函数的作用就是将线性列表的的容量变成当成元素的大小

Vector

  • Vector类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作
  • 每个向量会试图通过维护 capacity 和 capacityIncrement 来优化存储管理。capacity 始终至少应与向量的大小相等;这个值通常比后者大些,因为随着将组件添加到向量中,其存储将按 capacityIncrement 的大小增加存储块。应用程序可以在插入大量组件前增加向量的容量;这样就减少了增加的重分配的量。
  • 从源码中可以看出Vector是线程安全的,源码中的插入和删除操作都实现了进程的同步语句块,因此Vector的插入和删除是比较低效的

构造函数

  • Vector() 构造一个空向量,使其内部数据数组的大小为 10,其标准容量增量为零。
  • Vector(Collection<? extends E> c) 构造一个包含指定 collection 中的元素的向量,这些元素按其 collection 的迭代器返回元素的顺序排列。
  • Vector(int initialCapacity) 使用指定的初始容量和等于零的容量增量构造一个空向量。
  • Vector(int initialCapacity, int capacityIncrement) 使用指定的初始容量和容量增量构造一个空的向量。

注意:使用第一种方法系统会自动对向量进行管理,若使用后两种方法。则系统将根据参数,initialcapacity设定向量对象的容量(即向量对象可存储数据的大小),当真正存放的数据个数超过容量时。系统会扩充向量对象存储容量.

方法摘要

同样是继承了List接口,因此大部分的方法都是一样的,比如add,addAll,clear,clone,contains,remove,removeall

stack

Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。
注意:这里的stack虽然继承了了Iterator接口但是如果使用了迭代的话它输出的还是原来你输入的顺序,这里就违背了栈的原理后进先出

构造方法

  • Stack() 创建一个空堆栈。

方法摘要

  • isEmpty() 测试堆栈是否为空。
  • peek() 查看堆栈顶部的对象,但不从堆栈中移除它。
  • pop() 移除堆栈顶部的对象,并作为此函数的值返回该对象。
  • push(E element) 把项压入堆栈顶部。
  • search(Object o) 返回对象在堆栈中的位置,以 1 为基数。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX阅读 820评论 0 1
  • 集合类简介 为什么出现集合类?面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就要对对象进...
    阿敏其人阅读 1,352评论 0 7
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,292评论 18 399
  • 学校礼堂到操场982步 操场到女生宿舍3号楼1133步 二部食堂到北大门口1044步 图书馆到女生宿舍3号楼102...
    现实说阅读 552评论 0 0
  • 你认识蜡笔小新吗? 认识啊,天天脱光光躺在地板上那个嘛。 那你知道蜡笔小新的妈妈叫什么吗? 蜡笔妈妈...
    大肚南瓜阅读 149评论 0 0