谈谈Java的Collection接口

谈谈Collection

前言

这一篇讲的collection接口;首先,集合是用来存储数据的,它是基于某种数据结构数据容器。常见的数据结构:数组(Array)、集(Set)、队列(Queue)、链表(Linkedlist)、树(Tree)、堆(Heap)、栈(Stack)和映射(Map)等结构。集合大类分为了Collection和Map以下图编程

Collection

这一篇文章的内容——如今讲下collection,“集合、容器”,用来存储数据的,它是一个接口,不能直接实例化使用;只能经过它的子类来完成,从上图来看,Collection分为List和Set,List集合中的元素是有序的、可重复的,而Set集合中的元素是无序的、不能重复的。List集合强调的是有序,Set集合强调的是不重复。下面是它的已知实现类。数组

Collection是描述全部序列容器的共性的根接口,可能会被认为是一个附属接口,即由于要表示其余若干个接口的共性而出现的接口。同时为何要将其做为接口?是由于可使咱们可以建立更通用的代码。经过针对接口而非具体实现来编写代码,这样,才能够更好地应用于更多的对象类型。

下面的是Collection更加仔细一点的分类。今天这篇重点介绍一下Collection的几个方法,掌握了这些,对于它的子类都是能够直接拿来用的。子类的介绍后面再总结出来。数据结构

方法

遇到一些本身不熟的知识点,在IDEA上能够直接查看该接口的详细源码(ctrl加鼠标左键),点开旁边的结构图按钮,能够直观得去查看这些方法框架

1.boolean add(E)

这个一看就知道了,就是添加功能,往集合里面添加元素或者对象的方法,如果list这种,由于它返回都是true,通常状况下,能够随便往里面添加。dom

Collection s = new Collection();
s.add(你要添加的);
s.add("你要添加的");

有时须要注意的时候,若是操做的集合是不容许重复值的,往里面添加就会报错。返回的是false.code

2.void clear()

移除容器中的全部元素,该集合不支持移除的话就会抛出UnsupportedOperationException异常(不支持该操做)对象

//接着用上面的s集合
s.clear();
//这时候集合为空了

3.boolean contains(Object o)

用来检查此集合是否包含指定元素或者对象,包含则返回true不包含就返回false;会返回两种错误。接口

4.boolean isEmpty()

用来检查集合中是否为空,若是为空就返回true。队列

5.Iterator iterator()

返回一个Iterator 迭代器,这个方法是用来遍历集合中的元素的,在一些须要获取集合中的元素(包括打印输出,调用等场景下),依赖于集合而存在的,有next方法和hasNext方法。

这两个方法通常状况下都是绑定一块儿用的。形式以下。

//其主要的用法以下,遍历的功能
//经过集合对象获取迭代器对象
Iterator i = 集合.iterator();
//hasNext方法是布尔型的返回值,有元素在集合里面的时候就会返回true
while(it.hasNext()){
    System.out.println(it.next());
}

6.int size()

用来返回的集合的长度,也就是集合里面的元素的个数。

//直接使用,返回长度
集合.size();

7.Boolean remove()

用来删除集合中的元素,对象,只要有移除动做就会返回true。

总结

什么是可选操做

在看源码的时候,会发现有些方法在后面会标记为可选操做 (optional operation)。

执行各类不一样的添加和移除的方法在Colletion接口中都是可选操做,这意味着实现类并不须要为这些方法提供功能定义。......若是一个操做是可选的,编译器仍旧会严格要求你只能调用该接口中的方法。

它声明调用某些方法将不会执行有意义的行为,相反,它们会抛出异常。 ——《Java编程思想》

异常UnsupportedOperationException(这个和上面讲remove时候不支持操做的时候抛出同样的异常)

大概意思是collection子类能够重写这个方法以达到子类本身的目的,也能够不覆盖这个方法可是。没有实现这个方法的子类使用这个方法的话会抛出UnsupportedOperationException异常。(这个未得到支持的异常在运行时候才能探测到,属于动态类型异常),先看下报错的代码示例

package music.daima.ebook;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

/**
 * @author yhy
 * 这个是用来观察java中的可选操做方法的一些特色以及定义使用以及报错的缘由,这是书上的代码
 */
public class Unsupport {
    
    static void test(String msg, List<String> list) {
        System.out.println("--- " + msg + " ---");
        Collection<String> c = list;
        Collection<String> subList = list.subList(1,8);
        Collection<String> c2 = new ArrayList<String>(subList);
        try {
            c.retainAll(c2);
        }
        catch(Exception e) {
            System.out.println("retainAll(): " + e);
        }
        try { c.removeAll(c2); } catch(Exception e) {
            System.out.println("removeAll(): " + e);
        }
        try { c.clear(); } catch(Exception e) {
            System.out.println("clear(): " + e);
        }
        try { c.add("X"); } catch(Exception e) {
            System.out.println("add(): " + e);
        }
        try { c.addAll(c2); } catch(Exception e) {
            System.out.println("addAll(): " + e);
        }
        try { c.remove("C"); } catch(Exception e) {
            System.out.println("remove(): " + e);
        }
        // The List.set() 虽然改变了值但没有改变它的数据结构尺寸
        try {
            list.set(0, "X");
        } catch(Exception e) {
            System.out.println("List.set(): " + e);
        }
    }
    public static void main(String[] args) {
        //asList方法:返回由指定数组支持的固定大小的列表。 (将返回的列表更改成“写入数组”。)该方法做为基于数组和基于集合的API之间的桥梁,与Collection.toArray()相结合 。 
        //返回的列表是可序列化的,并实现RandomAccess 。 此方法还提供了一种方便的方式来建立一个初始化为包含几个元素的固定大小的列表:
        List<String> list  = Arrays.asList("A B C D E F G H I J K L".split(" "));
        System.out.println(list.getClass());
        test("Arrays.asList()", list);
        // System.out.println(list1.getClass());
        test("Modifiable Copy", new ArrayList<String>(list));
        //test("unmodifiableList()",Collections.unmodifiableList(new ArrayList<String>(list)));
    }

}

output(输出):

集合使用的总体框架(步骤)

相关文章
相关标签/搜索