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;}// getterpublic T getOb() {return ob;}// setterpublic 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.javaimport java.util.List;
import java.util.ArrayList;public class GenericsTestDemo3 {// List<?> 表示接收一个元素为任意类型的 Listpublic void GenericsTestDemo3(List<?> s) {for (Object obj : s) {System.out.println("我的类型是" + obj.getClass().getName());}}public static void main(String[] args) {// TODO Auto-generated method stubGenericsTestDemo3 test = new GenericsTestDemo3();Dog a0 = new Dog();Animal a1 = new Animal();// 声明一个接收元素类型是 Animal 的 List s// 然后创建一个元素类型是 Animal 的 ArrayList 复制给 sList<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 接口实现的

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

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

相关文章

【数据资源变数据资产之路】数据治理服务解决方案(35页WORD)

引言&#xff1a;随着企业数据量的快速增长和数据来源的多样化&#xff0c;数据治理成为了企业管理的核心议题。数据治理不仅关乎数据的质量、安全性和合规性&#xff0c;还直接影响着企业的决策效率和市场竞争力。为满足企业对高效、规范、安全的数据治理需求&#xff0c;我们…

【仿真建模-anylogic】EventOriginator原理解析

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-16 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 类图 2. 原理解析 2.1 核心函数 函数功能double getRest(TimeUnits units)获取剩余时间boolean isActive()判定事件的触发计划是否…

2023年的Top20 AI应用在近一年表现怎么样?

AI应用现在进入寒武纪大爆发时代&#xff0c;百花争艳。如果倒回到2023年初&#xff0c;那时候排名靠前的AI应用在一年多时间&#xff0c;发生了哪些变化&#xff1f;能带给我们什么启示&#xff1f; 在2023年1月&#xff0c;排名靠前20的AI应用是&#xff1a; DeepL&#xff…

JavaScript——初识:JavaScript的组成、输入和输出语句... | JavaScript基础:变量,数据类型转换

目录 初识JavaScript JavaScript的组成 输入和输出语句 ECMAScript 6保留关键字 变量的命名规范 注意事项 JavaScript基础 变量的数据类型 数据类型分类 数据类型转换 转换为字符串型 转换为数字型 转换为布尔型 例题 初识JavaScript JavaScript的组成 Java…

Apache IoTDB进行IoT相关开发实践

当今社会&#xff0c;物联网技术的发展带来了许多繁琐的挑战&#xff0c;尤其是在数据库管理系统领域&#xff0c;比如实时整合海量数据、处理流中的事件以及处理数据的安全性。例如&#xff0c;应用于智能城市的基于物联网的交通传感器可以实时生成大量的交通数据。据估计&…

STM32小项目——震动感应灯

文章目录 前言一、继电器原理1.简单使用说明2.接口说明3.代码实现 二、震动传感器原理1.工作原理2.代码展示 三、项目搭建1.流程构建代码展示 总结 前言 一位学习STM32的小白~ 有错误请评论区或私信指出~ 一、继电器原理 1.简单使用说明 继电器就相当一个开关只不过这个开关…

用Copilot画漫画,Luma AI生成视频:解锁创意新玩法

近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;各种创意工具也层出不穷。今天&#xff0c;我们就来介绍一种全新的创作方式&#xff1a;使用Copilot画漫画&#xff0c;再将漫画放入Luma AI生成视频。 Copilot&#xff1a;你的AI绘画助手 Copilot是一款基于人工智…

C++访问Private,Protecd的一些方法总结

前言 在编写C程序中 我们偶尔会碰到这样的三种特殊修改变量值的需求&#xff1a; [1]在不修改类原本的实现下&#xff0c;访问修改类的Private变量 [2]在不修改类原本的实现下&#xff0c;修改类的Protected变量 Private变量访问 public类模版函数特化 这种办法利用了类模…

解决Qt的multimedia库在clion中依赖库补全的问题

解决Qt的multimedia库在clion中使用报错的问题 在clion中&#xff0c;使用Qt的multimedia库时会报如下错误&#xff1a; defaultServiceProvider::requestService(): no service found for - "org.qt-project.qt.mediaplayer" 我猜测出现这个错误的原因很可能是因为…

区块链中的gas与转账收款相关概念

区块链是一个经济系统 计算与存储系统都是稀缺的&#xff0c;区块链的工作需要消耗资源共识、trustless需要矿工的工作&#xff0c;而矿工需要激励Transaction的执行有成本&#xff08;gas&#xff09;,gas费成为矿工的奖励ether是这个经济生态系统的通行货币 关心的问题 合…

Techo TVP技术 沙龙

Techo TVP技术 沙龙 今天参加了 在上海 徐汇 腾讯云大厦 举办的 Techo TVP 技术沙龙&#xff08;主要介绍 AI agent 让我感受很深&#xff09; &#xff0c;那什么是 AI Agent呢&#xff1f; 是一个智能体&#xff0c;由大语言模型驱动&#xff0c;具有自主理解、感知、规划、…

【react小项目】bmi-calculator

bmi-calculator 目录 bmi-calculator初始化项目01大致布局01代码 02完善样式02代码 03输入信息模块03代码 04 使用图表04代码 05详细记录信息渲染05代码 06 让数据变成响应式的06-1输入框的数据处理06-2图表&#xff0c;和记录信息的区域数据处理 07 删除功能&#xff0c;撤销功…

维度建模中的事实表设计原则

维度建模是一种数据仓库设计方法&#xff0c;其核心是围绕业务过程建立事实表和维度表。事实表主要存储与业务过程相关的度量数据&#xff0c;而维度表则描述这些度量数据的属性。 以下是设计事实表时需要遵循的几个重要原则&#xff0c;来源于《维度建模》那本书上&#xff0…

TCP与UDP案例

udp不会做拆分整合什么的 多大就是多大

STM32学习记录(五)————外部中断EXTI

文章目录 前言一、外部中断EXTI基础知识1.外部中断介绍2.外部中断框架2.1AFIO2. 2.STM32外部中断机制框架 总结 前言 一个学习STM32的小白~ 有问题私信或评论区指出~ 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、外部中断EXTI基础知识 1.外部中…

git删除已创建tag标签

前言 一不小心把tag标签名称复制错了&#xff0c;现将删除 1.删除本地标签 1.1.执行下面命令 git tag -d 1.5.2401161.5.240116是创建的tag标签名称 2.如果是删除远程的tag标签名称的话&#xff0c;看下面命令 2.1.删除远程标签 git push --delete origin <tagname>…

C学习自学笔记

C学习笔记 0>C语言概述 为什么学习C语言 1&#xff09;C的起源和发展------了解即可 B语言、C语言、C语言的产生地&#xff1a;都出自 美国贝尔实验室 2&#xff09;C的特点 优点&#xff1a;代码量小、速度快、功能强大 缺点&#xff1a;危险性高、开发周期长、可移植性…

【PL理论】(25) C- 语言:表达式求值的推理规则 | 执行语句的推理规则 | 语句执行的推理规则

&#x1f4ad; 写在前面&#xff1a;本章我们将继续更新我们的 "C-" 语言&#xff0c;更新表达式求值的推理规则、执行语句的推理规则以及语句执行的推理规则。 目录 0x00 C- 语言更新&#xff1a;表达式求值的推理规则 0x01 C- 语言更新&#xff1a;执行语句的推…

13.docker registry(私有仓库)

docker registry&#xff08;私有仓库&#xff09; 1.从公有仓库中下载镜像比较慢 &#xff0c;比如docker run执行一个命令假设本地不存在的镜像&#xff0c;则会去共有仓库进行下载。 2.如果要是2台机器之间进行拷贝&#xff0c;则拷贝的是完整的镜像更消耗空间。 3.如果1个…

springboot优雅shutdown时如何保障异步线程的安全

我前面写了一篇springboot优雅shutdown的文章&#xff0c;看起来一切很美好。 https://blog.csdn.net/chenshm/article/details/139640775 那是因为没有进行多线程测试。如果一个请求中包括阻塞线程&#xff08;主线程&#xff09;和非阻塞线程&#xff08;异步线程&#xff09…