Java单列集合Collection常用方法示例详解

 更新时间:2023年11月01日 09:25:50   作者:云端源想  
这篇文章主要介绍了Java单列集合Collection常用方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

在上篇文章中,我们简单介绍了下Java集合家族中的成员,那么本篇文章,我们就来看看Java在单列集合中,为我们提供的一些方法,以及单列集合的常用遍历玩法,一起来进入学习吧。

在Java基础中我们也学过,在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑。

一、Collection常用功能

Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。

1.1方法如下:

打开api文档,我们可以看到Collection在java.util下,我们通过练习来演示下这些方法的使用:

1.2方法演示

public class Demo1Collection {    
        public static void main(String[] args) {
            //创建集合对象
            //使用多态的形式 定义
            Collection<String> person = new ArrayList<>();
            //输出不是一个对象地址,所以说重写了toString 方法
            System.out.println(person);
    //        boolean add(Object o)  向集合中添加一个元素
    //        返回值是一个boolean值,一般可以不用接收
            person.add("科比");
            person.add("姚明");
            person.add("库里");
            person.add("麦迪");
            //添加完我们在输出一下这个集合
            System.out.println(person);
    //        boolean remove(Object o)  删除该集合中指定的元素
    //        返回 集合中存在元素,删除元素,返回true;集合中不存在,删除返回false
            boolean res1 = person.remove("科比");
            boolean res2 = person.remove("奥尼尔");
            System.out.println("res1=" +res1);
            System.out.println("res2=" +res2);
    //        boolean isEmpty()  判断该集合是否为空
            boolean empty = person.isEmpty();
            System.out.println("empty=" + empty);
    //        boolean contains(Object o)  判断该集合中是否包含某个元素
            boolean contains = person.contains("麦迪");
            System.out.println("contains=" + contains);
    //        int size()  获取该集合元素个数
            int size = person.size();
            System.out.println("size = " + size);
    //        public Object[] toArray()  把集合总的元素,存储到数组中
            Object[] personArray = person.toArray();
            for (int i = 0; i < personArray.length; i++) {
                System.out.println("数组--" + personArray[i]);
            }
    //        void clear()  删除该集合中的所有元素,但是集合还存在
            person.clear();
            System.out.println(person);    
            //通过多态的方式,如果我们把arrayList 换成HashSet,发现也能使用,这就是我们实现接口的好处
        }
    }

注意:有关Collection中的方法不止上面这些,其他方法可以自行查看API学习。

二、查询集合中的元素-Iterator迭代器

2.1 Iterator接口

在程序开发中,经常需要遍历集合中的所有元素,就是要看看里面所有的元素,那我们怎么办呢?

针对这种需求,JDK专门提供了一个接口: java.util.Iterator。该接口也是Java集合中的一员,但它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因为Iterator对象也被称为迭代器。

迭代器的概念

迭代即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续再判断,如果还有就再取出来。一直把集合中的所有元素全部取出。这种方式专业术语称为迭代。

通过文档,我们可以看到Iterator是一个接口,我们无法直接使用,而需要使用Iterator接口的实现类对象,通过Collection接口中的Iterator()方法,就可以返回迭代器的实现类对象:public Iterator iterator():获取结合对应的迭代器,用来遍历集合中的元素。通过API文档,我们可以看到Collection中 Itrerator接口的常用方法如下:

public E next()返回迭代的下一个元素

public boolean hasNext()如果仍有元素可以迭代,则返回true。

接下来我们通过案例学习,如何使用Iterator迭代集合中的元素:

/**
   *  Iterator 迭代器使用
   */
  public class Demo1Iterator {    
      public static void main(String[] args) {            
          /**
           * 使用步骤:
           * 1. 使用集合中的方法 iterator() 获取迭代器的实现类对象,使用Iterator接口接收 (使用接口接收返回值,这就是我们说的多态)
           * 2. 使用Iterator接口中的方法 hashNext() 判断有没有下一个元素
           * 3. 使用Iterator接口中的方法 next() 取出集合中的下一个元素
           *
           */
          Collection<String> ball = new ArrayList<>();
          ball.add("篮球");
          ball.add("足球");
          ball.add("排球");
          ball.add("乒乓球");    
          //我们来获取一个迭代器,多态
          Iterator<String> iterator = ball.iterator();    
          //判断
          boolean b = iterator.hasNext();
          System.out.println("是否有元素--" + b);
          //取出
          String next = iterator.next();
          System.out.println("元素--" + next);    
          //判断
          boolean b1 = iterator.hasNext();
          System.out.println("是否有元素--" + b1);            
          //取出
          String next1 = iterator.next();
          System.out.println("元素--" + next1);    
          //判断
          boolean b2 = iterator.hasNext();
          System.out.println("是否有元素--" + b2);            
          //取出
          String next2 = iterator.next();
          System.out.println("元素--" + next2);    
          //判断
          boolean b3 = iterator.hasNext();
          System.out.println("是否有元素--" + b3);            
          //取出
          String next3 = iterator.next();
          System.out.println("元素--" + next3);    
          //判断
          boolean b4 = iterator.hasNext();
          System.out.println("是否有元素--" + b4);            
          //取出
  //        String next4 = iterator.next();
  //        System.out.println("元素--" + next4);
          //如果没有元素,在取的话,会报一个NoSuchElementException 的错误
          /**
           *
           * 代码优化 上面这些步骤是一个重复的过程,我们可以使用循环来优化,那我们选择哪种来呢
           * 我们说 知道元素个数,使用for
           * 不知道元素个数,使用while
           *
           * 那当前我们迭代器的个数,我们不知道,所以使用while循环,而我们的hasNext 就可以作为
           * while的条件来判断
           *
           */
          while (iterator.hasNext()) {
              String ballResult = iterator.next();
              System.out.println("--优化--" + ballResult);
          }
      }
  }

分析:在进行集合元素取出时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会发生java.util.NoSuchElementException没有集合元素的错误。

2.2迭代器的实现原理

我们在之前的案例中已经完成了Iterator遍历集合的整个过程。当遍历集合时,首先通过调用集合的iterator()方法获得迭代器对象,然后使用hasNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已经到达集合末尾,停止遍历元素。

Itearator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了让初学者能更好的理解迭代器的工作原理,接下来通过一个图例来演示Iterator对象迭代元素的过程:

在获取迭代器的实现类对象是,会把索引指向集合的-1位置,也就是在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素。当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,以此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。

三、查询集合中的元素-增强for

3.1概念

增强for循环(也称为for each循环)是JDK5以后出来的一个高级for循环,专门用来遍历数组和集合的。 通过api文档,Collection继承了一个Iterable接口,而实现这个接口允许对象成为“foreach”语句目标,也就是所有的单列集合都可以使用增强for。

它的内部原理其实是个Iterator迭代器,只是用for循环的方式来简化迭代器的写法,所以在遍历的过程中,不能对集合中的元素进行增删改查操作。

格式:

for (元素类型 元素名 : 集合名或数组) {
        访问元素
    }

它用于遍历Collection和数组。通常只进行遍历元素,不在遍历的过程中对集合元素进行增删操作。

3.2练习1:遍历数组

public class Demo2Foreach {    
        public static void main(String[] args) {    
            int[] array = {1,2,3,4,5};    
            for (int i : array) {
                System.out.println("--数组元素--" + i);    
                if (i == 2) {
                    i = 19;
                }
            }    
            //在增强for中修改 元素,并不能赋值
            System.out.println(Arrays.toString(array));
        }
    }

3.3练习2:遍历集合

public class Demo3Foreach {    
        public static void main(String[] args) {
            Collection<String> ball = new ArrayList<>();
            ball.add("篮球");
            ball.add("足球");
            ball.add("排球");    
            for (String s : ball) {
                System.out.println("---" + s);
            }    
            //相对于Iterator遍历方式,增强for 简化了很多,所以优先使用该方式。
        }
    }

新for循环必须有被遍历的目标。目标只能是Collection或者是数组。仅仅作为遍历操作出现。

总结

本篇中主要介绍了单列集合接口Collection为我们提供的常用接口,也通过代码的方式带大家体会了一下。在后面的内容中为大家介绍了如何把单列集合中的内容查看出来(遍历),通过讲解一些底层的原理,让大家感受了一下迭代器的使用。

当然集合的遍历不仅仅限于这两种方式,例如java8为我们提供的流式遍历集合,希望大家下去后自己也能搜搜相关的遍历方式,尝试使用一下,ok,本文就到这里了。

以上就是Java单列集合Collection常用方法示例详解的详细内容,更多关于Java单列集合Collection的资料请关注脚本之家其它相关文章!

相关文章

  • Druid如何平行替换为Hikari

    Druid如何平行替换为Hikari

    这篇文章主要介绍了Druid如何平行替换为Hikari问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • IDEA如何设置SVN提交忽略文件 target.iml

    IDEA如何设置SVN提交忽略文件 target.iml

    使用IDEA的SVN插件时,可能会遇到提交不必要文件的问题,解决这个问题有两种方法:第一种是在IDEA设置中的File Types下的Ignore files and folders添加需要忽略的文件或文件夹;第二种是使用SVN客户端TortoiseSVN,在项目目录点击右键选择properties
    2024-10-10
  • 解析JavaSe的抽象类和接口

    解析JavaSe的抽象类和接口

    这篇文章主要为大家详细介绍了JavaSe的抽象类和接口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 如何使用Guava Cache做缓存

    如何使用Guava Cache做缓存

    Cache在ConcurrentHashMap的基础上提供了自动加载数据、清除数据、get-if-absend-compute的功能,本文给大家介绍如何使用Guava Cache做缓存,感兴趣的朋友一起看看吧
    2023-11-11
  • 如何为 Spring Boot 项目配置 Logback 日志

    如何为 Spring Boot 项目配置 Logback 日志

    由于 Spring Boot 的默认日志框架选用的 Logback,再加上 Log4j2 之前爆过严重的漏洞,所以我们这次就只关注 Logback,本文重点给大家介绍如何为 Spring Boot 项目配置 Logback 日志,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • Java JVM虚拟机运行机制

    Java JVM虚拟机运行机制

    JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现。接下来通过本文给大家简单介绍Java JVM虚拟机运行机制,感兴趣的朋友一起看看吧
    2017-03-03
  • 线程池运用不当引发的一次线上事故解决记录分析

    线程池运用不当引发的一次线上事故解决记录分析

    遇到了一个比较典型的线上问题,刚好和线程池有关,另外涉及到死锁、jstack命令的使用、JDK不同线程池的适合场景等知识点,同时整个调查思路可以借鉴,特此记录和分享一下
    2024-01-01
  • MyBatis中一对多的xml配置方式(嵌套查询/嵌套结果)

    MyBatis中一对多的xml配置方式(嵌套查询/嵌套结果)

    这篇文章主要介绍了MyBatis中一对多的xml配置方式(嵌套查询/嵌套结果),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Spring实现资源的动态加载和卸载的方法小结

    Spring实现资源的动态加载和卸载的方法小结

    这篇文章主要介绍了Spring实现资源的动态加载和卸载的方法小结,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-06-06
  • springboot整合logback打印日志,分文件

    springboot整合logback打印日志,分文件

    本文主要介绍了springboot整合logback打印日志,分文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11

最新评论