从零学Java 泛型

Java 泛型

文章目录

  • Java 泛型
    • 1 什么是泛型?
    • 2 泛型类
    • 3 泛型接口
    • 4 泛型方法
    • 5 泛型集合
  • Collection 工具类

1 什么是泛型?

Java泛型是JDK1.5中引入的一个新特性,其本质是参数化类型,把类型作为参数传递。

常见形式有泛型类、泛型接口、泛型方法。

语法 :

  • <T,…> :T称为类型占位符,表示一种引用数据类型(一般使用一个大写字母表示)。
  • 多个占位符之间使用逗号隔开。

好处:

  • 提高代码的重用性
  • 防止类型转换异常, 提高代码的安全性

2 泛型类

泛型类: 在类名的后面加上 <> 尖括号, 尖括号中写上类型占位符

eg:

Student<T>

public class Student<T> {String name;int age;//泛型声明成员变量T t;//泛型作为方法的参数和返回值public T sayHi (T t) {System.out.println("姓名: "+this.name+"年龄: "+this.age);return t;}
}

Test:

public class Test {public static void main(String[] args) {Student<String> zhangsan = new Student<>();zhangsan.t = "hello";String s = zhangsan.sayHi("hello");System.out.println(s);System.out.println("-----------");Student<Integer> lisi = new Student<>();lisi.t = 200;Integer r = lisi.sayHi(200);System.out.println(r);}
}

3 泛型接口

泛型接口: 在接口后面加上<> , 尖括号中写上类型占位符

eg:

Usb<T>

public interface Usb<T> {//接口中不能用泛型声明静态常量//T t;//泛型作为抽象方法的参数和返回值T service(T t);
}

Upan Usb<String>

public class Upan implements Usb<String> {@Overridepublic String service(String s) {return s;}
}

Mouse<E> Usb<E>

public class Mouse<E> implements Usb<E> {@Overridepublic E service(E e) {return e;}
}

Test:

public class TestUsb {public static void main(String[] args) {Usb<String> usb = new Upan();String s = usb.service("hello");System.out.println(s);Usb<String> usb2 = new Mouse<String>();String s2 = usb2.service("XXXX");System.out.println(s2);Usb<Integer> usb3 = new Mouse<Integer>();Integer r = usb3.service(100);System.out.println(r);}
}

4 泛型方法

泛型方法: 在方法返回值类型的前面加上 <> 尖括号, 尖括号中写上类型占位符

eg:

Teach<T>

public class Teacher {String name;//上课//泛型方法: 在方法返回值类型的前面加上 `<>` 尖括号, 尖括号中写上类型占位符//泛型作为方法的参数或返回值public <T> T teach(T t) {//声明局部变量T t2 = t;return t2;}//在类中不能使用泛型声明参数个数相同的重载方法。public <K,E> E teach(E e, K k) {//声明局部变量E e1 = e;return e;}
}

TestTeach:

public class TestTeach {public static void main(String[] args) {Teacher teacher = new Teacher();teacher.teach("XXXX");teacher.teach(1000);teacher.teach(true);teacher.teach(Math.PI);}
}

注意事项

泛型不能在类中声明静态属性。

  • static修饰的属性是静态属性先于对象,泛型类型取决于创建对象时传入的实际类型。

泛型不能在类中初始化对象或数组,但是可以声明引用或数组。

  • 实例化对象需要分配空间,没有确定类型不能开辟空间。
  • 初始化数组时需要给元素进行分配空间,泛型类型不确定无法分配空间。

在类中不能使用泛型声明参数个数相同的重载方法。

使用不同实际类型创建出的泛型类对象的引用不可以相互赋值。

5 泛型集合

概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致。

特点

  • 编译时即可检查,而非运行时抛出异常。
  • 访问时,不必类型转换。

eg:

TestArrayList :

public class TestArrayList {public static void main(String[] args) {//创建集合//ArrayList list = new ArrayList();ArrayList<String> list = new ArrayList<>();//1 添加list.add("北京");list.add("上海");list.add("广州");//2 遍历//增强forfor (String s : list) {System.out.println(s);}//普通forfor (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}//迭代器Iterator<String> it = list.iterator();while (it.hasNext()) {System.out.println(it.next());}//列表迭代器ListIterator<String> lit = list.listIterator();while (lit.hasNext()) {System.out.println(lit.nextIndex()+"..."+lit.next());}while (lit.hasPrevious()) {System.out.println(lit.previousIndex()+"..."+lit.previous());}}
}

eg : 泛型通配符 ?

public class Demo01 {public static void main(String[] args) {ArrayList<String> list = new  ArrayList<>();list.add("aaa");																																list.add("bbb");printList(list);ArrayList<Integer> list1 = new ArrayList<>();list1.add(111);list1.add(222);printList(list1);}//方法1: 使用泛型方法/*public static <T> void printList(ArrayList<T> list) {for (Object o : list) {System.out.println(o);}}*///方法2: 使用泛型通配符 ? 表示任何类型/*泛型通配符的限制1 泛型上限: ? extends Student   ?只能是Student类型或Student的子类2 泛型下限: ? super Student     ?只能是Student类型或Student的父类*/public static void printList(ArrayList<?> list) {for (Object o : list) {System.out.println(o);}}
}

Collection 工具类

概念:集合工具类,定义了除了存取以外的集合常用方法。

常用方法:

eg:

public class TestCollection {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(10);list.add(8);list.add(20);list.add(12);list.add(3);list.add(3);list.add(3);list.add(3);//1 sort(); 排序Collections.sort(list);System.out.println("排序之后: "+list);//2 binarySearch(); 二分查找int pos = Collections.binarySearch(list, 5);System.out.println(pos);//3 copy(); 复制List<Integer> list2 = new ArrayList<>();for (int i = 0; i < list.size(); i++) {list2.add(0);}Collections.copy(list2,list);System.out.println(list2);//4 frequency(); 获取元素出现的次数int count = Collections.frequency(list, 3);System.out.println(count);//5 reverse(); 反转Collections.reverse(list);System.out.println(list);//6 shuffle(); 打乱元素Collections.shuffle(list);System.out.println("打乱之后: "+list);}
}

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

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

相关文章

SPI接口协议

SPI接口协议 SPI(Serial Peripheral Interface)是由Motorola公司定义的接口协议标准&#xff0c;串行外设接口(SPI)是微控制器和外围IC&#xff08;如传感器、 ADC、 DAC、移位寄存器、 SRAM等&#xff09;之间使用最广泛的接口之一。SPI是一种同步、全双工、主从式接口&#x…

你了解计算机网络的发展历史吗?

1.什么是计算机网络 计算机网络是指将一群具有独立功能的计算机通过通信设备以及传输媒体被互联起来的&#xff0c;在通信软件的支持下&#xff0c;实现计算机间资源共享、信息交换或协同工作的系统。计算机网络是计算机技术与通信技术紧密结合的产物&#xff0c;两者的迅速发展…

Lua调用dll(C#)的代码示例

以下是一个简单的示例&#xff0c;演示如何在Lua中调用.NET Framework的DLL。请注意&#xff0c;这个示例假设你已经安装了Lua和.NET Framework&#xff0c;并且有一个名为"MyDll.dll"的.NET DLL。 首先&#xff0c;创建一个名为"MyDll.cs"的C#文件&#…

11853 - Paintball (UVA)

题目链接如下&#xff1a; Online Judge 这道题挺可惜&#xff0c;我思路其实就差了一点点没想出来&#xff0c;还是看了uva 11853 paintball&#xff08;好题&#xff09;——yhx_yhx. live-CSDN博客 这里的文字部分才最终写出来。 dfs版本代码如下&#xff1a; #include …

C++系列十五:字符串

字符串 1 、创建和初始化C字符串2. C字符串的常用操作3. C字符串处理函数4. C字符串在实际开发中的应用 C中的字符串是由字符组成的序列。字符串常用于处理文本数据&#xff0c;例如用户输入、文件内容等。C标准库提供了一个名为std::string的类&#xff0c;用于表示和处理字符…

递归——简单粗暴的问题解决方式

相信很多人在刚接触算法时都在递归上栽过跟头&#xff08;包括我&#xff09;&#xff0c;但是在掌握了这项技能后会有种豁然开朗的感觉&#xff01; 我用我自己&#xff01; 怎么会有这么优雅而又简单粗暴的解决问题的方法&#xff01; \color{red}{怎么会有这么优雅而又简单…

爬虫之牛刀小试(三):爬取中国天气网全国天气

天气网&#xff1a; import requests from bs4 import BeautifulSoup import time from pyecharts.charts import Bar from pyecharts import options as optsurl_hb http://www.weather.com.cn/textFC/hb.shtml url_db http://www.weather.com.cn/textFC/db.shtml url_hd …

Java SE入门及基础(6)

运算符 1.常规运算符&#xff08; - * /&#xff09; 示例 /** * 运算符操作 - * / */ public class Example2 { public static void main ( String [] args ) { //变量在使用之前必须完成初始化操作。换言之就是给变量赋值。 // int a, b; // a 5; // b …

跨境电商之店群模式:Shopee店群是什么?卖家如何做好店群?

今天跟大家谈一谈越来越火爆的店群模式&#xff0c;现在大部分做跨境电商的卖家都会建立自己的店群&#xff0c;其中很多做 Shopee的卖家时常会听到一个名词“ Shopee 店群模式”&#xff0c;但很多人都不知道怎么去做&#xff0c;或者在犹豫要不要做&#xff0c;所以东哥我会从…

mac上cmake编译的库A,给其他库B使用报错ld64.lld: error

ld64.lld: error xxxx.a(xxx.c.o) has version 13.5.0, which is newer than target minimum of 10.11.0 根本原因&#xff1a; 在mac上编译库B时&#xff0c;macosx-version-min为10.11&#xff0c;即macosx sdk的最低版本 所以要求cmake编译的库A也应该指定macosx-version-…

谈谈Spring Bean

一、IoC 容器 IoC 容器是 Spring 的核心&#xff0c;Spring 通过 IoC 容器来管理对象的实例化和初始化&#xff08;这些对象就是 Spring Bean&#xff09;&#xff0c;以及对象从创建到销毁的整个生命周期。也就是管理对象和依赖&#xff0c;以及依赖的注入等等。 Spring 提供…

【Web】CTFSHOW PHP文件包含刷题记录(全)

温故知新。 目录 web78 web79 web80 web81 web82 web83 web84 web85 web86 web87 web88 web78 伪协议base64编码直接读出文件内容就行 ?filephp://filter/convert.base64-encode/resourceflag.php web79 一眼data伪协议包含php脚本 ?filedata://text/plain,<…

算法初学者指南:理解排序算法

前言 排序是计算机科学中的基本问题之一&#xff0c;也是数据处理的核心步骤。从最简单的个人项目到复杂的工业级应用&#xff0c;排序都扮演着关键角色。本文将介绍四种常见的排序算法&#xff1a;冒泡排序、插入排序、快速排序和堆排序&#xff0c;旨在帮助算法初学者理解这些…

Netty-Netty组件了解

EventLoop 和 EventLoopGroup 回想一下我们在 NIO 中是如何处理我们关心的事件的&#xff1f;在一个 while 循环中 select 出事 件&#xff0c;然后依次处理每种事件。我们可以把它称为事件循环&#xff0c;这就是 EventLoop 。 interface io.netty.channel. EventLoo…

数据结构栈、队列、链表、散列表

栈&#xff08;stack&#xff09; 栈&#xff08;stack&#xff09;是限制插入和删除只能在一个位置上进行的表&#xff0c;该位置是表的末端&#xff0c;叫做栈顶&#xff08;top&#xff09;。它是后进先出&#xff08;LIFO&#xff09;的。对栈的基本操作只有 push&#xf…

刷题第十六天-扰乱字符串

扰乱字符串 题目要求 解题思路 初步分析 给定两个字符串T和S&#xff0c;假设T是由S变换而来的 如果T和S长度不一样&#xff0c;必定不能变来如果长度一样&#xff0c;顶层字符串S能够划分 S 1 S_1 S1​和 S 2 S_2 S2​&#xff0c;同样字符串T也能够划分为 T 1 T_1 T1​和…

uniapp、vue、小程序常用的一些验证规则校验方法(例如:手机号。身份证、金额等)

例如&#xff1a; 检查是否为空数组 、是否是空 不为空false 为空true、校验密码、校验手机号格式、校验邮箱格式、校验身份证号格式、校验值长度 不少于6位数、 电话号码加密 15288889999 转化为 152****9999、身份证号码加密、验证输入重量、金额等类型 例如 0.11 2.23…

RT-Thread 线程间通信 信号

信号 信号&#xff08;又称为软中断信号&#xff09;&#xff0c;在软件层次上是对中断机制的一种模拟&#xff0c;在原理上&#xff0c;一个线程收到一个信号与处理器收到一个中断请求可以说是类似的。 信号的工作机制 信号在RT-Thread中用作异步通信&#xff0c;POSIX标准…

MES系统数据采集的几种方式

生产制造执行MES系统具有能够帮助企业实现生产数据收集与分析、生产计划管理、生产过程监控等的功能板块&#xff0c;在这里小编就不一一介绍了&#xff0c;主要讲讲它的数据采集功能板块&#xff0c;可以说&#xff0c;数据采集是该系统进行数据统计与生产管理等后续工作的基础…

SpringBoot默认配置文件

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot默认配置文件 📚个人知识库: Leo知识库,欢迎大家访问 1.前言☕…