• 泛型机制和增强for循环


    ✅作者简介:大家好我是@每天都要敲代码,一位材料转码农的选手,希望一起努力,一起进步!
    📃个人主页:@每天都要敲代码的个人主页
    💬推荐一款模拟面试、刷题神器,从基础到大厂面试题👉点击跳转刷题网站进行注册学习

    目录

    🥅初识泛型机制

    🥅自定义泛型

    🥅增强for循环(foreach)


    🥅初识泛型机制

    ⭐️JDK5.0之后推出的新特性:泛型
    ⭐️泛型这种语法机制,只在程序编译阶段起作用,只是给编译器参考的(运行阶段泛型没用)
    ⭐️使用了泛型好处是什么?
        第一:集合中存储的元素类型统一了。
        第二:从集合中取出的元素类型是泛型指定的类型,不需要进行大量的“向下转型”!

    ⭐️泛型的缺点是什么?
        导致集合中存储的元素缺乏多样性!

    ❤️例1:泛型的用法

    对于泛型就相当于范围缩小了,对于一个集合我们可以加进去任何类型的元素;当我们调用迭代器的next()方法时,取出来的类型实际上是Object类型;我们去调用类中的方法就需要向下转型;但是如果我们指定一个泛型的范围,就不需要向下转型,存取其它范围的类型就会报错!我们来通过一个例题感受一下吧!

    1. package com.bjpowernode.javase.collection;
    2. import java.util.ArrayList;
    3. import java.util.Iterator;
    4. import java.util.List;
    5. public class GenericTest01 {
    6. public static void main(String[] args) {
    7. //1.不使用泛型
    8. List mylist = new ArrayList();
    9. //1.1.创建对象
    10. Cat c = new Cat();
    11. Bird b = new Bird();
    12. //1.2.增加对象到集合当中
    13. mylist.add(c);
    14. mylist.add(b);
    15. //1.3.获取迭代器,遍历集合调用move方法
    16. Iterator it = mylist.iterator();
    17. while(it.hasNext()){
    18. // 取出来的对象默认是Object类型;Object里面没有move()方法
    19. Object obj = it.next();
    20. // 向下转型
    21. if(obj instanceof Animal){
    22. Animal animal = (Animal)obj;
    23. animal.move();
    24. }
    25. }
    26. //2.使用泛型
    27. // 使用泛型List之后,表示List集合中只允许存储Animal类型的数据。
    28. // 用泛型来指定集合中存储的数据类型。
    29. List mylist = new ArrayList();
    30. //2.1.创建对象
    31. Cat c = new Cat();
    32. Bird b = new Bird();
    33. //2.2.增加元素
    34. mylist.add(c);
    35. mylist.add(b);
    36. //2.3.获取迭代器,遍历调用move方法
    37. // 这个表示迭代器迭代的是Animal类型。
    38. Iterator it = mylist.iterator();
    39. while(it.hasNext()){
    40. // 使用泛型,取出来的元素是Animal类型
    41. Animal animal = it.next();
    42. // 不需要向下转型,直接调用
    43. animal.move();
    44. // 但是调用子类中特有的方法还是需要向下转型,只是方便了一个环节
    45. if(animal instanceof Cat){
    46. Cat cat = (Cat)animal;
    47. cat.catchMouse();
    48. }
    49. if(animal instanceof Bird){
    50. Bird bird = (Bird)animal;
    51. bird.fly();
    52. }
    53. }
    54. }
    55. }
    56. class Animal {
    57. // 父类自带方法
    58. public void move(){
    59. System.out.println("动物在移动!");
    60. }
    61. }
    62. class Cat extends Animal {
    63. // 特有方法
    64. public void catchMouse(){
    65. System.out.println("猫抓老鼠!");
    66. }
    67. }
    68. class Bird extends Animal {
    69. // 特有方法
    70. public void fly(){
    71. System.out.println("鸟儿在飞翔!");
    72. }
    73. }

    ❤️例2:自动类型推断

    JDK8之后引入了:自动类型推断机制。(又称为钻石表达式)

    1. package com.bjpowernode.javase.collection;
    2. import java.util.ArrayList;
    3. import java.util.Iterator;
    4. import java.util.List;
    5. public class GenericTest02 {
    6. public static void main(String[] args) {
    7. // ArrayList<这里的类型会自动推断>(),前提是JDK8之后才允许。
    8. List myList = new ArrayList<>(); //自动类型推断
    9. //添加对象到集合
    10. myList.add(new Animal());
    11. myList.add(new Cat());
    12. myList.add(new Bird());
    13. //遍历
    14. Iterator iterator = myList.iterator();
    15. while(iterator.hasNext()){
    16. Animal an = iterator.next();
    17. an.move();
    18. }
    19. // 在比如:只存String类型的集合
    20. List str = new ArrayList<>(); //自动类型推断
    21. str.add("http://www.126.com");
    22. str.add("http://www.baidu.com");
    23. str.add("http://www.bjpowernode.com");
    24. //str.add(new String(123)); //错误,类型不匹配
    25. System.out.println(str.size()); //3
    26. // 遍历
    27. Iterator it2 = str.iterator();
    28. while(it2.hasNext()){
    29. // 如果没有使用泛型,还需要判断是不是一个String
    30. Object obj = it2.next();
    31. if(obj instanceof String){
    32. String ss = (String)obj;
    33. ss.substring(7);
    34. }
    35. // 使用泛型表达式,直接通过迭代器获取了String类型的数据
    36. String s = it2.next();
    37. // 直接调用String类的substring方法截取字符串。
    38. String newString = s.substring(7);
    39. System.out.println(newString);
    40. }
    41. }
    42. }

    🥅自定义泛型

    ⭐️有了上面对泛型的理解,我们能让自己定义的类也具有泛型这种特性吗?下面让我们一起来自定义泛型!
    ⭐️自定义泛型的时候,<> 尖括号中的是一个标识符,随便写。
        java源代码中经常出现的是:
        E是Element单词首字母。
        T是Type单词首字母。

    1. package com.bjpowernode.javase.collection;
    2. //自定义泛型
    3. public class GenericTest03 { //E只是标识符,随便写,一般写E或者T
    4. //提供一个方法,注意里面参数
    5. public void doSome(E e){
    6. System.out.println(e);
    7. }
    8. //程序入口
    9. public static void main(String[] args) {
    10. //1、创建对象,假如这个方法只能调用用String类型
    11. GenericTest03 gt = new GenericTest03<>(); //自动类型推断
    12. //gt.doSome(10); //类型不匹配
    13. gt.doSome("abc"); //这个方法传参只能跟String类型
    14. // 创建对象,假如这个方法只能调用用Integer类型
    15. GenericTest03 gt2 = new GenericTest03<>();
    16. //gt2.doSome("abc"); //类型不匹配
    17. gt2.doSome(100); //自动装箱
    18. //2、定义一个方法,返回的类型要与类的泛型类型保持一致
    19. MyIterator mt = new MyIterator<>();
    20. String str = mt.get(); //返回类型只能是String
    21. MyIterator mt2 = new MyIterator<>();
    22. Animal an = mt2.get(); //返回类型只能是Animal
    23. //3、定义了泛型我们不用,参数就是Object类型
    24. GenericTest03 gt3 = new GenericTest03();
    25. gt3.doSome(new Object()); //参数就是Object类型
    26. }
    27. }
    28. class MyIterator{
    29. public T get(){
    30. return null;
    31. }
    32. }

    🥅增强for循环(foreach)

    ⭐️JDK5.0之后推出了一个新特性:叫做增强for循环,或者叫做foreach

    ⭐️我们已经学习了for循环,那么什么又是增强for循环呢?我们先看语法:

    1. for(元素类型 变量名 : 数组或集合){
    2.       System.out.println(变量名);
    3. }

     ⭐️增强for循环的缺点没有下标!

    1. package com.bjpowernode.javase.collection;
    2. public class ForEachTest01 {
    3. public static void main(String[] args) {
    4. // 1.定义一个数组
    5. int[] arr = {22,3,9,5,6,8};
    6. // 2.遍历打印(普通for循环)
    7. for (int i = 0; i < arr.length; i++) {
    8. System.out.println(arr[i]);
    9. }
    10. // 3.增强for循环
    11. for(int i:arr){
    12. // foreach有一个缺点:没有下标。在需要使用下标的循环中,不建议使用增强for循环。
    13. // i就是数组中的元素(数组中的每一个元素)
    14. System.out.println(i);
    15. }
    16. }
    17. }

    ❤️例:集合使用foreach

    对于有下标的集合,我们现在就学到了三种打印方式:迭代器、利用下标、foreach

    1. package com.bjpowernode.javase.collection;
    2. import java.util.*;
    3. //集合使用foreach
    4. public class ForEachTest02 {
    5. public static void main(String[] args) {
    6. // 创建List集合
    7. List strList = new ArrayList<>();
    8. // 增加元素
    9. strList.add("hello");
    10. strList.add("world");
    11. strList.add("kitty");
    12. //1. 遍历,使用迭代器
    13. Iterator it = strList.iterator();
    14. while(it.hasNext()){
    15. System.out.print(it.next()+" ");
    16. }
    17. System.out.println();
    18. //2. 使用下标方式
    19. for (int i = 0; i < strList.size(); i++) {
    20. System.out.print(strList.get(i)+" ");
    21. }
    22. System.out.println();
    23. //3. 使用foreach
    24. // 因为泛型使用的是String类型,所以是:String s
    25. for (String s:strList) {
    26. System.out.print(s+" ");
    27. }
    28. }
    29. }

    结束语

    今天的分享就到这里啦!快快通过下方链接注册加入刷题大军吧!各种大厂面试真题在等你哦!

     💬刷题神器,从基础到大厂面试题👉点击跳转刷题网站

  • 相关阅读:
    数据仓库模式之详解 Inmon 和 Kimball
    ROS学习(25)rviz plugin插件
    【毕业设计】基于单片机的室内环境温湿度检测系统 - 物联网 嵌入式 stm32
    flink1.18.0 开始支持配置算子级别的TTL
    基于VUE+Node实现MapReduce的分布式计算系统
    DigiCert代码签名证书
    用Hugging Face Transformers,高效部署:多显卡量化感知训练并转换为ONNX格式的多标签分类模型
    一文看懂 Camera2 framework:以具体 preview 流程为例 独家原创
    软件测试定位bug方法+定位案例(详解)
    基于java学生考勤管理系统设计——计算机毕业设计
  • 原文地址:https://blog.csdn.net/m0_61933976/article/details/125771484