Java高级重点知识点-12-Collection、iterator迭代器、泛型

文章目录

  • Collection集合
  • Iterator迭代器
  • 泛型(难点)

Collection集合

集合是java中提供的一种容器,可以用来存储多个数据。

  1. 集合框架
  • 单列集合java.util.Collection
  • 双列集合java.util.Map

集合类继承体系图:
在这里插入图片描述
List集合的特点:有序可重复
Set集合的特点:无序不重复

  1. Collection功能(单列集合的父接口)
  • public boolean add(E e): 把给定的对象添加到当前集合中 。
  • public void clear() :清空集合中所有的元素。
  • public boolean remove(E e): 把给定的对象在当前集合中删除。
  • public boolean contains(E e): 判断当前集合中是否包含给定的对象。
  • public boolean isEmpty(): 判断当前集合是否为空。
  • public int size(): 返回集合中元素的个数。
  • public Object[] toArray(): 把集合中的元素,存储到数组中。

代码示例:

public static void main(String[] args) {
        Collection collection = new ArrayList();
        collection.add("hello");
        collection.add("world");
        collection.add("java");
        collection.add("i");
        System.out.println(collection.contains("world")); // true
        System.out.println(collection.isEmpty()); // false
        System.out.println(collection.size()); // 4
        Object[] array = collection.toArray();
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + ",");
        }
        System.out.println();
        collection.remove("world");
        System.out.println(collection.contains("world")); // false
        collection.clear();
        System.out.println(collection.isEmpty()); // true
    }

在这里插入图片描述
通过add() 方法向集合中添加了四个元素,因此集合的大小为4,调用contains() 方法判断集合中是否存在“world”字符串(在添加的时候添加了“world”字符串),调用 isEmpty() 方法判断集合是否为空(很显然集合中存在四个元素不为空),通过 toArray() 方法将集合元素存储到数组中进行遍历,通过 remove() 方法移除集合中的指定元素“world”,在判断是否存在“world”字符串(很显然为false),最后调用 clear() 方法清除集合中的元素,并且判断集合是否为空(集合中不存在任何元素了,集合为空)。

Iterator迭代器

  1. Iterator接口

Iterator主要用于迭代访问(即遍历)
迭代: 在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。

  • public E next():返回迭代的下一个元素。
  • public boolean hasNext():如果仍有元素可以迭代,则返回 true。
 public static void main(String[] args) {
        Collection collection = new ArrayList();
        collection.add("hello");
        collection.add("world");
        collection.add("java");
        collection.add("i");
        Iterator iterator = collection.iterator();
        while (iterator.hasNext()){
            Object next = iterator.next();
            System.out.println(next);
        }
    }

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

  1. 增强for

增强for语法规则:

for(元素的数据类型  变量 : Collection集合or数组){ 
  	
}

在遍历的过程中,不能对集合中的元素进行增删操作

   public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("hello");
        collection.add("world");
        collection.add("java");
        collection.add("i");
        for (String o : collection) {
            System.out.println(o);
        }
    }

在这里插入图片描述

泛型(难点)

集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。]

  • 泛型:可以在类或方法中预支地使用未知的类型。
  • 泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型。
  1. 定义和使用含有泛型的类

定义泛型:

public class Person <E> {}

使用格式: 创建对象的时候确定泛型

public class Person <E> {
    E name;
    E age;

    public E getName() {
        return name;
    }

    public void setName(E name) {
        this.name = name;
    }

    public E getAge() {
        return age;
    }

    public void setAge(E age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name=" + name +
                ", age=" + age +
                '}';
    }

    public static void main(String[] args) {
        Person<String> person = new Person();
        person.name = "张三";
        person.age = "18";
        System.out.println(person);
    }
}

这里我们在创建对象的时候就给定泛型String,其中我们的属性name,age也被定义泛型了,这里我们这样理解,当我们给定泛型的时候,该类就变成了如下代码中所定义的。

public class Person {
    String name;
    String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name=" + name +
                ", age=" + age +
                '}';
    }

    public static void main(String[] args) {
        Person person = new Person();
        person.name = "张三";
        person.age = "18";
        System.out.println(person);
    }
}
  1. 含有泛型的方法

定义格式:

修饰符 <代表泛型的变量> 返回值类型 方法名(参数){  }

使用格式: 调用方法时,确定泛型的类型

public class Generic {
    public <VIP> void test(VIP vip){
        System.out.println(vip.getClass());
    }
    public static void main(String[] args) {
        // 创建对象
        Generic mm = new Generic();
        // 演示看方法提示
        mm.test("aaa");
        mm.test(123);
        mm.test(12.45);
    }
}

在这里插入图片描述

  1. 含有泛型的接口

定义格式:

修饰符 interface接口名<代表泛型的变量> {  }

定义一个接口

public interface MyInterface<E>{
    public abstract void add(E e);
}
  • 定义类时确定泛型的类型
public class Generic implements MyInterface<String>{

    @Override
    public void add(String s) {
        
    }
}
  • 始终不确定泛型的类型,直到创建对象时,确定泛型的类型
public class Generic<E> implements MyInterface<E>{
    @Override
    public void add(E e) {
        System.out.println(e);
    }

    public static void main(String[] args) {
        Generic<String> stringGeneric = new Generic<>();

        stringGeneric.add("123");
    }
}
  1. 泛型通配符

通配符基本使用:

public static void main(String[] args) {
    Collection<Integer> list1 = new ArrayList<Integer>();
    getElement(list1);
    Collection<String> list2 = new ArrayList<String>();
    getElement(list2);
}
public static void getElement(Collection<?> coll){}
//?代表可以接收任意类型

通配符高级使用----受限泛型

  • 泛型的上限

格式类型名称 <? extends 类 > 对象名称
意义只能接收该类型及其子类

  • 泛型的下限:

格式类型名称 <? super 类 > 对象名称
意义只能接收该类型及其父类型

代码示例:

public static void main(String[] args) {
    Collection<Integer> list1 = new ArrayList<Integer>();
    Collection<String> list2 = new ArrayList<String>();
    Collection<Number> list3 = new ArrayList<Number>();
    Collection<Object> list4 = new ArrayList<Object>();
    
    getElement1(list1);
    getElement1(list2);//报错
    getElement1(list3);
    getElement1(list4);//报错
  
    getElement2(list1);//报错
    getElement2(list2);//报错
    getElement2(list3);
    getElement2(list4);
}
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}

欢迎java热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/742845.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【大数据】大数据的核心特征与挑战:Volume、Velocity、Variety、Veracity

目录 Volume&#xff1a;海量数据的挑战与机遇 挑战 技术挑战 机遇 Velocity&#xff1a;数据处理的速度与实时性 挑战 技术挑战 机遇 Variety&#xff1a;数据类型的多样性与复杂性 挑战 技术挑战 机遇 Veracity&#xff1a;数据的真实性与质量控制 挑战 技术挑…

【Chapter7】虚拟存储系统,计算机操作系统教程,第四版,左万利,王英

文章目录 [toc]零、前言一、外存资源管理1.1 外存空间划分1.2 外存空间分配1.2.1 空闲块链(慢)1.2.2 空闲块表(UNIX)1.2.3 字位映像图 1.3 进程与外存对应关系 二、虚拟页式存储系统2.1 基本原理2.2 内存页框分配策略2.3 外存块的分配策略2.4 页面调入时机2.5 置换算法2.5.1 最…

Oracle详情数据库索引事务视图触发器分区发生死锁数据字典【Oracle】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

乐鑫ESP32-WROOM-32E模组设备低功耗控制方案,启明云端乐鑫代理商

在数字化浪潮的推动下&#xff0c;物联网&#xff08;IoT&#xff09;正迅速成为我们日常生活的一部分。而在这个领域中&#xff0c;ESP32-WROOM-32E模组以其卓越的性能和多功能性&#xff0c;成为了开发者和制造商的选择。 ESP32-WROOM-32E模组集成了ESP32-D0WD-V3芯片&#…

宝塔面板部署前端项目

部署前端项目 1 打包自己的项目2 登录宝塔面板3 添加站点4 设置域名5 进入当前站点对应的文件目录中6 上传打包后的文件7 访问网站 1 打包自己的项目 2 登录宝塔面板 点击左侧“网站”菜单进入对应页面 点击“添加站点” 3 添加站点 填写域名&#xff0c;如果没有域名的&am…

重生奇迹MU 谁才是真正的全能职业

重生奇迹MU中&#xff0c;游戏的奥妙就在于职业的选择。不同职业间各有千秋&#xff0c;可远可近&#xff0c;全都是玩家们心中的全能职业。本文就将为你分析重生奇迹MU中的各个职业&#xff0c;为你解答谁才是真正的全能职业。 每次新开一个服务器时&#xff0c;玩家们总会纠结…

为什么不推荐在自动化测试中使用单例模式

简述 尽管在国内大量的代码中使用单例这种简单的方式&#xff0c;但在自动化测试过程中会导致很多问题。因此&#xff0c;在自动化测试中&#xff0c;不推荐使用单例模式。 什么是单例&#xff1f; 《设计模式&#xff1a;可复用面向对象软件的基础》一书&#xff08;通常被称为…

2024地理信息相关专业大学排名

在开始之前&#xff0c;不得不提一下今年福耀科技大学不能招生的遗憾&#xff0c;不知道明年是否能一切准备就绪开始招生呢&#xff1f; 如果这所大学能招生了&#xff0c;不知道它有没有地理信息相关专业呢&#xff1f; 言归正转&#xff0c;我们现在就基于公开资料&#xf…

vue:响应式原理解析,深入理解vue的响应式系统

一、文章秒读 vue的响应式系统核心有两个&#xff0c;简单描述就是&#xff1a; 1.在数据变化时重新render依赖相关函数&#xff08;组件&#xff09;。 2.在vue2和vue3中分别使用Object.defineProperty和Proxy进行对象属性的读写。 数据变化时&#xff1a; 二、什么是响应…

解决宝塔linux面板 - 404 Not Found(Nginx)方法

宝塔Linux面板后台登录提示404 Not Found Nginx如何解决&#xff1f;码笔记&#xff1a;这是因为BT面板丢失了安全登录入口&#xff0c;如下图&#xff1a; 宝塔404 Not Found nginx 解决方法&#xff1a; 1、先SSH远程服务器 2、然后执行命令 bt 14 重新获取宝塔面板URL地址安…

Linux安装frp实现内网穿透

Linux运维工具-ywtool 目录 一. 简介二.代理类型三.frp支持的Linux的架构四.安装1.准备工作2.配置frp服务器端(a)下载安装包(b)解压安装包(c)修改配置文件(d)启动服务端 3.配置frp客户端(a)下载安装包并修改配置文件(b)启动客户端 4.测试连接 五.其他1.多端口穿透(a)服务端(b)客…

wireshark工具获取设备IP地址

背景&#xff1a; 一个网口抓包工具&#xff0c;主要是升级XX设备时候不知道网口的ip地址。每次需要一个一个试&#xff0c;比较麻烦。 使用步骤&#xff1a; 1、连接好XX设备与笔记本&#xff0c;在网络连接里面找到以太网&#xff0c;没有出现红色X号&#xff0c;表示网线连…

【道合顺展会预告】2024国际传感器仪器仪表物联网长沙展览会!

传感器技术作为万物互联的基石&#xff0c;正以前所未有的速度驱动着全球各行各业的转型升级。在此背景下&#xff0c;2024国际传感器&仪器仪表&物联网展览会将于6月28日至30日在长沙盛大启幕&#xff0c;道合顺传感将携公司最新技术及科研成果参加展览会&#xff0c;并…

数据库自动备份到gitee上,实现数据自动化备份

本人有个不太好的习惯&#xff0c;每次项目的数据库都是在线上创建&#xff0c;Navicat 连接线上数据库进行处理&#xff0c;最近有一个项目需要二次升级&#xff0c;发现老项目部署的服务器到期了&#xff0c;完蛋&#xff0c;数据库咩了&#xff01;&#xff01;&#xff01;…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(一)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

在Qt中,直接include <moc_xxxxx.cpp> 为什么不会出现符号冲突的错误?

在逛Qt官方社区的时候看到这样一个帖子&#xff1a; https://forum.qt.io/topic/117973/how-does-include-moc_-cpp-work 大概的意思是moc_xxx.cpp如果已经被编译器编译&#xff0c;那么在另一个cpp文件中include同一个moc_xxx.cpp应该出现符号冲突才对&#xff0c;但是Qt却能正…

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念&#xff0c;将逐步规范化一个例子&#xff0c;逐级说明每个范式的要求和变换过程。 示例&#xff1a;学生课程登记系统 初始…

提效优化:企业IT人员视角下的SD-WAN经验分享

我是公司IT支持人员&#xff0c;主要职责是确保公司的网络系统运行顺畅&#xff0c;让同事们能够顺利地完成他们的工作。随着公司业务的扩展和远程办公的普及&#xff0c;我工作中面临的挑战也日益严峻。 永无止境的问题流是我们IT人员日常工作中最为常见的现象。从“网络怎么这…

Spring Boot启动报错Lombok supports: sun/apple javac 1.6, ECJ

版本 idea 2023.3.4 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.32</version></dependency> 解决方式 File->Settings->Build, Execution, Deployment->Com…

录音转文字app哪个最好?5款实用的录音转文字软件下载

随着录音记录的普及&#xff0c;录音转文字功能已成为日常工作和学习中不可或缺的助手。 无论是会议记录、课堂笔记还是采访录音&#xff0c;这项技术都能快速、准确地将语音内容转换为文字。面对市场上众多的转文字软件&#xff0c;你知道录音转文字app哪个最好吗&#xff1f…