【详解Collection接口、迭代器和Colletions工具类】

news/2025/3/20 6:38:20/

🌠作者:@TheMythWS.

🎆专栏:《集合与数据结构》

🎇座右铭:不走心的努力都是在敷衍自己,让自己所做的选择,熠熠发光。 

目录

👀Collection接口的常用方法 

💨Collection集合的遍历 

🔎迭代器简要原理

🧾面试题:iterator(),Iterator,Iterable关系 

👉【1】对应的关系: 

👉【2】hasNext(),next()的具体实现: 

👉【3】增强for循环  底层也是通过迭代器实现的: 

🔔ListIterator迭代器 

🔧Collections工具类 

✒练习1 

✒练习2


👀Collection接口的常用方法 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class Test01 {//这是一个main方法,是程序的入口:public static void main(String[] args) {/*Collection接口的常用方法:增加:add(E e) addAll(Collection<? extends E> c)删除:clear() remove(Object o)修改:查看:iterator() size()判断:contains(Object o) equals(Object o) isEmpty()*///创建对象:接口不能创建对象,利用实现类创建对象:Collection col = new ArrayList();//多态//调用方法://集合有一个特点:只能存放引用类型的数据,不能是基本数据类型//基本数据类型自动装箱,对应包装类。int--->Integercol.add(18);col.add(12);col.add(11);col.add(17);System.out.println(col/*.toString()*/);//将数组转化为ArrayList集合List list = Arrays.asList(new Integer[]{11, 15, 3, 7, 1});col.addAll(list);//将另一个集合添加进col中System.out.println(col);//col.clear();清空集合System.out.println(col);System.out.println("集合中元素的数量为:"+col.size());System.out.println("集合中是否为空:"+col.isEmpty());boolean isRemove = col.remove(15);System.out.println(col);System.out.println("集合中数据是否被删除:"+isRemove);Collection col2 = new ArrayList();col2.add(18);col2.add(12);col2.add(11);col2.add(17);Collection col3 = new ArrayList();col3.add(18);col3.add(12);col3.add(11);col3.add(17);System.out.println(col2.equals(col3));System.out.println(col2==col3);//地址一定不相等 falseSystem.out.println("是否包含元素:"+col3.contains(117));}
}

💨Collection集合的遍历 

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Test02 {//这是一个main方法,是程序的入口:public static void main(String[] args) {Collection col = new ArrayList();//多态col.add(18);col.add(12);col.add(11);col.add(17);col.add("abc");col.add(9.8);//对集合遍历(对集合中的元素进行查看)//方式1:普通for循环(X)/*  for (int i = 0; i < col.size(); i++) {col.}*///方式2:增强for循环//为什么用Object的类型来接受数据,因为col里面可以放入的数据就是Object,如果用Integer来接受,向下转型不安全for(Object o:col){System.out.println(o);}System.out.println("--------------------------");//方式3:iterator()Iterator it = col.iterator();while(it.hasNext()){System.out.println(it.next());}}
}

🔎迭代器简要原理

🧾面试题:iterator(),Iterator,Iterable关系 

👉【1】对应的关系: 

👉【2】hasNext(),next()的具体实现: 

👉【3】增强for循环  底层也是通过迭代器实现的: 

🔔ListIterator迭代器 

场景:用迭代器遍历的时候加入字符串:

import java.util.ArrayList;
import java.util.Iterator;
public class Test2 {//这是一个main方法,是程序的入口:public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("aa");list.add("bb");list.add("cc");list.add("dd");list.add("ee");//在"cc"之后添加一个字符串"kk"Iterator<String> it = list.iterator();while(it.hasNext()){if ("cc".equals(it.next())){list.add("kk");}}}
}

发现报错: 

出错原因:就是迭代器和list同时对集合进行操作: 

解决办法:事情让一个“人”做 --》引入新的迭代器:ListIterator
迭代和添加操作都是靠ListIterator来完成的:  

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class Test2 {//这是一个main方法,是程序的入口:public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("aa");list.add("bb");list.add("cc");list.add("dd");list.add("ee");//在"cc"之后添加一个字符串"kk"/*** 下面方法不可取 it 和 list 不能同时操作集合* 需要引入一个新的迭代器来解决这个问题*//*Iterator<String> it = list.iterator();while(it.hasNext()){if ("cc".equals(it.next())){list.add("kk");}}*//*** listIterator()来解决* 迭代和添加操作都是靠ListIterator来完成的*/ListIterator<String> it = list.listIterator();while(it.hasNext()){if ("cc".equals(it.next())){it.add("kk");}}System.out.println(it.hasNext());//判断下面是否还有元素 falseSystem.out.println(it.hasPrevious());//判断上面是否还有元素 true//逆向遍历:while(it.hasPrevious()){System.out.println(it.previous());}//逆向遍历之后指针就相当于移到上面去了,所以此时下面有元素,上面没有元素System.out.println(it.hasNext());//判断下面是否还有元素 trueSystem.out.println(it.hasPrevious());//判断上面是否还有元素 falseSystem.out.println(list);}
}

🔧Collections工具类 

✒练习1 

import java.util.ArrayList;
import java.util.Collections;
public class Test03 {//这是一个main方法,是程序的入口:public static void main(String[] args) {//Collections不支持创建对象,因为构造器私有化/*Collections cols = new Collections();*///里面的属性和方法都是被static修饰,我们可以直接类名.去调用即可:ArrayList<String> list = new ArrayList<>();list.add("cc");list.add("bb");list.add("aa");Collections.addAll(list,"ee","dd","ff");Collections.addAll(list,new String[]{"gg","oo","pp"});System.out.println(list.size());System.out.println(list);//binarySearch必须在有序的集合中查找:-->排序Collections.sort(list);//升序排列System.out.println(list);System.out.println(Collections.binarySearch(list, "cc"));//copy:替换方法ArrayList<String> list2 = new ArrayList<>();Collections.addAll(list2,"tt","ss","ws");Collections.copy(list,list2);//将list2的内容替换到list上去System.out.println(list);System.out.println(list2);//fill填充Collections.fill(list2,"yyy");System.out.println(list2);}
}

✒练习2

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/*Collections类的概述是针对集合操作的工具类Collections类的常用方法public static <T extends Comparable<? super T>> void sort​(List<T> list):将指定的列表按升序排序public static void reverse​(List<?> list):反转指定列表中元素的顺序public static void shuffle​(List<?> list):使用默认的随机源随机排列指定的列表*/
public class CollectionsDemo {public static void main(String[] args) {//创建集合对象List<Integer> list = new ArrayList<>();//添加元素list.add(30);list.add(20);list.add(50);list.add(10);list.add(40);//public static <T extends Comparable<? super T>> void sort​(List<T> list):将指定的列表按升序排序
//        Collections.sort(list);//public static void reverse​(List<?> list):反转指定列表中元素的顺序
//        Collections.reverse(list);//public static void shuffle​(List<?> list):使用默认的随机源随机排列指定的列表
//        Collections.shuffle(list);Collections.shuffle(list);System.out.println("随机打乱后:"+list);Collections.sort(list);System.out.println("升序后:"+list);Collections.reverse(list);System.out.println("反转后:"+list);}
}


http://www.ppmy.cn/news/103585.html

相关文章

ElasticSearch 报错集锦及解决方法

关联链接 1. Django 扩展 Elasticsearch - 启动与关闭 - 启动报错问题解决方法 2. Centos 7 安装Elasticsearch 6.2.4 - tar 包安装 - elasticsearch head&#xff08;浏览器插件&#xff09;和kibana 插件 tar 安装 1、报错 Error: Could not find or load main class org.e…

全渠道电子商务指南

希望将全渠道电子商务纳入您的业务战略&#xff0c;但不确定从哪里开始。这篇博文将指导您了解全渠道商务的基础知识&#xff0c;以及它与多渠道方法的区别。 全渠道电子商务旨在为线上和线下多个平台的客户创造全面的购物体验。客户可以通过各种接触点&#xff08;例如网站、…

GJB设计开发各阶段的文件和记录要求

阶段 NO 内容 论证立项阶段 输入 1 合同<

三维场景重建经典论文详解

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 论文标题&#xff1a; 《REAL-TIME INDOOR SCENE RECONSTRUCTION WITH RGBD AND INERTIA INPUT》 论文链接: https://arxiv.org/pdf/2008.00490.pdf https://github.com/CWanli/RecoNet 数据集&#xff1a;P…

两个iframe同时滚动实现界面内容对比功能

背景&#xff1a;因为要实现一个版本对比功能&#xff0c;所以要保证两个界面能同时滚动。&#xff08;本文只讲同时滚动&#xff0c;对比功能文本只讲思路&#xff0c;具体代码实现如有需要 可以联系我&#xff09;&#xff0c;因为过程中有部分收获特此记录。 本文参考&…

Hack The Box - appointment关卡

TASK 1 任务 1 What does the acronym SQL stand for? 首字母缩略词SQL代表什么&#xff1f; Structured Query LanguageTASK 2 任务 2 What is one of the most common type of SQL vulnerabilities? 最常见的 SQL 漏洞类型之一是什么&#xff1f; SQL Injection TASK …

人脸识别3:C/C++ InsightFace实现人脸识别Face Recognition(含源码)

人脸识别3&#xff1a;C/C InsightFace实现人脸识别Face Recognition(含源码) 目录 1. 前言 2. 项目安装 &#xff08;1&#xff09;项目结构 &#xff08;2&#xff09;配置开发环境(OpenCVOpenCLbase-utilsTNN) &#xff08;3&#xff09;部署TNN模型 &#xff08;4&a…

伺服系统使用S曲线

在之前文章《S形曲线规划方式汇总》 介绍过贝塞尔曲线方式&#xff0c;并且在Marlin开源工程中也有贝塞尔曲线步进系统的实现方式。本篇介绍伺服系统中基于时间分割法实现的贝塞尔S曲线。 1 贝塞尔曲线路程规划 上文中推导过贝塞尔曲线&#xff0c;本文直接用结论&#xff1a…