【Java】泛型与集合篇(一)

泛型与集合(一)

  • 泛型
    • 泛型的核心作用
    • 泛型类型(类)
      • 定义与使用
      • 类型参数命名约定
    • 泛型方法
      • 定义与调用
      • 与泛型类的区别
    • 通配符
      • 上界通配符
      • 下界通配符
    • 有界类型参数
    • 类型擦除
  • 集合框架
    • 核心接口
      • Collection 接口
      • Map 接口
    • Collection 接口操作的常用方法
      • 基本操作
      • 批量操作
      • 数组操作
      • 流操作方法
  • List 接口及实现类
    • List 接口
      • List 接口概述
      • List 接口常用方法
      • List 接口与 Collections 接口
    • ArrayList 类
      • 特点与实现原理
      • 构造方法
    • 遍历集合元素
      • 使用简单的 for 循环
      • 使用增强的 for 循环
      • 使用迭代器
      • 双向迭代器
    • 数组转换为 List 对象
      • 使用 Arrays.asList() 方法
      • 手动遍历数组添加到 ArrayList
      • 使用 Java 8 Stream API
      • 基本类型数组转换为 List
    • Vector 类和 Stack 类
      • Vector 类
        • 概述
        • 常用方法
      • Stack 类
        • 概述
        • 常用方法

泛型

泛型的核心作用

泛型是 Java 实现代码复用和类型安全的重要机制。它允许在类、接口和方法中定义类型参数,使代码能处理多种数据类型,同时避免强制类型转换和运行时类型错误。例如,在集合中使用泛型,可确保集合中元素类型的一致性,在编译阶段就能检测出类型错误,增强代码的健壮性和可读性。

泛型类型(类)

定义与使用

定义泛型类时,通过尖括号 声明类型参数,T 可以是类、接口、数组类型(基本数据类型需使用包装类型)。以 Box 类为例:

public class Box<T> {
   
    private T content;

    public void setContent(T content) {
   
        this.content = content;
    }

    public T getContent() {
   
        return content;
    }
}

使用时,需指定具体的类型参数。从 Java 7 开始,可使用菱形语法简化创建对象的过程:

Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
System.out.println(stringBox.getContent()); 

类型参数命名约定

类型参数命名通常使用单个大写字母作为类型参数名,常见的有 E(表示元素)、K(表示键)、V(表示值)、T(表示类型)、N(表示数字)等。遵循这些约定,能使代码更易理解。

泛型方法

定义与调用

泛型方法在方法返回值前声明类型参数 ,其作用域仅限于该方法。例如,定义一个打印数组元素的泛型方法:

public static <T> void printArray(T[] array) {
   
    for (T element : array) {
   
        System.out.print(element + " ");
    }
    System.out.println();
}

调用时,编译器会自动推断类型:

Integer[] intArr = {
   1, 2, 3};
printArray(intArr); 

与泛型类的区别

泛型类的类型参数作用于整个类,而泛型方法的类型参数仅在声明的方法内有效。泛型方法还可以在非泛型类中定义,增加了代码的灵活性。

通配符

上界通配符

上界通配符(<?extends T>)用于限制类型为T或其子类,增强泛型的灵活性。例如,计算列表中数字元素总和的方法:

public static double sum(List<? extends Number> list) {
   
    double sum = 0;
    for (Number num : list) {
   
        sum += num.doubleValue();
    }
    return sum;
}

该方法可接受 List<Integer>、List<Double> 等类型的参数。

下界通配符

下界通配符(<?super T>)限制类型为 T 或其父类。比如,向列表中添加 Integer 类型元素的方法:

public static void addNumbers(List<? super Integer> list) {
   
    list.add(1);
    list.add(2);
}

此方法可接受 List<Number>、List<Object> 等类型的参数。

有界类型参数

使用 extends 或 super 限制类型参数的范围。例如,定义一个计算数字平方的 Calculator 类:

public class Calculator<T extends Number> {
   
    public double square(T num) {
   
        return num.doubleValue() * num.doubleValue();
    }
}

类型擦除

泛型在编译后会被替换为 Object 或边界类型,运行时无法获取泛型信息。例如, List 和 List 在运行时都变为 List。这是为了保持 Java 的向后兼容性,但也带来了一些局限性,如无法在运行时根据泛型类型进行不同的处理。

集合框架

核心接口

Collection 接口

是所有集合的根接口,继承了 Iterable 接口,定义了集合的基本操作方法。它的主要子接口有 List、Set、Queue,每个子接口都有不同的特性和用途。List 是有序且可重复的集合,Set 是无序且不可重复的集合,Queue 是按特定顺序处理元素的集合。

Map 接口

用于存储键值对,与 Collection 接口并列。在 Map 中,键是唯一的,值可以重复,常用于根据键快速查找值的场景。

Collection 接口操作的常用方法

基本操作

  • 向集合中添加元素 e:boolean add(E e)
  • 从集合中删除指定的元素 o:boolean remove(Object o)
  • 返回集合中是否包含指定的元素 o:boolean contains(Object o)
  • 返回集合是否为空,即不包含元素:boolean isEmpty()
  • 返回集合中包含的元素个数:int size()
  • 返回包含所有元素的迭代器对象:Iterator iterator()
  • 从父接口继承的方法,在集合的每个元素上执行指定的操作:default void forEach(Consumer<? super T>action)

以下是这些方法的代码示例:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.function.Consumer;

public class CollectionExample {
   
    public static void main(String[] args) {
   
        // 创建一个集合对象,这里以ArrayList为例,它实现了Collection接口
        Collection<Integer> collection = new ArrayList<>();

        // 测试add方法
        boolean addResult = collection.add(5);
        System.out.println("添加元素结果: " + addResult);

        // 测试remove方法
        boolean removeResult = collection.remove(5);
        System.out.println("删除元素结果: " + removeResult);

        // 测试contains方法
        collection.add(10);
        boolean containsResult = collection.contains(10);
        System.out.println("集合是否包含元素: " + containsResult);

        // 测试isEmpty方法
        boolean isEmptyResult = collection.isEmpty();
        System.out.println("集合是否为空: " + isEmptyResult);

        // 测试size方法
        int size = collection.size();
        System.out.println("集合元素个数: " + size);

        // 测试iterator方法
        Iterator<Integer> iterator = collection.iterator();
        while (iterator.hasNext()) {
   
            Integer element = iterator.next();
            System.out.println("迭代器遍历元素: " + element);
        }

        // 测试forEach方法
        collection.add(20);
        collection.forEach(new Consumer<Integer>() {
   
            @Override
            public void accept(Integer integer) {
   
                System.out.println("forEach方法操作元素: " + integer);
            }
        });
    }
}

批量操作

  • 将集合c中的所有元素添加到当前集合中:boolean addAll(Collection<? extends E> c)
  • 从当前集合中删除 c 中的所有元素:boolean removeAll(Collection<?> c)
  • 从当前集合中删除满足谓词的所有元素:default boolean removeIf(Predicate<? super E> filter)
  • 返回当前集合是否包含 c 中的所有元素:boolean containsAll(Collection<?> c)
  • 在当前集合中只保留指定集合 c 中的元素,其他元素删除:boolean retainAll(Collection<?> c)
  • 将集合清空:void clear()

以下是这些方法的代码示例:

import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Predicate;

public class CollectionBatchOperationsExample {
   
    public static void main(String[] args) {
   
        

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

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

相关文章

网络安全推荐的视频教程 网络安全系列

第一章 网络安全概述 1.2.1 网络安全概念P4 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或恶意的原因而遭到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 1.2.3 网络安全的种类P5 &#xff08;1…

内网下,Ubuntu (24.10) 离线安装docker最新版教程

一般在数据比较敏感的情况下&#xff0c;是无法使用网络的&#xff0c;而对于Ubuntu系统来说&#xff0c;怎么离线安装docker呢&#xff1f; 下面我给大家来讲一下&#xff1a; 采用二进制安装&#xff1a; 1.下载docker离线包 官网下载&#xff1a; Index of linux/static…

基于SpringBoot+Vue的老年人体检管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

AI工具篇:利用DeepSeek+Kimi 辅助生成综述汇报PPT

随着科研和学术报告需求的增加&#xff0c;如何高效地准备一份结构清晰、内容充实的PPT已成为许多研究者的挑战。 传统的PPT制作过程繁琐&#xff0c;需要大量文献收集、数据分析和设计工作&#xff0c;而AI工具能够帮助提升效率&#xff0c;减少重复劳动。 本文将介绍如何使用…

【Spring详解一】Spring整体架构和环境搭建

一、Spring整体架构和环境搭建 1.1 Spring的整体架构 Spring框架是一个分层架构&#xff0c;包含一系列功能要素&#xff0c;被分为大约20个模块 Spring核心容器&#xff1a;包含Core、Bean、Context、Expression Language模块 Core &#xff1a;其他组件的基本核心&#xff…

为什么WP建站更适合于谷歌SEO优化?

在当今数字时代&#xff0c;建立一个网站似乎变得容易&#xff0c;但要构建一个真正能够带来流量和订单的网站却并非易事。特别是在谷歌SEO优化方面&#xff0c;不同的建站程序在SEO支持方面的效果差异显著。对于希望提升搜索引擎表现的用户来说&#xff0c;WordPress无疑是最佳…

Vue 项目中逐步引入 TypeScript 的类型检查

在现有的 Vue 项目中逐步引入 TypeScript 的类型检查 本文源于一道面试题&#xff1a;注&#xff1a;两种问法一个意思哈&#xff01;&#xff01; 问题一&#xff1a;“ 老项目Js写的&#xff0c;如何轻量方式享受 ts 类型&#xff1f;” 问题二&#xff1a;“如何 在现有的 …

win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统&#xff0c;报错&#xff1a;Operating System not found 二、原因分析 国产系统&#xff0c;需要注意的点&#xff1a; 需要看你的系统类…

Spring中Bean的四种实例化方法

Bean的四种实例化方法 Bean是Spring核心的概念&#xff0c;另外一个核心的概念是AOP。官网上&#xff0c;Bean的解释是&#xff1a; In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans…

聚焦工控物联网网关

一、引言 在工业物联网高速发展的当下&#xff0c;工控物联网网关作为连接工业现场设备与上层管理系统、云平台的关键组件&#xff0c;其兼容性与可扩展性至关重要。工业生产新技术、新设备不断涌现&#xff0c;企业数字化转型需求持续增长&#xff0c;网关的适配与扩展能力直…

李宏毅机器学习笔记:【6.Optimization、Adaptive Learning Rate】

Optimization 1.Adaptive Learning Rate2.不同的参数需要不同的学习率3.Root Mean Square4.RMSProp5.Adam6.learning rate scheduling7.warm up总结 critical point不一定是你在训练一个network时候遇到的最大的障碍。 1.Adaptive Learning Rate 也就是我们要给每个参数不同的…

Redis7——基础篇(三)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09; 接上期内容&#xff1a;上期完成了Redis的基本…

[LeetCode]day25 151.翻转字符串里的单词

题目链接 题目链接 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能…

Visual Studio Code的下载安装与汉化

1.下载安装 Visual Studio Code的下载安装十分简单&#xff0c;在本电脑的应用商店直接下载安装----注意这是社区版-----一般社区版就足够用了---另外注意更改安装地址 2.下载插件 重启后就是中文版本了

华为昇腾 910B 部署 DeepSeek-R1 蒸馏系列模型详细指南

本文记录 在 华为昇腾 910B(65GB) * 8 上 部署 DeepSeekR1 蒸馏系列模型&#xff08;14B、32B&#xff09;全过程与测试结果。 NPU&#xff1a;910B3 (65GB) * 8 &#xff08;910B 有三个版本 910B1、2、3&#xff09; 模型&#xff1a;DeepSeek-R1-Distill-Qwen-14B、DeepSeek…

【MySQL排错 】mysql: command not found 数据库安装后无法加载的解决办法

【MySQL排错 】mysql: command not found 数据库安装后无法加载的解决办法 A Solution to Solve Error - mysql: command not found After The Installation of MySQL Community Server By JacksonML 本文简要介绍如何在macOS安装完毕MySQL数据库服务器后&#xff0c;针对无…

Spring-GPT智谱清言AI项目(附源码)

一、项目介绍 本项目是Spring AI第三方调用整合智谱请言&#xff08;官网是&#xff1a;https://open.bigmodel.cn&#xff09;的案例&#xff0c;回答响应流式输出显示&#xff0c;这里使用的是免费模型&#xff0c;需要其他模型可以去 https://www.bigmodel.cn/pricing 切换…

用deepseek学大模型08-卷积神经网络(CNN)

yuanbao.tencent.com 从入门到精通卷积神经网络(CNN),着重介绍的目标函数&#xff0c;损失函数&#xff0c;梯度下降 标量和矩阵形式的数学推导&#xff0c;pytorch真实能跑的代码案例以及模型,数据&#xff0c;预测结果的可视化展示&#xff0c; 模型应用场景和优缺点&#xf…

deepseek-v3在阿里云和腾讯云的使用中的差异

随着deepseek在各大云商上线&#xff0c;试用了下阿里云和腾讯云的deepseek服务&#xff0c;在回答经典数学问题9.9和9.11谁大时&#xff0c;发现还是有差异的。将相关的问题记录如下。 1、问题表现 笔者使用的openai的官方sdk go-openai。 因本文中测验主要使用阿里云和腾讯…

React 与 Vue 对比指南 - 上

React 与 Vue 对比指南 - 上 本文将展示如何在 React 和 Vue 中实现常见功能&#xff0c;从基础渲染到高级状态管理 Hello 分别使用 react 和 vue 写一个 Hello World&#xff01; react export default () > {return <div>Hello World!</div>; }vue <…