Java集合浅学(三)单列集合Collection常用方法详解,不容错过!

YunDuanCode · · 517 次点击 · · 开始浏览    

在上篇文章中,我们简单介绍了下Java 集合家族中的成员,那么本篇文章,我们就来看看 Java在单列集合中,为我们提供的一些方法,以及单列集合的常用遍历玩法,一起来进入学习吧。 在Java基础中我们也学过,在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑。 ### 一、Collection 常用功能 Collection 是所有单列集合的父接口,因此在Collection 中定义了单列集合(List 和 Set)通用的一些方法,这些方法可用于操作所有的单列集合。 ![image.png](https://static.golangjob.cn/231101/b2d7396e92cd372b4dfc6c5ab75b91c3.png) #### 1.1 方法如下: ![image.png](https://static.golangjob.cn/231101/fb289896c6c6ff095bf7ef632ff1951f.png) 打开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 接口 在程序开发中,经常需要遍历集合中的所有元素,就是要看看里面所有的元素,那我们怎么办呢? ![image.png](https://static.golangjob.cn/231101/d5a5d318b745152b46d9a4570e60e0e8.png) 针对这种需求,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()方法将元素取出,否则说明已经到达集合末尾,停止遍历元素。 >编程学习,从云端源想开始,课程视频、在线书籍、在线编程、一对一咨询……你想要的全部学习资源这里都有,重点是统统免费![点这里即可查看](https://www.ydcode.cn/?sourceId=139) Itearator 迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了让初学者能更好的理解迭代器的工作原理,接下来通过一个图例来演示 Iterator 对象迭代元素的过程: ![image.png](https://static.golangjob.cn/231101/b0c5b6f3bc788dad7c4d132664065466.png) 在获取迭代器的实现类对象是,会把索引指向集合的-1位置,也就是在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素。 - 当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回, - 当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回, - 依次类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。 ### 三、查询集合中的元素-增强for #### 3.1 概念 增强for循环(也称为 for each 循环)是JDK5以后出来的一个高级for循环,专门用来遍历数组和集合的。 通过api文档,Collection 继承了一个Iterable 接口 ,而实现这个接口允许对象成为 “foreach” 语句目标,也就是所有的单列集合都可以使用增强for。 ![image.png](https://static.golangjob.cn/231101/8a1ce87d8f510d3ad8ea20d4e816cd41.png) 它的内部原理其实是个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,本文就到这里了。

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

517 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传