Java入门4: 泛型和集合


Java入门4: 泛型和集合

MangoGO 芒狗狗

目录

  • 4 泛型和集合
    • 4.1 泛型
    • 4.2 Collection
    • 4.3 List
    • 4.4 ArrayList
    • 4.5 Map
    • 4.6 HashMap
    • 4.7 Set 和 HashSet
    • 4.8 Collections
    • 参考代码


4 泛型和集合

  Java 使用集合来组织和管理对象,本节我们重点讲解泛型和集合。主要介绍 Collection、List、ArrayList、Map、HashMap、Set 和 HashSet、Collections、算法等内容。

4.1 泛型

  泛型即参数化类型,也就是说数据类型变成了一个可变的参数,在不使用泛型的情况下,参数的数据类型都是写死了的,使用泛型之后,可以根据程序的需要进行改变。

  定义泛型的规则:

  • 只能是引用类型,不能是基本数据类型。
  • 泛型参数可以有多个。
  • 可以使用 extends 语句或者 super 语句如 表示类型的上界,T 只能是 SuperClass 或其子类, 表示类型的下界,K 只能是 ChildClass 或其父类。
  • 可以是通配符类型,比如常见的 Class<?>。单独使用 ? 表示任意类型,也可以结合 extends 和 super 语句进行限制。
/* 
使用T代表类型,无论何时都没有比这更具体的类型来区分它。如果有多个类型参数,我们可能使用字母表中T的临近的字母,比如S。
*/
class GenericsTest<T> {
   
    private T ob;

    /*
    定义泛型成员变量,定义完类型参数后,可以在定义位置之后的方法的任意地方使用类型参数,就像使用普通的类型一样。
    注意,父类定义的类型参数不能被子类继承。
    */
    public GenericsTest(T ob) {
   
        this.ob = ob;
    }

    // getter
    public T getOb() {
   
        return ob;
    }

    // setter
    public void setOb(T ob) {
   
        this.ob = ob;
    }

    public void showType() {
   
        System.out.println("Type of T is " + ob.getClass().getName());
    }
}

public class GenericsTestDemo {
   
    public static void main(String[] args) {
   
        // 定义泛型类 GenericsTest 的一个 Integer 版本
        GenericsTest<Integer> intOb = new GenericsTest<Integer>(88);
        int i = intOb.getOb();
        System.out.println("value of ob: " + i);
        System.out.println("------------------");
        
        // 定义泛型类 Test 的一个 String 版本
        GenericsTest<String> strOb = new GenericsTest<String>("MangoGO");
        strOb.showType();
        String s = strOb.getOb();
        System.out.println("value of ob: " + s);
    }
}
!java GenericsTestDemo.java
value of ob: 88
------------------
Type of T is java.lang.String
value of ob: MangoGO
public class Animal {
   
    public Animal() {
   
        System.out.println("我是动物");
    }
}

public class Dog extends Animal {
   
    public Dog() {
   
        System.out.println("我是狗");
    }
}

public class GenericsTestDemo2 {
   
    public<T, S extends T> T GenericsTestDemo2(T t, S s) {
   
        System.out.println("我是 T 类型,我的类型是" + t.getClass().getName());
        System.out.println("我是 S 类型,我的类型是" + s.getClass().getName());
        return t;
    }

    public static void main(String[] args) {
   
        GenericsTestDemo2 test = new GenericsTestDemo2();
        Dog d = new Dog();
        Animal a0 = new Animal();
        Animal a1 = test.GenericsTestDemo2(a0, d);
        System.out.println("我是对象 a1,我的类型是" + a1.getClass().getName());
    }
}
!java GenericsTestDemo2.java
我是动物
我是狗
我是动物
我是 T 类型,我的类型是Animal
我是 S 类型,我的类型是Dog
我是对象 a1,我的类型是Animal

  上面的例子中我们对类型参数赋予了具体的类型,当然我们有时候也无法确定类型参数的类型,这个时候我们便可以使用通配符。如果仅仅是想实现多态,请优先使用通配符解决。

// GenericsTestDemo3.java

import java.util.List;
import java.util.ArrayList;

public class GenericsTestDemo3 {
   
    // List<?> 表示接收一个元素为任意类型的 List
    public void GenericsTestDemo3(List<?> s) {
   
        for (Object obj : s) {
   
            System.out.println("我的类型是" + obj.getClass().getName());
        }
    }

    public static void main(String[] args) {
   
        // TODO Auto-generated method stub
        GenericsTestDemo3 test = new GenericsTestDemo3();
        Dog a0 = new Dog();
        Animal a1 = new Animal();

        // 声明一个接收元素类型是 Animal 的 List s
        // 然后创建一个元素类型是 Animal 的 ArrayList 复制给 s
        List<Animal> s = new ArrayList<Animal>();

        // Dog a0 是 Animal 的子类,可以向上转型为 Animal 类型
        s.add(a0);
        s.add(a1);
        test.GenericsTestDemo3(s);
    }
}
!java GenericsTestDemo3.java
我是动物
我是狗
我是动物
我的类型是Dog
我的类型是Animal

4.2 Collection

  集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大内容:对外的接口、接口的实现和对集合运算的算法。

  因为集合框架中的很多类功能是相似的,所以我们用接口来规范类。Collection 接口是 Java 集合框架里的一个根接口。它也是 List、Set 和 Queue 接口的父接口。Collection 接口中定义了可用于操作 List、Set 和 Queue 的方法——增删改查。

方法 返回值 说明
add(E e) boolean 向 collection 的尾部追加指定的元素(可选操作)
addAll(Collection<? extend E> c) boolean 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)
clear() void 移除此 collection 中的所有元素(可选操作)
contains(Object o) boolean 如果此 collection 包含指定的元素,则返回 true
containsAll(Collection<?> c) boolean 如果此 collection 包含指定 collection 的所有元素,则返回 true
equals(Object o) boolean 比较此 collection 与指定对象是否相等
hashCode() int 返回此 collection 的哈希码值
isEmpty() boolean 如果此 collection 不包含元素,则返回 true
iterator() Iterator 返回在此 collection 的元素上进行迭代的迭代器
remove(Object o) boolean 移除此 collection 中出现的首个指定元素(可选操作)
removeAll(Collection<?> c) boolean 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)
retainAll(Collection<?> c) boolean 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)
size() int 返回此 collection 中的元素数
toArray() Object[] 返回包含此 collection 中所有元素的数组
toArray(T[] a) T[] 返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同

4.3 List

  List 是一个接口,不能实例化,需要一个具体类来实现实例化。

  List 集合中的对象按照一定的顺序排放,里面的内容可以重复。 List 接口实现的

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

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

相关文章

C#医院体检系统源码 PEIS源码 系统核心功能、特点、类型、设备对接-PACS放射科设备对接:DR、CT、MRI、钼靶。

C#医院体检系统源码 PEIS源码 系统核心功能、特点、类型、设备对接-PACS放射科设备对接:DR、CT、MRI、钼靶。 体检系统是为体检中心、医院体检科等体检机构专门开发的全流程管理系统。该系统通过软件实现检测仪器数据的自动提取&#xff0c;内置多级医生工作台&#xff0c;旨在…

远程连接服务器的工具?

远程连接服务器工具是现代工作环境中不可或缺的工具之一。它允许用户通过网络远程访问和控制远程服务器&#xff0c;为用户提供了更加便捷和高效的工作方式。无论是远程办公、远程维护还是云计算&#xff0c;远程连接服务器工具都发挥着重要的作用。 在众多远程连接服务器工具…

LabVIEW RT在非NI硬件上的应用与分析

LabVIEW RT&#xff08;实时操作系统&#xff09;可运行在非NI&#xff08;National Instruments&#xff09;硬件上&#xff0c;如研华工控机&#xff0c;但需要满足特定硬件要求。本文从硬件要求、开发和运行差异、可靠性、稳定性、优势和成本等多角度详细分析在非NI硬件上运…

【Mac】Luminar Neo for mac(图像编辑软件)软件介绍及同类型软件比较

Luminar Neo软件介绍 Luminar Neo 是一款由 Skylum 开发的功能强大的照片编辑软件&#xff0c;专为摄影师和摄影爱好者设计。它适用于 Mac 和 Windows 平台&#xff0c;提供了一系列先进的编辑工具和功能&#xff0c;使用户能够轻松提升和优化他们的照片。以下是 Luminar Neo …

沸点 | LDBC与SIGMOD联合研讨,推动图数据库创新与标准化

当地时间6月9日&#xff0c;国际基准官方平台关联数据基准委员会&#xff08;LDBC&#xff0c;Linked Data Benchmark Council&#xff09;与SIGMOD 2024&#xff08;是全球最具国际影响力的数据管理、数据处理和数据存储领域的学术顶会之一&#xff0c;ACM SIGMOD/Big Data in…

非关系型数据库NoSQL数据层解决方案 之 redis springboot整合与读写操作 2024详解以及window版redis5.0.14下载百度网盘

redis下载安装以及基本使用 下载地址 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;0410 一个名对应一个数值 内存级 在内存里进行操作 准备启动 我们现在就有一个redis客户端的服务器了 我们再启动一个cmd 操作redis数据库 redis里面的基本数据类型有五种 …

用Canvas绘制2D平面近大远小的马路斑马线

用Canvas绘制2D平面近大远小的马路斑马线 设置canvas和上下文&#xff1a; 首先&#xff0c;你需要创建一个元素&#xff0c;并获取其2D渲染上下文。 绘制斑马线&#xff1a; 使用fillRect或strokeRect方法绘制斑马线。你可以通过循环和计算来绘制多条具有不同宽度和间隔的…

LeetCode20.有效的括号

题目描述 分析 我们刚上来的思路可能是&#xff1a;找出这三种括号的个数 如果都是偶数 说明匹配 但是这里还有一个顺序问题 比如 " )( "这样是不匹配的&#xff01; 所以这种思路不可取&#xff01; 我们想 如果遇到左括号&#xff0c;把他读到一个顺序表中&#…

等级考试3-2021年3月题

作业&#xff1a; #include <iostream> using namespace std; int chonghe(int,int,int,int); int main(){int a[1000],b[1000];int n,ma0;cin>>n;for(int i0;i<n;i){cin>>a[i]>>b[i];}for(int i0;i<n;i){for(int ji1;j<n;j){mamax(ma,chongh…

Python酷库之旅-比翼双飞情侣库(10)

目录 一、xlrd库的由来 二、xlrd库优缺点 1、优点 1-1、支持多种Excel文件格式 1-2、高效性 1-3、开源性 1-4、简单易用 1-5、良好的兼容性 2、缺点 2-1、对.xlsx格式支持有限 2-2、功能相对单一 2-3、更新和维护频率低 2-4、依赖外部资源 三、xlrd库的版本说明 …

4.8.2 利用Spark SQL计算总分与平均分

姓名语文数学英语物理化学陈燕文8998807665张晓峰9078928456李太白8793677892洪小琳9867879076 1. 准备数据 创建本地成绩文件&#xff1a;scores.txt&#xff0c;包含学生成绩数据。上传到 HDFS&#xff1a; 创建目录&#xff1a;hdfs dfs -mkdir -p /scoresumavg/input上传文…

板凳------56.Linux/Unix 系统编程手册(下) -- SOCKET 介绍

56.1.概述 socket 是一种IPC方法&#xff0c;允许位于同一主机或使用网络连接起来的不同主机上的应用程序之间交换数据。 UNIX 允许位于同一主机系统上的应用程序之间通信 Internet domain IPv4 and IPV6 // socket 通信方式 1.各个应用程序创建一个socket&#xff0c;socket是…

块级元素与行内元素详解

在网页设计与开发中&#xff0c;元素根据其在页面布局中的表现可分为两大类&#xff1a;块级元素&#xff08;Block-level Elements&#xff09;和行内元素&#xff08;Inline Elements&#xff09;。理解它们的特性和使用规则对于构建结构清晰、布局合理的网页至关重要。 块级…

【因果推断python】38_预测模型1

目录 工业界中的机器学习 之前的部分涵盖了因果推理的核心。那里的技术是众所周知和成熟的。他们经受住了时间的考验。第一部分建立了我们可以依赖的坚实基础。用更专业的术语来说&#xff0c;第一部分侧重于定义什么是因果推理&#xff0c;哪些偏差会阻止相关性成为因果关系&…

高考分数线一分一段统计汇总——使用SQL窗口函数

高考分数线一分一段统计汇总——使用SQL窗口函数 select 总分数&#xff0c; 一分一段人数&#xff0c; sum(一分一段人数) over( order by 总分数 desc) as 累计排名 from( select 总分数&#xff0c; count(考生号) as 一分一段人数 from &#xff08; select 考生号…

网络编程(四)

一、使用wireshark抓包分析协议头 &#xff08;一&#xff09;wireshark常用的过滤语句 tcp.port <想要查看的端口号> ip.src <想要查看的源IP地址> ip.dest <想要查看的目的IP地址> ip.addr <想要查看的IP地址>&#xff08;二&#xff09;抓包分…

【Java】解决Java报错:InterruptedException in Multi-threaded Applications

文章目录 引言一、InterruptedException的定义与概述1. 什么是InterruptedException&#xff1f;2. InterruptedException的常见触发场景3. 示例代码 二、解决方案1. 正确处理InterruptedException2. 合理使用中断机制3. 使用更高层次的并发工具 三、最佳实践1. 避免吞掉Interr…

如何使用alias永久别名(linux篇)

一、alias的使用 alias主要作用是起一个别名的用处 它又分两种形式&#xff1a; ① 临时别名 ② 永久别名 1.第一种&#xff08;临时别名&#xff09;&#xff1a; C:\Users\62452>ssh root192.168.0.102 root192.168.0.102s password: Last login: Sat Jun 15 16:30:12 20…

了解统计学中不同类型的分布

目录 一、说明 二、均匀分布&#xff1a; 三、机器学习和数据科学中的均匀分布示例&#xff1a; 3.1 对数正态分布&#xff1a; 3.2 机器学习和数据科学中的对数正态分布示例&#xff1a; 四、 帕累托分布 4.1 什么是幂律&#xff1f; 4.2 机器学习和数据科学中的帕累托分布示例…

【C#】图形图像编程

实验目标和要求&#xff1a; 掌握C#图形绘制基本概念&#xff1b;掌握C#字体处理&#xff1b;能进行C#图形图像综合设计。 运行效果如下所示&#xff1a; 1.功能说明与核心代码 使用panel为画板&#xff0c;完成以下设计内容&#xff1a; 使用pen绘制基础图形&#xff1b;使…