当前位置: 首页 > news >正文

CUMT--Java复习--泛型与集合

目录

一、泛型

1、概述

2、通配符 

3、有界类型

二、集合

1、概述

2、迭代器接口

三、集合类

1、Collection接口

2、List接口

3、Set接口

4、Queue接口

5、Map接口 

四、集合转换 

五、集合工具类


一、泛型

1、概述

        从JDK5.0开始,Java引入泛型类型,将数据类型实现参数化,提高代码了重用性,使得程序更加灵活、安全和简洁。

        泛型可以被使用于类、接口、方法的定义中,实现泛型类、泛型接口、泛型方法。

        泛型类的一般定义方法,以及实现实例化对象,可以参考C++的泛型使用方法。

        下面给出一个实例:

//创建泛型类
public class Generic <T>{private T data;public Generic(T data){this.data=data;}public void show(){System.out.println("数据类型为:"+data.getClass().getName());System.out.println("数据为:"+this.data);}
}
//主函数
public class Demo {public static void main(String[]args){Generic<String> s=new Generic<String>("张三");   //创建实例,实例化类型为StringGeneric<Integer> i=new Generic<Integer>(123);    //创建实例,实例化类型为Integers.show();i.show();}
}

输出:
        数据类型为:java.lang.String

        数据为:张三

        数据类型为:java.lang.Integer

        数据为:123

2、通配符 

        当使用一个泛型类时,应该为泛型类传入一个实参,否则会提出泛型警告,但如果在定义一个方法时,无法确定泛型实例化变量类型,那么需要使用通配符“?”来表示一个未知类型,从而解决不能动态选择实例的缺点。

        紧接着上一个实例,添加这样一个方法:

public static void showtype(Generic <?> g)
{g.show();
}

        主函数使用showtype(i)和showtpe(s)同样可以达到i.show(),s.show()的作用,这也是多态的另一种体现。

3、有界类型

        有界类型分为两种:extends,super,一般用来在泛型的尖括号<>中指代声明类型的上界和下界。

        在泛型类中使用:

public class Generic <T extends Math>    //指定T类型的上界为Math

public class Generic <T super String>       //指定T类型的下界为String

        在泛型方法中使用:

public class Generic <? extends Math>{         //指定T类型的上界为Math

              //方法体...

}   

public class Generic <? super String> {          //指定T类型的下界为String

              //方法体...

}

二、集合

1、概述

        Java中的集合类类似于C++中的STL,用于实现一些常见的数据结构。Java的集合类主要由两个接口派生出来:Collection和Map

        Collection集合体系下有三个接口,Set(无序,不可重复的集合)、List(有序、可以重复的集合)、Queue集合(队列集合)

        Map集合用于保存具有映射关系的数据,由Key-Value键值对组成,key用于标识集合中的每项数据,所以不可重复。

2、迭代器接口

        迭代器可以采用统一方式,对Collection集合中的元素进行遍历操作,由于Iterable接口是Collection接口的父接口,所以迭代器的集合类可迭代的,都支持foreach循环遍历。

        Iterator接口中的方法:

boolean hasNext()判断是否有下一个可访问的元素
E next()返回可访问的下一个元素

        迭代器接口实现:

import java.util.ArrayList;
import java.util.Iterator;
public class test {public static void main(String[] args){ArrayList<String>list=new ArrayList<>();list.add("apple");list.add("banana");list.add("pear");Iterator<String> iterator=list.iterator();    //通过泛型对象调用iterator()方法while(iterator.hasNext())                     //for each遍历{System.out.println(iterator.next());}}
}

三、集合类

1、Collection接口

        Collection接口作为Set、Queue、List接口的父接口,本身没有提供获取某个元素的方法,但可以通过iterator()方法来遍历集合中所有元素。

        对于产生的异常:不建议将同一个集合Collection中存储不同类型的对象,不要将不兼容的对象添加进集合中,另外在执行add、remove这类指令时也容易引发异常。

        一般来说在集合类的使用中不推荐使用Collection类。

2、List接口

        List是Collection接口的子接口,用于存放有序、可重复的集合。

        List接口的常用方法:

         在List接口中有两个实现类,ArrrayList(数组列表)和Vector(向量),完全继承List的所有方法。

        ArrayList和Vector的区别在于ArrayList是非线程安全的,而Vector是线程安全的,所以推荐使用ArrayList集合。

        ArrayList进行for-each遍历:

import java.util.ArrayList;
public class ArrayListDemo {public static void main(String[] args){ArrayList<String> list= new ArrayList<String>();list.add("北京");list.add("南京");list.add("上海");for(String e:list)                  //for each遍历{System.out.println(e);}list.remove("北京");                //删除元素北京       System.out.println("第一个元素为:"+list.get(0));    //获取第一个元素}
}

输出:

北京

南京

上海

第一个元素为:南京

        另外Vector提供了一个Stack子类,用于模拟“栈”,有三个方法:peek(查看栈顶元素),pop(出栈),push(入栈)。

Stack<String> s=new Stack<String>();
for(int i=0;i<=5;i++)s.push(String.valueOf(i));
System.out.println("Stack入栈元素:");
for(int i=0;i<s.size();i++)System.out.println(s.get(i));
System.out.println("Stack出栈元素:");
for(int i=0;i<=5;i++)System.out.println(s.pop());

输出: 

Stack入栈元素:

1

2

3

4

5

Stack出栈元素:

5

4

3

2

1

3、Set接口

        Set接口是一个不包含重复元素的集合,一般用于执行数学上的集合运算,如交集、并集,HashSet、TreeSet和EnumSet是Set接口的常见实现类。

        HashSet:使用Hash算法存储集合中的元素,具有良好的存取查找功能。

        TreeSet:采用Tree算法可以保证元素处于排序状态,TreeSet支持两种排序方式:自然排序和定制排序,默认情况采用自然排序。

        EnumSet:为枚举类设计的集合类,其所有元素必须为指定的枚举类型,EnumSet中元素是有序的,按照枚举值顺序进行排序。

        在TreeSet类进行排序时,会调用类内方法compareTo方法,所以我们可以通过重写默认排序时调用的compareTo方法,来实现排序的过程。

4、Queue接口

        Queue为队列结构,采用先进先出方式排序每个元素,在继承于Collection接口的基础上,也提供了相应的队列的插入、获取、查找操作。

        Queue接口有若干实现类:LinkedList(链表)、PriorityQueue(优先队列)、Deque(双向队列)。

(1)Queue

        Queue接口的方法:

       注意:Queue不能作为实例对象,不要创建Queue对象,只能创建Queue的子类对象。

Queue <String>q=new PriorityQueue<>();   //可以
Queue <String>q=new Queue<>();           //不可以

(2)Deque

        Deque是Queue的子接口,支持两端插入和移除元素。

        Deque接口的方法: 

(3)LinkedList

        LinkedList链表是Deque和List两个接口的实现类,兼具队列和列表两种特性,但LinkedList不是线程安全的,当出现多线程访问同一实例时,必须手动同步。

        对链表进行相应操作的代码:

import java.util.LinkedList;
public class linkedlistdemo {public static void main(String[] args){LinkedList<String> books=new LinkedList();books.offer("数据库");books.push("Java");books.offerFirst("C++");books.offerLast("操作系统");for(String i:books)                //遍历元素System.out.println(i);System.out.println("链表第一个元素:"+books.peekFirst());   System.out.println("链表最后一个元素:"+books.peekLast());System.out.println("链表弹出栈顶元素:"+books.pop());System.out.println("链表弹出栈底元素:"+books.pollLast());System.out.println("链表第二个元素:"+books.get(1));}
}

 (4)ArrayDeque

        ArrayDeque(数组双端队列),是Deque实现类,不继承于List,所以不能用add、remove进行添加、删除,但上面的链表在作为List子类情况下,还是改写了add和remove方法,使用offerfirst、pollfirst这一类栈相关的方法,其实更好理解一些。

        ArrayDeque没有容量限制,不是线程安全的,禁止添加null元素,在作为堆栈时快于Stack,作为队列时快于LinkedList。

        ArrayDeque的入队、出队、选择可以参考链表的操作,都是依赖于Deque的父类方法。

(5)PriorityQueue

        PriorityQueue是Queue接口的实现类,优先级队列,可以按照自然排序、或者定制排序(就是修改compareTo),优先级队列不允许使用null元素,在自然顺序下也不允许插入不可比较对象,定制排序可以改compareTo的。

        PriorityQueue要使用Queue接口内的方法,所以注意使用poll弹出,offer入栈。

import java.util.PriorityQueue;
import java.util.Queue;public class QueueDemo {public static void main(String[] args){Queue <String>q=new PriorityQueue<>();q.offer("张三");q.offer("李四");q.offer("王五");System.out.println("队列第一个元素,并移除"+q.poll());for(String i:q)System.out.println(i);} 
}

5、Map接口 

        Map接口作为与Collection并列的一个接口,使用key-value键值对映射关系进行存储。

        Map常用方法:

        Map类有两个实现类,分别为HashMap和TreeMap,类似HashSet和TreeSet的区别,HashMap是无序的映射集合,允许使用null作为键或值,TreeMap可以进行自然排序或定制排序。

四、集合转换 

        集合转换方法:

(1)entrySet():返回一个包含了Map中元素的集合,每个元素都包括键和值

(2)keySet():返回Map中所有键的集合

(3)values():返回Map中所有值的集合 (注意不是valueSet)

HashMap<Integer,String>hm=new HashMap();        //创建哈希集合
/*省略若干增删操作
*/
Set<Entry<Integer,String>>set=hm.entrySet();    //返回键值对
set<Integer>keyset=hm.keySet();                 //返回键
set<String>=hm.values();                        //返回值

五、集合工具类

        集合工具类(辅助工具类)有两个:Collections和Arrays。

        Collections提供对集合的常用静态方法,而Arrays工具类提供对数组的常用静态方法。

        Collections工具类方法:

        Arrays工具类方法:

参考书籍:《Java 8 基础应用与开发》QST青软实训编 

相关文章:

CUMT--Java复习--泛型与集合

目录 一、泛型 1、概述 2、通配符 3、有界类型 二、集合 1、概述 2、迭代器接口 三、集合类 1、Collection接口 2、List接口 3、Set接口 4、Queue接口 5、Map接口 四、集合转换 五、集合工具类 一、泛型 1、概述 从JDK5.0开始&#xff0c;Java引入泛型类型&…...

Android 权限申请

在Android中&#xff0c;从Android 6.0&#xff08;API级别23&#xff09;开始&#xff0c;应用在运行时需要动态申请权限。以下是一些步骤来动态申请权限&#xff1a; 在应用的清单文件&#xff08;AndroidManifest.xml&#xff09;中声明需要的权限。例如&#xff0c;如果应…...

R语言【base】——invisible将控制台的输出模式调整为隐藏,只允许赋值后输出,返回对象的(临时)不可见副本

Package base version 4.3.2 invisible(x NULL) 参数【x】&#xff1a;一个任意的 R 对象&#xff0c;默认为 NULL。 如果希望函数返回的值可以赋值&#xff0c;但在未赋值时不打印&#xff0c;则可以使用该函数。 f <- function(x){if (x){return (x)} else {return (in…...

LA@线性代数学习总结@主要对象和问题@思想方法

文章目录 线性代数研究对象主要问题联系核心概念核心定理 核心操作和运算基础高级小结 性质和推导方法问题转换为线性方程组求解问题验证和推导性质定理 线性代数研究对象 线性代数的研究对象主要是行列式和矩阵(向量)矩阵这种对象可以做的操作和运算很多,特别是方阵,它们的计…...

VMware克隆虚拟机

要求&#xff1a;利用模板虚拟机hadoop100&#xff0c;克隆出hadoop101虚拟机。 1、鼠标右键点击已存在的模板虚拟机hadoop100 --> 管理 --> 克隆 2、选择克隆自虚拟机中的当前状态 3、创建完整克隆 4、修改虚拟机名称、位置 5、等待克隆完成后&#xff0c;则成功克隆出…...

C语言中常见的关键字

一、数据类型关键字&#xff08;20个&#xff09; 基本数据类型&#xff08;5个&#xff09; void&#xff1a;声明函数无返回值或无参数&#xff0c;声明无类型指针&#xff0c;显式丢弃运算结果 char&#xff1a;字符型类型数据&#xff0c;属于整型数据的一种 int&#xff…...

新型智慧视频监控系统:基于TSINGSEE青犀边缘计算AI视频识别技术的应用

边缘计算AI智能识别技术在视频监控领域的应用有很多。这项技术结合了边缘计算和人工智能技术&#xff0c;通过在摄像头或网关设备上运行AI算法&#xff0c;可以在现场实时处理和分析视频数据&#xff0c;从而实现智能识别和分析。目前来说&#xff0c;边缘计算AI视频智能技术可…...

智能优化算法应用:基于梯度算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于梯度算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于梯度算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.梯度算法4.实验参数设定5.算法结果6.参考文献7.MA…...

如何使用Docker搭建青龙面板并结合内网穿透工具发布至公网可访问

文章目录 一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用。本教程使用Docker部署青龙&#xff0c;如何安装Docker详见&#xff1a; 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 正文…...

fastjson1.2.24 反序列化漏洞(CVE-2017-18349)分析

FastJson在< 1.2.24 版本中存在反序列化漏洞&#xff0c;主要原因FastJson支持的两个特性&#xff1a; fastjson反序列化时&#xff0c;JSON字符串中的type字段&#xff0c;用来表明指定反序列化的目标恶意对象类。fastjson反序列化时&#xff0c;字符串时会自动调用恶意对…...

Linux中history使用(过滤,显示时间,查找)

显示历史命令 history 显示最后几条执行命令 history 5 显示history记录中命令执行时间 export HISTTIMEFORMAT"%F %T " 显示命令中有某些内容的最后几条执行命令 history | grep key | tail -n 2...

issue阶段的选择电路的实现

1-of-M的仲裁电路 为什么要实现oldest-first 功能的仲裁呢&#xff1f; 这是考虑到越是旧的指令&#xff0c;和它存在相关性的指令也就越多&#xff0c;因此优先执行最旧的指令&#xff0c;则可以唤醒更多的指令&#xff0c;能够有效地提高处理器执行指令的并行度,而且最旧的指…...

BearPi Std 板从入门到放弃 - 后天篇(3)(ESP8266透传点灯)

简介 电脑搭建一个TCP Server&#xff0c; ESP8266 串口设置好透传模式, 再由TCP Server发送指令控制灯的亮灭; 开灯指令&#xff1a; led_on回车 &#xff1b; 关灯指令: led_off回车 主芯片: STM32L431RCT6 LED : PC13 \ 推挽输出即可 \ 高电平点亮 串口: Usart1 / LPUART E…...

【Linux】macOS下使用scp命令编写脚本上传文件至服务器

使用时需要输入服务器密码 #!/bin/bash# 检查传递给脚本的参数数量 if [ "$#" -ne 2 ]; thenecho "Usage: $0 <本地文件路径> <服务器文件夹路径>"exit 1 fi# 接收命令行参数 local_file"$1" remote_path"$2"# 定义远程服…...

难以置信:WINDOWS11真的取消了助记符

助记符是个好东西&#xff0c;记住了非常的方便。这几天升级到WINDOWS11之后&#xff0c;发现助记符被全面取消&#xff01;真是难以置信&#xff01; 现在WIN11越来越象MAC&#xff0c;MAC好用吗&#xff1f;当然不好用。 其实WIN11完全可以开发两套界面&#xff0c;各取所需。…...

使用VSC从零开始Vue.js——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务3:数据可视化

使用Visual Studio Code&#xff08;VSC&#xff09;进行Vue开发非常方便&#xff0c;下面是一些基本步骤&#xff1a; 一、下载和安装Vue 官网下载地址Download | Node.js Vue.js是基于Node.js的&#xff0c;所以首先需要安装Node.js&#xff0c;官网下载地址&#xff1a;No…...

企业直聘招聘人才求职系统招聘会小程序系统源码

技术栈&#xff1a; 端 原生小程序开发 后端php7.2 数据库mysql5.6 主要功能&#xff1a; 企业入住 ,企业直聘 个人实名认证&#xff0c;人才求职 发布线上招聘会 企业招聘邀请 个人简历置顶 刷新 浏览足迹浏览 附近 招聘信息查看...

大型语言模型:SBERT — Sentence-BERT

slavahead 一、介绍 Transformer 在 NLP 方面取得了进化进步&#xff0c;这已经不是什么秘密了。基于转换器&#xff0c;许多其他机器学习模型已经发展起来。其中之一是BERT&#xff0c;它主要由几个堆叠的变压器编码器组成。除了用于情感分析或问答等一系列不同的问题外&#…...

高效编写软件测试报告的关键技巧

引言&#xff1a; 软件测试报告是测试团队与开发团队之间沟通的重要工具&#xff0c;它记录了测试过程中的发现、问题和建议。一个清晰、准确、高效的软件测试报告可以帮助开发团队更好地理解测试结果&#xff0c;并及时修复问题。本文将介绍一些高效编写软件测试报告的关键技巧…...

编写CI/CD自动化部署脚本

编写CI/CD自动化部署脚本 什么是CI/CD CI/CD 是现代软件开发过程中的关键实践&#xff0c;它包含两个缩写&#xff1a; CI&#xff0c;或者持续集成&#xff08;Continuous Integration&#xff09;CD&#xff0c;可以指持续交付&#xff08;Continuous Delivery&#xff09…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...