当前位置: 首页 > news >正文

[1-01-01].第50节:泛型 - 泛型的使用

Java基础学习大纲


一、通配符的使用:

1.1.通配符的几种形式:

  • 泛型是在限定数据类型,当在集合或者其他地方使用到泛型后,那么这时一旦明确泛型的数据类型,那么在使用的时候只能给其传递和数据类型匹配的类型,否则就会报错
  • 有的情况下,在定义方法时,根本无法确定集合中存储元素的类型是什么。为了解决这个“无法确定集合中存储元素类型”问题,那么Java语言就提供了泛型的通配符
    • 无限定通配符:<?>,此处“?”可以为任意引用数据类型
    • 上限通配符:<? extends Number>,此处“?”必须为Number及其子类
    • 下限通配符;<? super Number>,此处“?”必须为Number及其父类

二、泛型嵌套举例:

public static void main(String[] args) {HashMap<String, ArrayList<Citizen>> map= new HashMap<String, ArrayList<Citizen>>();ArrayList<Citizen> list= new ArrayList<Citizen>();list.add(new Citizen("刘恺威"));list.add(new Citizen("杨幂"));list.add(new Citizen("小糯米"));map.put("刘恺威", list);Set<Entry<String, ArrayList<Citizen>>> entrySet= map.entrySet();Iterator<Entry<String, ArrayList<Citizen>>> iterator= entrySet.iterator();while(iterator.hasNext()) {Entry<String, ArrayList<Citizen>> entry= iterator.next();String key= entry.getKey();ArrayList<Citizen> value= entry.getValue();System.out.println("户主:"+ key);System.out.println("家庭成员:"+ value);}}

三、在集合中使用泛型:

案例1:泛型在List中的使用

@Test
public void test1(){//举例:将学生成绩保存在ArrayList中//标准写法://ArrayList<Integer> list = new ArrayList<Integer>();//jdk7的新特性:类型推断ArrayList<Integer> list = new ArrayList<>();list.add(56); //自动装箱list.add(76);list.add(88);list.add(89);//当添加非Integer类型数据时,编译不通过//list.add("Tom");//编译报错Iterator<Integer> iterator = list.iterator();while(iterator.hasNext()){//不需要强转,直接可以获取添加时的元素的数据类型Integer score = iterator.next();System.out.println(score);}
}

案例2:泛型在HashMap中的使用

@Test
public void test2(){HashMap<String,Integer> map = new HashMap<>();map.put("Tom",67);map.put("Jim",56);map.put("Rose",88);//编译不通过//map.put(67,"Jack");//遍历key集Set<String> keySet = map.keySet();for(String str:keySet){System.out.println(str);}//遍历value集Collection<Integer> values = map.values();Iterator<Integer> iterator = values.iterator();while(iterator.hasNext()){Integer value = iterator.next();System.out.println(value);}//遍历entry集Set<Map.Entry<String, Integer>> entrySet = map.entrySet();Iterator<Map.Entry<String, Integer>> iterator1 = entrySet.iterator();while(iterator1.hasNext()){Map.Entry<String, Integer> entry = iterator1.next();String key = entry.getKey();Integer value = entry.getValue();System.out.println(key + ":" + value);}}
  • Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
    • 核心作用:获取map中所有键值对(Entry对象)的集合视图
    • Map.Entry:是Map内部定义的接口,表示一个键值对实体
    • 集合视图:entrySet()返回的不是新集合,而是直接关联map数据的视图,修改会影响原map
  • Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
    • 获取entrySet集合的迭代器对象,用于遍历集合中的元素
    • Entry的作用:将键和值捆绑成一个对象,便于同时操作两者

案例3:

/*** ClassName: Exer02* Description:** @Author* @Create 17:23* @Version 1.0*/
public class Exer02 {public static void main(String[] args) {//(1)创建一个ArrayList集合对象,并指定泛型为<Integer>ArrayList<Integer> list = new ArrayList<>();//(2)添加5个[0,100)以内的随机整数到集合中for (int i = 0; i < 5; i++) {int random = (int)(Math.random() * (99 - 0 + 1));list.add(random);}//(3)使用foreach遍历输出5个整数for(Integer value : list){System.out.println(value);}//(4)使用集合的removeIf方法删除偶数,为Predicate接口指定泛型<Ineteger>list.removeIf(new Predicate<Integer>(){@Overridepublic boolean test(Integer value) {return value % 2 == 0;}});System.out.println();//(5)再使用Iterator迭代器输出剩下的元素,为Iterator接口指定泛型<Integer>Iterator<Integer> iterator = list.iterator();while(iterator.hasNext()){Integer value = iterator.next();System.out.println(value);}}
}

案例4:在比较器中使用泛型:

a.需求说明:

  • 1.定义一个Employee类:
    • 该类包含:private成员变量name,age,birthday
    • 其中 birthday 为 MyDate 类的对象,并为每一个属性定义 getter, setter 方法
    • 并重写 toString 方法输出 name, age, birthday
  • 2.MyDate类包含:
    • private成员变量year,month,day;
    • 并为每一个属性定义 getter, setter 方法;
  • 3.创建该类的 5 个对象,并把这些对象放入 TreeSet 集合中(TreeSet 需使用泛型来定义)
  • 4.分别按以下两种方式对集合中的元素进行排序,并遍历输出
    • 需求1:使Employee 实现 Comparable 接口,并按 name 排序
    • 需求2:创建 TreeSet 时传入 Comparator对象,按生日日期的先后排序。

b.编码实现:

  • 需求1定义Employee类:
package com.jianqun01.use.exer1;/*** ClassName: Employee* Description:*      定义一个Employee类。*          该类包含:private成员变量name,age,birthday,其中 birthday 为 MyDate 类的对象;*          并为每一个属性定义 getter, setter 方法;*          并重写 toString 方法输出 name, age, birthday* @Author* @Create 17:03* @Version 1.0*/
public class Employee implements Comparable<Employee>{private String name;private int age;private MyDate birthday;public Employee() {}public Employee(String name, int age, MyDate birthday) {this.name = name;this.age = age;this.birthday = birthday;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public MyDate getBirthday() {return birthday;}public void setBirthday(MyDate birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", age=" + age +", birthday=[" + birthday +"]}";}//按照name从低到高排序@Overridepublic int compareTo(Employee o) {return this.name.compareTo(o.name);}
}
  • 需求1测试类:
//需求1:使Employee 实现 Comparable 接口,并按 name 排序@Testpublic void test1(){TreeSet<Employee> set = new TreeSet<>();Employee e1 = new Employee("HanMeimei",18,new MyDate(1998,12,21));Employee e2 = new Employee("LiLei",20,new MyDate(1996,11,21));Employee e3 = new Employee("LiHua",21,new MyDate(2000,9,12));Employee e4 = new Employee("ZhangLei",19,new MyDate(1997,5,31));Employee e5 = new Employee("ZhangYi",23,new MyDate(2001,11,2));//往集合中添加元素的时候,会调用compareTo方法,按照名称进行排序set.add(e1);set.add(e2);set.add(e3);set.add(e4);set.add(e5);//遍历Iterator<Employee> iterator = set.iterator();while(iterator.hasNext()){Employee employee = iterator.next();System.out.println(employee);}}
  • 需求2:定义MyDate类:
/*** ClassName: MyDate* Description:* MyDate类包含:* private成员变量year,month,day;并为每一个属性定义 getter, setter 方法;** @Author* @Create 17:04* @Version 1.0*/
public class MyDate implements Comparable<MyDate>{private int year;private int month;private int day;public MyDate() {}public MyDate(int year, int month, int day) {this.year = year;this.month = month;this.day = day;}public int getYear() {return year;}public void setYear(int year) {this.year = year;}public int getMonth() {return month;}public void setMonth(int month) {this.month = month;}public int getDay() {return day;}public void setDay(int day) {this.day = day;}@Overridepublic String toString() {return year + "年" + month + "月" + day + "日";}//按照生日从小到大排列@Overridepublic int compareTo(MyDate o) {int yearDistince = this.getYear() - o.getYear();if(yearDistince != 0){return yearDistince;}int monthDistince = this.getMonth() - o.getMonth();if(monthDistince != 0){return monthDistince;}return this.getDay() - o.getDay();}
}
  • 需求2测试:
    //需求2:创建 TreeSet 时传入 Comparator对象,按生日日期的先后排序。@Testpublic void test2(){Comparator<Employee> comparator = new Comparator<Employee>(){@Overridepublic int compare(Employee o1, Employee o2) {return o1.getBirthday().compareTo(o2.getBirthday());}};TreeSet<Employee> set = new TreeSet<>(comparator);Employee e1 = new Employee("HanMeimei",18,new MyDate(1998,12,21));Employee e2 = new Employee("LiLei",20,new MyDate(1996,11,21));Employee e3 = new Employee("LiHua",21,new MyDate(2000,9,12));Employee e4 = new Employee("ZhangLei",19,new MyDate(1996,5,31));Employee e5 = new Employee("ZhangYi",23,new MyDate(2000,9,2));set.add(e1);set.add(e2);set.add(e3);set.add(e4);set.add(e5);//遍历Iterator<Employee> iterator = set.iterator();while(iterator.hasNext()){Employee employee = iterator.next();System.out.println(employee);}}


http://www.lryc.cn/news/582587.html

相关文章:

  • 深入了解linux系统—— System V之消息队列和信号量
  • 自动驾驶的“安全基石”:NVIDIA如何用技术守护未来出行
  • 冷链物流配送中心选址与路径优化模型研究
  • 跨越十年的C++演进:C++23新特性全解析
  • 3423. 循环数组中相邻元素的最大差值 — day97
  • 【PTA数据结构 | C语言版】在顺序表 list 的第 i 个位置上插入元素 x
  • JVM 基础 - 类字节码详解
  • Spring自动装配(xml)
  • Vue、Laravel 项目初始化命令对比 / curl 命令/ CORS 机制总结与案例
  • AlphaEvolve:谷歌的算法进化引擎 | 从数学证明到芯片设计的AI自主发现新纪元
  • UI前端大数据处理挑战与对策:大数据量下的实时数据分析技术
  • CD46.【C++ Dev】list的模拟实现(1)
  • 人体坐姿检测系统开发实战(YOLOv8+PyTorch+可视化)
  • WHIP(WebRTC HTTP Ingestion Protocol)详解
  • 装修水电改造需要注意什么?水电改造有哪些注意事项?
  • 力扣-287.寻找重复数
  • 容器技术入门与Docker环境部署
  • 【佳易王娱乐场儿童乐园会员多项目管理系统软件】从 “手工记账” 到 “智能管理”:儿童乐园会员系统的转型价值
  • Docker实用命令
  • 脚本检测 自启 关闭 重启等 tomcat 可修改成其他程序 结合crontab 每天凌晨1点执行
  • LocalStorage和SessionStorage的区别和应用
  • UI前端与数字孪生结合实践案例:智慧零售的库存管理优化系统
  • 车载HMI革命:从物理按键到智能表面的交互逻辑重构
  • 高版本的MacOS如何降级?
  • 250708-Debian系统安装Edge浏览器并配置最小中文输入法
  • KTM5910,24bit 绝对角度磁性编码器,在轴应用,- 内部集成超高性能双 16bit 2M SAR ADC
  • VMware克隆虚拟机,模板机已提前设置了固定IP,克隆机需要修改的事项
  • ECS由浅入深第三节:进阶?System 的行为与复杂交互模式
  • 【openGLES】安卓端EGL的使用
  • GitOps实践指南:GitLab CI/CD + ArgoCD 实现 Kubernetes 自动化部署