java集合Collection接口

75次阅读

共计 3852 个字符,预计需要花费 10 分钟才能阅读完成。

    在概述里面也说过:Collection 是 java 集合两大接口之一,旗下有三大子接口:Set(元素不能重复,且无序)、Queue、List(元素可重复,且有序)。
    Collection 来源于 java.util 包,主要方法包括:

主要方法 作用
boolean add(Object o) 将传入的 Object 对象添加到容器中,添加后方法返回 true
boolean addAll(Collection c) 将传入的集合 c 中的所有对象添加到容器中,添加后方法返回 true
void clear() 清空集合,集合长度变为 0
boolean contains(Object o) 检查集合是否存在对象 o,若存在返回 true
boolean containsAll(Collection c) 检查集合是否存在集合 c 的所有对象,若存在返回 true
boolean isEmpty() 返回集合的 size 是否为 0
Iterator iterator() 返回 Iterator 对象
boolean remove(Object o) 删除集合中第一个符合条件的元素,若集合存在对象 o,删除并返回 true
boolean removeAll(Collection c) 删除集合中所有与集合 c 重合的元素,若删除后对象进行了改变返回 true
boolean retainAll(Collection c) 删除集合中所有与集合 c 不重合的元素,若删除后对象进行了改变返回 true
int size() 返回集合元素的个数
Object[] toArray() 把集合转变成数组,集合的元素变成对应的数组元素

    下面是 Collection 的实例化以及各成员方法的使用方法

  • 实例化
Collection c1=new TreeSet();   
Collection c2=new HashSet();    
Collection c3=new LinkedHashSet();  
Collection c4=new ArrayDeque();    
Collection c5=new ArrayList();     
Collection c6=new LinkedList();   
  • boolean isEmpty();
boolean isEmpty=c5.isEmpty();
System.out.print(isEmpty?"c5 为空":"c5 不为空");
输出:c5 为空

    因为 c5 在此之前并没有添加任何元素,所以为空。

  • Iterator iterator();
Iterator it5=c5.iterator();
while(it5.hasNext()) {System.out.println("集合 5 元素:"+it5.next());
}
 输出:集合 5 元素:5

    注:每个 Iterator 对象只能使用一次,复用会导致 java.util.ConcurrentModificationException。
    在本代码中,新建了一个局部变量 it5 保存 c5 的迭代器,再通过迭代器的成员方法 hasNext 判断是否存在下一元素,若 true,输出此元素。
    java8 为 Collection 的遍历新增了一个来源于 Collection 的父接口 iterable 的方法:forEach(Consumer action)。

c5.forEach(obj->System.out.println("集合元素为"+obj));
输出:集合元素为 5 
  • boolean add(Object o);
c5.add(5);
Iterator it=c5.iterator();
while(it.hasNext()) {System.out.println("集合元素:"+it.next());
}
输出:集合元素:5

    在本代码中,c5 被添加了一个元素 5,所以经过迭代器输出只能得到 5。

  • boolean addAll(Collection c);
c6.addAll(c5);
Iterator it6=c6.iterator();
while(it6.hasNext()) {System.out.println("集合 6 元素:"+it6.next());
}
输出:集合 6 元素:5

    在本代码中,c5 中的所有元素 (5) 被整体添加到 c6 中,所以 c6 迭代输出 5。

  • void clear();
c6.clear();
Iterator it6=c6.iterator();
while(it6.hasNext()) {System.out.println("集合 6 元素:"+it6.next());
}
无输出

    在本代码中,c6 被清空,所以迭代输出并没有结果。

  • boolean contains(Object o);
boolean isContainsFive=c5.contains(5);
boolean isContainsSix=c5.contains(6);
System.out.println("c5 是否存在元素 5:"+isContainsFive);
System.out.println("c5 是否存在元素 6:"+isContainsSix);
输出:c5 是否存在元素 5:true
      c5 是否存在元素 6:false

    在本代码中,isContainsFive 的值取决于 c5 是否含有元素 5(isContainsSix 亦是如此)。而 c5 只有一个元素 5,所以 isContainsFive 的值为 true,isContainsSix 的值为 false。

  • boolean containsAll(Collection c);
c4.addAll(c5);
System.out.println("c5 是否包括 c6 的全部元素:"+c5.containsAll(c4));
c4.add(3);
System.out.println("c5 是否包括 c6 的全部元素:"+c5.containsAll(c4));
输出:c5 是否包括 c6 的全部元素:true
      c5 是否包括 c6 的全部元素:false

    在本代码中,首先将 c5 的所有元素(5)添加到 c4 中,所以第一个输出语句必定为 true。但是在第一个语句后 c4 添加了一个新的元素 3,所以第二个输出语句为 false。

  • boolean remove(Object o);
c5.add(6);
Iterator it5=c5.iterator();
while(it5.hasNext()) {System.out.println("集合元素:"+it5.next());
}
c5.remove(6);
Iterator aIt5=c5.iterator();
while(aIt5.hasNext()) {System.out.println("集合 5 元素:"+aIt5.next());
}
输出:集合 5 元素:5
      集合 5 元素:6
      集合 5 元素:5

    在本代码中,c5 首先添加了一个新元素 6,迭代输出得到 5、6。然后调用 c5 的成员方法 remove,迭代输出得到 5。

  • boolean removeAll(Collection c);
c5.removeAll(c4);
Iterator aIt5=c5.iterator();
while(aIt5.hasNext()) {System.out.println("集合 5 元素:"+aIt5.next());
}
无输出

    在本代码中,c5 移除掉 c4 中的所有元素(3、5),可以理解为移除掉两个集合的交集,所以迭代输出没有结果。

  • boolean retainAll(Collection c);
c5.add(5);
c4.retainAll(c5);
Iterator it4=c4.iterator();
while(it4.hasNext()) {System.out.println("集合 4 元素:"+it4.next());
}
输出:集合 4 元素:5

    注:因为在方法 9 中集合 5 已经变成空集合,所以在此方法中将 5 添加到集合 5 中以做演示。
    在本方法中,c5 添加了一个元素 5,然后调用 c4 的成员方法 retainAll 删除掉不属于 c5 的所有元素,迭代输出 5。

  • int size();
int size=c4.size();
System.out.println("集合 4 的元素个数为:"+size);
输出:集合 4 的元素个数为:1

    在本代码中,新建一个局部变量 size 保存 c4 的成员方法 size 返回的值,输出得到 1(因为 c4 只有一个元素 5)。

  • Object[] toArray();
System.out.println(c4.toArray());
输出:[Ljava.lang.Object;@71e7a66b

    作为对比,我尝试调用父类 Object 的 String toString()方法,结果得到了[5],与直接输出对象的结果是一致的。

    注:若遍历集合的同时改变集合,将引发 ConcurrentModificationException 异常。

    Collection 接口就写到这里了,看起来简单,但是某些成员方法需要查看源码才知道如何去用,基本上写完这篇博文,我对 Collection 已经有了比较深入的了解,忽然觉得写作跟编程是相辅相成的。

    一点题外话:这是我第一次系统地写博文,懂得了一个道理:世界上没有简单的事。写的不好请多多见谅。之后要狠狠提高一下我的写作水平,之前写公众号的文笔都不知道丢在哪里了。
    如果你还想了解关于 java 集合的内容,欢迎点击 https://segmentfault.com/a/11…

正文完
 0