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

news2024/11/15 19:26:51

文章目录

  • 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热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏。。。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

199.罗马数字转整数(力扣)

代码解决 class Solution { public:// 定义一个哈希表来存储罗马数字符号及其对应的整数值unordered_map<char, int> res {{I, 1},{V, 5},{X, 10},{L, 50},{C, 100},{D, 500},{M, 1000},};// 将罗马数字字符串转换为整数的函数int romanToInt(string s) {int num 0; …

iPhone怎么恢复删除的数据?几款顶级iPhone数据恢复软件

从iOS设备恢复数据。 对于任何数据恢复软件来说&#xff0c;从iOS设备恢复数据都是一项复杂的任务&#xff0c;因为Apple已将众多数据保护技术集成到现代iPhone和iPad中。其中包括硬件加密和文件级加密。iOS 上已删除的数据只能通过取证文件工件搜索来找到&#xff0c;例如分析…

在 ClickHouse 中使用 Rust 实现超过 2 倍速度提升的哈希

本文字数&#xff1a;2544&#xff1b;估计阅读时间&#xff1a;7 分钟 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 Meetup活动 ClickHouse 上海首届 Meetup 讲师招募中&#xff0c;欢迎讲师在文末扫码报名&#xff01; 介绍 目前…

Elasticsearch:使用 semantic_text 简化语义搜索

作者&#xff1a;来自 Elastic Carlos Delgado, Mike Pellegrini semantic_text - 你知道&#xff0c;用于语义搜索&#xff01; 你是否想开始使用语义搜索来搜索数据&#xff0c;但专注于模型和结果而不是技术细节&#xff1f;我们引入了 semantic_text 字段类型&#xff0c;…

Python-爬虫 下载天涯论坛帖子

为了爬取的高效性&#xff0c;实现的过程中我利用了python的threading模块&#xff0c;下面是threads.py模块&#xff0c;定义了下载解析页面的线程&#xff0c;下载图片的线程以及线程池 import threading import urllib2 import Queue import re thread_lock threading.RL…

上电相位确定性:使用多芯片同步

将多个数字信号处理 (DSP) 块、宽带数模转换器 (DAC) 和宽带模数转换器 (ADC) 集成到单个单片芯片中&#xff0c;现在可以卸载耗电的 FPGA 资源&#xff0c;以允许更小的占地面积、更低的功耗、增加通道数的平台&#xff0c;能够以比以前更高的速率进行采样。伴随这一新功能而来…

【大数据开发语言Scala的入门教程】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

井盖位移传感器:给井盖装上“大脑”

你是否曾经在深夜回家时&#xff0c;因为路上一个不起眼的井盖而心惊胆战&#xff1f;或者因为某个井盖缺失&#xff0c;导致车辆受损、行人受伤&#xff1f;这些看似微小的问题&#xff0c;其实都隐藏着巨大的安全隐患。 旭华智能针对这一问题&#xff0c;研制了井盖位移传感器…

多种驱鸟设备,在电力安全中各显神通

多种驱鸟设备&#xff0c;在电力安全中各显神通 鸟类对电力的危险是一个不容忽视的问题&#xff0c;尤其是在电力设施密集的区域。随着人类对自然环境的不断开发和利用&#xff0c;鸟类与电力设施之间的接触也日益频繁&#xff0c;由此引发的安全隐患和事故也屡见不鲜。 具体…

【详细教程】如何使用YOLOv10进行图片与视频的目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

基于SaaS平台的iHRM管理系统测试学习

目录 1、登录模块 2、员工管理模块 3、Postmannewman软件的安装&#xff0c;学习 1、Postman的使用 2、Postman断言 1、断言状态码&#xff08;重要&#xff09; 2、断言包含某个字符串&#xff08;contains string&#xff09; 3、断言等于某个字符串(equal string) …

【多通道卷积终结篇,通俗易懂,清晰必读】

作为常识&#xff0c; 1、卷积层 输出特征图通道数 卷积核个数 与输入特征图通道数无关&#xff0c; 2、多卷积核处理多通道特征图的机制过程如下&#xff1a; 本文的参考资料为知乎&#xff1a;一文读懂Faster RCNN。 对于多通道图像多卷积核做卷积&#xff0c;计算方式如…

中兴光猫破解telnet配置命令汇总

中兴光猫telnet配置命令汇总 | LogDicthttps://www.logdict.com/archives/zhong-xing-guang-mao-telnetpei-zhi-ming-ling-hui-zong

Pikachu靶场--SSRF

参考借鉴&#xff1a;pikachu靶场练习——SSRF详解_pikachu ssrf-CSDN博客 SSRF(curl) 先了解一下curl curl是一个非常实用的、用来与服务器之间传输数据的工具&#xff1b;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, PO…

【技术指南】稳压器(电压调节器):原理、类型及其实际用用案例

电压调节器&#xff08;稳压器&#xff09;是一种电子器件或电路&#xff0c;用于控制电路中的电压水平&#xff0c;以确保在电源电压波动或负载变化时&#xff0c;输出电压能够保持在设定的稳定水平。它们通常用于各种电子设备和电源系统中&#xff0c;以提供稳定的电压供应。…

AMEYA360代理品牌江苏润石:RS8661/2/4系列高压精密低噪声运算放大器

继RS8651/2/4系列高压精密低噪声运算放大器成功推向市场&#xff0c;润石科技再次成功量产RS8661/2/4系列高压精密低噪声运算放大器。 RS8661/2/4系列产品将工作电压提升到最高36V(18V)、失调电压进一步优化到5μV、在工业现场数据采集、各种仪器仪表测量设备\分析设备上有着广…

QT中的样式表.qss文件

一、前言 qt中样式表的改变有几种方法&#xff0c;第一种就是直接在ui界面对应的组件右键修改样式表&#xff0c;还有一种就是直接在程序里面修改样式表&#xff0c;我知道的还有一种就是qss文件&#xff0c;这个文件就是将在程序中写的修改样式表的语句写道qss文件中&#xff…

ROS CDK魔法书:点亮博客上云新技能(Python篇)

引言 在数字世界的浩瀚海洋中&#xff0c;信息与数据如同戏剧中的主角&#xff0c;舞动着无形的旋律&#xff0c;构建起信息时代的交响乐。而在这其中&#xff0c;作为一位技术领域的探索者&#xff0c;你的使命便是挥舞着编码的魔杖&#xff0c;创造和守护着这些宝贵的数字灵…

游戏AI的创造思路-技术基础-深度学习(1)

他来了&#xff0c;他来啦&#xff0c;后面歌词忘了~~~~~ 开谈深度学习&#xff0c;填上一点小坑&#xff0c;可又再次开掘大洞 -.-b 目录 1. 定义 2. 深度学习的发展历史和典型事件 3. 深度学习常用算法 3.1. 卷积神经网络&#xff08;CNN&#xff09; 3.1.1. 算法形成过…

前端必会--浏览器的工作原理与实践

进程与线程 线程 线程分为单线程和多线程 线程是不能单独存在的&#xff0c;它是由进程来启动和管理的。 进程 一个进程就是一个程序的运行实例。详细解释就是&#xff0c;启动一个程序的时候&#xff0c;操作系统会为该程序创建一块内存&#xff0c;用来存放代码、运行中的…