Java 集合-Collection接口和迭代器的实现
发布日期:2022-04-02 18:15:41 浏览次数:11 分类:博客文章

本文共 4786 字,大约阅读时间需要 15 分钟。

2017-10-30 00:30:48

  • Collection接口

Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 SetList)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作collection。

所有超级接口:
Iterable<E>
所有已知子接口:
BeanContext, BeanContextServices, BlockingDeque<E>, BlockingQueue<E>, Deque<E>, List<E>, NavigableSet<E>, Queue<E>, Set<E>, SortedSet<E>
所有已知实现类:
AbstractCollection, AbstractList, AbstractQueue, AbstractSequentialList, AbstractSet, ArrayBlockingQueue, ArrayDeque, ArrayList, AttributeList, BeanContextServicesSupport, BeanContextSupport, ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet, DelayQueue, EnumSet, HashSet, JobStateReasons, LinkedBlockingDeque, LinkedBlockingQueue, LinkedHashSet, LinkedList, PriorityBlockingQueue, PriorityQueue, RoleList, RoleUnresolvedList, Stack, SynchronousQueue, TreeSet, Vector

Collection接口方法测试:

由于Collection是接口且没有可以实现的儿子,所以使用ArrayList进行测试。

public class Demo2{    public static void main(String[] args) {        Collection c = new ArrayList();        c.add("Hello");        c.add("World");        // c.clear();        c.remove("World");        System.out.println(c.contains("Hello"));        System.out.println(c.isEmpty());        System.out.println(c.size());        System.out.println(c);    }}

这里需要关注一下retainAll()的方法,该方法为求两个集合的交集。例如,A对B做交集,那么交集集合放在A中,返回值的布尔类型表示的是A有没有发生变化,如果发生的变化则返回False,如果没有变化则返回True

集合的遍历:

1、Object[] toArray():把集合转成数组,可以实现集合的遍历

import java.util.ArrayList;import java.util.Collection;public class Demo2 {    public static void main(String[] args) {        Collection c = new ArrayList();        c.add("Hello");        c.add("World");        c.add("!");        Object[] obj = c.toArray();        for (int i = 0; i < obj.length; ++i) {            System.out.println(obj[i]);        }    }}

2、Iterator iterator():迭代器,集合的专用遍历方式,迭代器依赖于集合而存在

Iterator:对 collection 进行迭代的迭代器。迭代器取代了 Java Collections Framework 中的 Enumeration。迭代器与枚举有两点不同:

  • 迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。
  • 方法名称得到了改进。

接口 Iterator为什么不是一个类的原因假设迭代器定义是一个类,这样我们就可以使用类对象,调用该类的对象的方法就可以实现集合的遍历操作。然而,集合中是有很多的不同类型的数据结构组成的集合类的,诸如hashtable,红黑树等,显然无法使用一个通用的hasnext(),或者next()方法进行调用,所以并没有将迭代器定义为一个类。而无论是那种集合,都是需要具备集合的元素获取和遍历操作的,并且最好辅助判断功能。也就是说集合的获取和判断是每个集合类都需要的,但是各个类又有自己的不同的实现方式,所以将Iterator定义成了一个接口。事实上,Collection并不是最终的根节点,它还继承了一个超级接口Iterable。而Iterator中的具体实现则是在各个Collection的实现类中以一种内部类的方式进行实现的。

public interface Interable{       Iterator iterator();      }public interface Interator{       public boolean hasNext();       public Object next();}public interface Collection extends Iterable{       Iterator iterator();  }public interface List extends Collection{       Iterator iterator();  }public class ArrayList implements List{       public Iterator iterator(){             return new Itr();       }       private class Itr implements Iterator
{ int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount; // prevent creating a synthetic constructor Itr() {} public boolean hasNext() { return cursor != size; } @SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } }}

常用方法:

public void demo1()    {        Collection c = new ArrayList();        c.add("Hello");        c.add("World");        c.add("!");        Iterator it = c.iterator();  //多态        while(it.hasNext())        {            System.out.println(it.next());        }    }

 使用for循环改写,可以方便迭代器在for循环后销毁。

public void demo1()    {        Collection c = new ArrayList();        c.add("Hello");        c.add("World");        c.add("!");//        Iterator it = c.iterator();//        while(it.hasNext())//        {//            System.out.println(it.next());//        }        for(Iterator it=c.iterator();it.hasNext();)        {            System.out.println(it.next());        }    }

 

转载地址:https://www.cnblogs.com/hyserendipity/p/7753979.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java 集合-集合介绍
下一篇:Java-Java面向对象程序设计

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月22日 22时11分15秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Android App退出失败导致黑屏的问题或是再按返回键的时候导致又回到App! 2019-04-28
Android平台签名证书(.keystore)生成指南 2019-04-28
Java复习之详细分析ArrayList和LinkedList的区别(实践篇) 2019-04-28
Android 平台如何缩减安装包体积?apk瘦身 2019-04-28
1024,程序员节日快乐 2019-04-28
android studio升级4.1后Plugin “GsonFormat“ is incompatible (supported only in IntelliJ IDEA). 2019-04-28
Could not install Gradle distribution from ‘https://services.gradle.org/distributions 2019-04-28
adb: CreateFileW ‘nul‘ failed: 系统找不到指定的文件,* daemon not running; starting now at tcp:5037 2019-04-28
Glide加载云端图片地址在浏览器中可以显示在app中却不可以显示的问题 2019-04-28
android studio 新建项目 是否勾选 use legacy android.support libraries! 2019-04-28
android drawable种的shape圆角设置没有效果! 2019-04-28
2021牛年 继续努力 2019-04-28
android如何从json字符串中取自己想要的数据 2019-04-28
Android项目中找不到BuildConfig.DEBUG发生了什么? 2019-04-28
Android exposed beyond app through Intent.getData() 2019-04-28
android mp4视频下载测试地址亲测有效 2019-04-28
Android Only the original thread that created a view hierarchy can touch its views 2019-04-28
Android 通过连续点击屏幕事件实现暗门操作 2019-04-28
Android Rxjava+Okhttp+Retrofit实现单文件下载功能 2019-04-28
Java中Volatile关键字解决Android中的线程BUG! 2019-04-28