java中的Collection接口

75 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

前言

之前我讲了一些有关于链表的事,并且挖了个坑说要顺便讲讲collection和子类的子类ArrayList和linklist。

collection类

对于这个类来说,他的子类有两个主要分支,一个是link链表,另外一个是set集合(不在今天的讨论范围之内),所以我们先讲一下他的对应方法吧。

常用的方法

对于Collection来说,里面的方法还是挺通俗易懂的。就比如说size方法返回的是集合中元素的的个数。isEmpty当且仅当集合为空才会true。在元素x在集合中才会true的contains方法。add和remove方法自然就是用添加和删除的方法。如果正常删除了就会返回true,但是如果说对应实现了collection接口子类执行方法这两个方法时,有些子类是不允许重复插入的(后文会讲是哪个)或者是删除一个不存在的元素,他就会返回false。然后就是有一些stream流的对应方法。原理一样这里就不多叙述。

iterstor接口

众所周知,集合是用来存储元素的,你存储了元素就自然有需求要去除元素作为需求。你有以下两种方式遍历元素假设是这样的。

加强for循环

这个就是最简单的写法,这里不做详细说明。直接看代码

Collection collections = new ArrayList<String>();
collections.add("1");
collections.add("2");
collections.add("3");
collections.add("4");
for (Object s :collections) {
    System.out.println(s);
}

iterator接口的方式

使用也是比较简单的,直接上代码演示

//注意前面部分与上面代码是一致的
Iterator iterator = collections.iterator();
while (iterator.hasNext())
{
    String aim = (String) iterator.next();
    System.out.println(aim);
}

根据这两段的演示我们好像没有发现他们有什么区别,只感到迭代器的麻烦。要写的多。但是当我们对对数据有所操作时,你就会发现还是后者好。

后者的优势

当我们需要各一个进行添加之类的操作时,你再去遍历就会出现以下异常。

for (Object s :collections) {
    if (s.equals("1"))
    {
        collections.remove("1");
    }
    System.out.println(s);
}
//出现异常Exception in thread "main" java.util.ConcurrentModificationException

但是你想下面这个代码这样就是没有什么问题的

while (iterator.hasNext())
{
    String aim = (String) iterator.next();
    if (aim.equals("2"))
    {

        iterator.remove();
    }else
    System.out.println(aim);
}

就是进行一些操作,在collection是不合法的,但是在iterator是可行的,就不如说这个remove,也没有其他的方法了。