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

news2024/12/23 9:10:36

目录

一、泛型

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>("张三");   //创建实例,实例化类型为String
        Generic<Integer> i=new Generic<Integer>(123);    //创建实例,实例化类型为Integer
        s.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青软实训编 

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

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

相关文章

ARM GIC(四) gicv3架构基础

GICv3架构是GICv2架构的升级版&#xff0c;增加了很多东西。变化在于以下&#xff1a; 使用属性层次&#xff08;affinity hierarchies&#xff09;&#xff0c;来对core进行标识&#xff0c;使gic支持更多的core 将cpu interface独立出来&#xff0c;用户可以将其设计在core…

谷歌Gemini造假始末

&#x1f4a1;大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 在过去一年中&#xff0c;OpenAI ChatGPT引发了一股AI新浪潮&#xff0c;而谷歌则一直处于被压制的状态&#xff0c;迫切需要一款现象级的AI产品来…

一文读懂Java中的设计模式——代理模式,以翻译场景举例,特别通俗易懂!

代理模式概念 在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。目的&#xff1a;为其他对象提供一种代…

HBase基础知识(二):HBase集群部署、HBaseShell操作

1. HBase安装部署 1.1 Zookeeper正常部署 首先保证Zookeeper集群的正常部署&#xff0c;并启动之&#xff1a; 创建集群启动脚本&#xff1a; #!/bin/bash case $1 in "start"){ for i in hadoop100 hadoop101 hadoop102 do echo----------zookeeper $i 启动----…

TKEStack容器管理平台实战之部署wordpress应用

TKEStack容器管理平台实战之部署wordpress应用 一、TKEStack介绍1.1 TKEStack简介1.2 TKEStack特点1.3 TKEStack架构图 二、kubernetes集群介绍2.1 k8s简介2.2 k8s架构图 三、本次实践介绍3.1 实践环境要求3.2 本次实践环境规划3.3 本次实践简介 四、安装容器管理平台4.1 安装T…

python基础-检测字符串是否含有中文的方法

1. 正则表达式 代码示例如下&#xff1a; import re def contains_chinese(text):pattern re.compile(r[\u4e00-\u9fff]) # 匹配中文字符的正则表达式范围return bool(pattern.search(text))2.unicodedata模块 import unicodedata def contains_chinese(text):for char in…

Codeforces Round 638 (Div. 2)B. Phoenix and Beauty(思维构造)

B. Phoenix and Beauty 这道题目学到的东西&#xff1a; 从给出的数据范围观察&#xff0c;得到一些有用信息&#xff08;峰哥教的&#xff09;考虑无解的情况‘ 其实这题考虑怎么操作是比较难的&#xff0c;如果能想出来满足条件的结果就比较好了&#xff08;我在说什么我自…

力扣题:高精度运算-1.1

力扣题-1.1 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;67. 二进制求和 解题思想&#xff1a;将数组进行遍历相加即可 class Solution(object):def addBinary(self, a, b):""":type a: str:type b: str:rtype: str""…

java开发面试:常见业务场景之单点登录SSO(JWT)、权限认证、上传数据的安全性的控制、项目中遇到的问题、日志采集(ELK)、快速定位系统的瓶颈

单点登录&#xff08;SSO&#xff09; 单点登录&#xff0c;Single Sign On&#xff08;简称SSO&#xff09;,只需要登录一次&#xff0c;就可以访问所有信任的应用系统。 如果是单个tomcat服务&#xff0c;session可以共享&#xff0c;如果是多个tomcat&#xff0c;那么服务s…

count(*)、count(1)、count(column)的区别

count(*)、count(1)、count(column)的区别 count(*)&#xff1a; 返回检索到的行数&#xff0c;无论是否含有NULL值&#xff0c;在InnoDB下&#xff0c;仅计算当前事务可见的行&#xff0c;通过遍历最小的可用二级索引来处理count(*)&#xff0c;除非索引或优化器指示优化器使…

阿里云林立翔:基于阿里云 GPU 的 AIGC 小规模训练优化方案

云布道师 本篇文章围绕生成式 AI 技术栈、生成式 AI 微调训练和性能分析、ECS GPU 实例为生成式 AI 提供算力保障、应用场景案例等相关话题展开。 生成式 AI 技术栈介绍 1、生成式 AI 爆发的历程 在 2022 年的下半年&#xff0c;业界迎来了生成式 AI 的全面爆发&#xff0c…

深信服技术认证“SCSA-S”划重点:命令执行漏洞

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…

持续集成交付CICD:基于ArgoCD 的GitOps 自动化完成前端项目应用发布与回滚

目录 一、实验 1. 环境 2. K8S master节点部署Argo CD 3.基于ArgoCD 实现GitOps &#xff08;同步部署文件&#xff09; 4.基于ArgoCD 实现GitOps &#xff08;同步HELM文件&#xff09; 二、问题 1. ArgoCD 连接K8S集群状态为 Unknown 2.ArgoCD 创建application失败 …

华为全屋wifi6蜂鸟套装标准

华为政企42 华为政企 目录 上一篇华为安防监控摄像头下一篇华为企业级无线路由器

Layui 2.9.2 列表商品展示页 用模板引擎 laytpl Ajax 读取json 数据 筛选数组 filter css 限制文体显示过长用。。。代替

全代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>软件管理器</title><meta name"renderer" content"webkit"><meta http-equiv"X-UA-Compatible" conten…

文献速递:生成对抗网络医学影像中的应用—— CG-3DSRGAN:用于从低剂量PET图像恢复图像质量的分类指导的3D生成对抗网络

文献速递&#xff1a;生成对抗网络医学影像中的应用—— CG-3DSRGAN&#xff1a;用于从低剂量PET图像恢复图像质量的分类指导的3D生成对抗网络 本周给大家分享文献的主题是生成对抗网络&#xff08;Generative adversarial networks, GANs&#xff09;在医学影像中的应用。文献…

大数据技术基础-读书笔记

大数据技术基础-读书笔记 一、大数据概述 大数据是指在一定时间内无法用常规软件工具对其内容进行抓取、处理、分析和管理的数据集合。 大数据一般会涉及两种以上的数据形式&#xff0c;数据量通常是100TB以上的高速、实时数据流&#xff0c;或者从每年增长速度快的小数据开…

Java小案例-Java实现人事管理系统

前言 《人事管理系统》该项目采用技术jsp、Struts2、Mybatis、dwr、tomcat服务器、mysql数据库 开发工具eclipse/idea。 【项目使用技术】 Struts2Mybatisdwrjqueryjscss等技术 前端使用技术&#xff1a;JSP, dwr、jquery、js、css等 后端使用技术&#xff1a;Struts2Myba…

Leetcode—73.矩阵置零【中等】

2023每日刷题&#xff08;六十六&#xff09; Leetcode—73.矩阵置零 空间复杂度为O(mn)版实现代码 class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int rowLen matrix.size();int colLen matrix[0].size();vector<int> row…

使用 ElementUI 组件构建无边框 Window 桌面应用(WinForm/WPF)

生活不可能像你想象得那么好&#xff0c;但也不会像你想象得那么糟。 我觉得人的脆弱和坚强都超乎自己的想象。 有时&#xff0c;我可能脆弱得一句话就泪流满面&#xff1b;有时&#xff0c;也发现自己咬着牙走了很长的路。 ——莫泊桑 《一生》 一、技术栈 Vite Vue3 TS E…