详解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

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

 LinkedList

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

构造方法

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

方法摘要

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

}
  1. 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()); //输出迭代器中的元素
}
  1. getFirst() 返回此列表的第一个元素。
  2. getLast() 返回此列表的最后一个元素
  3. indexOf(Object o) 返回元素第一次出现的索引
  4. lastIndexOf(Object o) 返回元素最后一次出现的索引
  5. toArray() 返回以适当顺序(从第一个元素到最后一个元素)包含此列表中所有元素的数组
  6. set(index,element) 将指定索引的元素替换成element
  7. size() 返回元素的个数
  8. remove() 移除表头的元素
  9. remove(index) 移除此列表中指定位置处的元素。

ArrayList

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

构造函数

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

方法摘要

  1. 由于和LinkedList继承了同一个接口,因此大部分的函数都是相同的,只是在拓展了一些特有的方法,共有的方法有:add,addAll,get,clone,clear,contains,indexOf,remove,set,size,toArray,lastIndexOf,iterator,listIterator。特有的方法如下:
  2. isEmpty() 如果此列表中没有元素,则返回 true
  3. void trimToSize() 将此 ArrayList 实例的容量调整为列表的当前大小。因为这里的线性列表的容量会随着加入的元素而增加,因此这个函数的作用就是将线性列表的的容量变成当成元素的大小

 Vector

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

构造函数

  1. Vector() 构造一个空向量,使其内部数据数组的大小为 10,其标准容量增量为零。
  2. Vector(Collection<? extends E> c) 构造一个包含指定 collection 中的元素的向量,这些元素按其 collection 的迭代器返回元素的顺序排列。
  3. Vector(int initialCapacity) 使用指定的初始容量和等于零的容量增量构造一个空向量。
  4. Vector(int initialCapacity, int capacityIncrement) 使用指定的初始容量和容量增量构造一个空的向量。
  5. 注意:使用第一种方法系统会自动对向量进行管理,若使用后两种方法。则系统将根据参数,initialcapacity设定向量对象的容量(即向量对象可存储数据的大小),当真正存放的数据个数超过容量时。系统会扩充向量对象存储容量.

方法摘要

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

stack

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

构造方法

Stack() 创建一个空堆栈。

方法摘要

  1. isEmpty() 测试堆栈是否为空。
  2. peek() 查看堆栈顶部的对象,但不从堆栈中移除它。
  3. pop() 移除堆栈顶部的对象,并作为此函数的值返回该对象。
  4. push(E element) 把项压入堆栈顶部。
  5. search(Object o) 返回对象在堆栈中的位置,以 1 为基数。

以上所述是小编给大家介绍的JAVA中的Collection接口和其主要实现的类详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 详解Java包装类及自动装箱拆箱

    Java包装类 基本类型 大小 包装器类型 boolean / Boolean char 16bit Boolean byte 8bit Byte short /16bit Short int 32bit Integer long 64bit Long float 32bit Float double 64bit Double void / Void Java 的包装类有两个主要的目的: Java包装类将基本数据类型的值"包装"到对象中,对基本数据类型的操作变为了对对象进行操作,从而使

  • javascript验证form表单数据的案例详解

    直接po截图和代码 下面是CheckFormDemo.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>验证表单的案例</title> <link rel="stylesheet" type="text/css" href="../css/body.css" rel=&q

  • 详解Java实现批量压缩图片裁剪压缩多种尺寸缩略图一键批量上传图片

    10万+IT人都在关注的图片批量压缩上传方案(完整案例+代码) 背景需求:为了客户端访问图片资源时,加载图片更流畅,体验更好,通常不会直接用原图路径,需要根据不同的场景显示不同规格的缩略图,根据商品关键属性,能够获取到图片不同尺寸规格的图片路径,并且能根据不同缩略图直观看到商品的关键属性,需要写一个Java小工具把本地磁盘中的图片资源一键上传至分布式FastDFS文件服务器,并把图片信息存入本地数据库,PC端或者客户端查询商品时,就可以根据商品的业务属性.比如根据productId就能把商品相关

  • java_IO向文件中写入和读取内容代码实例

    使用java中OutStream()向文件中写入内容 package Stream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class OutStreamDemo01 { public static void main(Str

  • 4位吸血鬼数字的java实现思路与实例讲解

    这个问题来源于Java编程思想一书,所谓"吸血鬼数字"就是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数字,其中从偶数位数字中选取的数字可以任意排列.例如: 1260=21*60,1827=21*87,2187=27*81-- 先列出结果: 一共7个: 1260=21*60,1395=15*93,1435=41*35,1530=51*30,1827=87*21,2187=27*81,6880=86*80 第一种思路对所有的4位数进行穷举,假设这个4位数是a

  • Java中List add添加不同类型元素的讲解

    问题: 今天看java的list ,list后面的<> 里面可以填多种类型,但是如果不填写类型那就默认为 Object 类型. 所有我门 add 到 list 里的 数据都会被转换成 Object 类型. 而当我门再从list 中取出该数据时,就会发现数据类型已经改变. 解答 java集合中 能添加不同类型的元素其实不同类型的元素,只是地一定层次是不同元素,根本上都继承于Object类,本质上还是同一类型的元素. List<Object> list = new ArrayList&

  • 详解javascript函数写法大全

    1.常规写法 function fnName(){ console.log("常规写法"); } 2.匿名函数,函数保存到变量里 var myfn = function(){ console.log("匿名函数,函数保存到变量里"); } 3.如果有多个变量,可以用对象收编变量 3.1 用json对象 var fnobject1={ fn1:function(){ console.log("第一个函数"); }, fn2:function(){

  • Java ThreadLocal的设计理念与作用

    Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量.因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量. 如何创建ThreadLocal变量 以下代码展示了如何创建一个ThreadLocal变量: private ThreadLocal myThreadLocal = new ThreadLocal(); 我们可以看到,通过这段代码实例化了一个ThreadLocal对象.我们只需要实例

  • Java双重检查加锁单例模式的详解

    什么是DCL DCL(Double-checked locking)被设计成支持延迟加载,当一个对象直到真正需要时才实例化: class SomeClass { private Resource resource = null; public Resource getResource() { if (resource == null) resource = new Resource(); return resource; } } 为什么需要推迟初始化?可能创建对象是一个昂贵的操作,有时在已知的运

  • Javascript的this详解

    在理解javascript的this之前,首先先了解一下作用域. 作用域分为两种: 1.词法作用域:引擎在当前作用域或者嵌套的子作用域查找具有名称标识符的变量.(引擎如何查找和在哪查找.定义过程发生在代码书写阶段) 2.动态作用域:在运行时被动态确定的作用域. 词法作用域和动态作用域的区别是:词法作用域是在写代码或定义时确定的:动态作用域是在运行时确定的. this的绑定规则 this是在调用时被绑定,取决于函数的调用位置.由此可以知道,一般情况下(非严格模式下),this都会根据函数调用(调用

随机推荐