大内高手社区

标题: java泛型 & 增强for循环foreach [打印本页]

作者: ABCDEFG    时间: 2021-11-16 17:58
标题: java泛型 & 增强for循环foreach
  一、泛型

  1.为什么引入泛型?

[Java] 纯文本查看 复制代码
package com.company01.generic;
/*
    关于JDK5.0新特性:泛型(编译器概念)

    1、为什么引入泛型?
        1.可以统一集合中的数据类型
        2.减少强制类型转换

    2、泛型语法如何实现?

    3、泛型的优点与缺点?
        优点:统一类型,减少强制类型转换
        缺点:只能存储一种类型

    以下程序没有使用泛型,缺点?
        如果集合不使用泛型,则集合中的元素类型不统一。
        在遍历集合的时候,只能拿出来Object类型,需要大量的强制类型转换,太麻烦。
*/
import java.util.*;

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

        // 创建一个集合,存储A、B、C
        Set s = new HashSet();

        // 创建对象
        A a1 = new A();
        B b1 = new B();
        C c1 = new C();

        // 添加元素
        s.add(a1);
        s.add(b1);
        s.add(c1);

        // 需求:遍历集合。如果是A类型,调用m1方法;如果是B类型,调用m2方法;如果是C类型,调用m3方法
        Iterator it = s.iterator();
        while(it.hasNext()){
            Object o = it.next();
            if(o instanceof A){
                A a = (A)o;
                a.m1();
            }else if(o instanceof B){
                B b = (B)o;
                b.m2();
            }else if(o instanceof  C){
                C c = (C)o;
                c.m3();
            }
        }


    }
}

class A{
    public void m1(){
        System.out.println("A's m1()...");
    }
}

class B{
    public void m2(){
        System.out.println("B's m2()...");
    }
}

class C{
    public void m3(){
        System.out.println("C's m3()...");
    }
}



  2.泛型语法

  2.1 List使用泛型

[Java] 纯文本查看 复制代码
package com.company01.generic;
/*
    泛型语法如何实现?

    泛型是一个编译阶段的语法

    在编译阶段统一集合中的类型
*/
import java.util.*;
public class GenericTest02 {
    public static void main(String[] args) {

        // 创建一个List集合,只能存储字符串类型
        List<String> strs = new ArrayList<String>();

        // 添加元素
        //strs.add(1);  Error

        strs.add("Jack");
        strs.add("Tom");
        strs.add("Tony");
        strs.add("Smith");

        // 遍历
        Iterator<String> it = strs.iterator();

        while(it.hasNext()){
            String s = it.next();
            System.out.println(s);
        }
    }
}



  2.2 Map使用泛型

[Java] 纯文本查看 复制代码
package com.company01.generic;
/*
    Map使用泛型
*/
import java.util.*;
public class GenericTest03 {
    public static void main(String[] args) {

        Map<String, Integer> maps = new HashMap<String, Integer>();

        maps.put("西瓜", 10);
        maps.put("苹果", 5);
        maps.put("桃子", 4);
        maps.put("葡萄", 8);

        Set<String> keys = maps.keySet();
        Iterator it = keys.iterator();
        while(it.hasNext()){
            String k = (String) it.next();   // 这里it.next()返回的是Object类,还是需要强制转换
            Integer v = maps.get(k);
            System.out.println(k + "-->" + v);
        }
    }
}



  2.3 SortedSet集合使用泛型

[Java] 纯文本查看 复制代码
package com.company01.generic;
/*
    SortedSet集合使用泛型
*/
import java.util.*;
public class GenericTest04 {
    public static void main(String[] args) {
        SortedSet<Manager> ss = new TreeSet<Manager>();

        // 添加
        Manager m1 = new Manager(1000);
        Manager m2 = new Manager(1500);
        Manager m3 = new Manager(900);
        Manager m4 = new Manager(2000);

        ss.add(m1);
        ss.add(m2);
        ss.add(m3);
        ss.add(m4);

        // 遍历
        Iterator it = ss.iterator();
        while(it.hasNext()){
            Manager m = (Manager) it.next(); // 这里it.next()返回的是Object类
            System.out.println(m);
        }
    }
}

class Manager implements Comparable<Manager>{
    double sal;

    Manager(double sal){
        this.sal = sal;
    }

    public String toString(){
        return "Manager[sal:" + sal +"]";
    }

    public int compareTo(Manager m){
        double sal1 = this.sal;
        double sal2 = m.sal;

        if(sal1 < sal2){
            return -1;
        }else if(sal1 > sal2){
            return 1;
        }else{
            return 0;
        }
    }
}



  3. 自定义泛型

[Java] 纯文本查看 复制代码
package com.company01.generic;
/*
    自定义泛型
*/
public class GenericTest05 {
    public static void main(String[] args) {

        MyClass<String> mc = new MyClass<String>();

        // mc.m1(100);  // 传入int类型数据,编译失败
        mc.m1("100");
    }
}

// 自定义泛型
// 这里面的字母T是无所谓的,一般是 T 或者 E , T:type ; E:element
class MyClass<T>{
    public void m1(T t){
        System.out.println(t);
    }
}



  二、增强for循环 foreach

[Java] 纯文本查看 复制代码
package com.company01.generic;
/*
    关于增强for循环

    语法:
        for(类型 变量 : 数组名/集合名){}

    集合要想使用增强for循环这样语法,集合需要使用泛型。
    如果集合不使用泛型,该集合在用增强for循环的时候应该用Object类型定义
*/
import java.util.*;
public class ForeachTest01 {
    public static void main(String[] args) {

        int[] a = {1,2,3,4,5,6,76};

        //遍历
        for(int i=0; i<a.length; i++){
            System.out.println(a);
        }
        System.out.println("=================");

        // foreach
        for(int e : a){
            System.out.println(e);
        }
        System.out.println("================");

        // 集合
        Set<String> strs = new HashSet<String>();

        strs.add("张三");
        strs.add("李四");
        strs.add("王五");
        strs.add("赵六");

        // 遍历
        for(String name : strs){
            System.out.println(name);
        }
        System.out.println("================");

        // 集合不使用泛型
        List l = new ArrayList();
        l.add(1);
        l.add(2);
        l.add(3);
        l.add(4);

        // 如果集合不使用泛型,该集合在用增强for循环的时候应该用Object类型定义。
        for(Object o : l){
        //for(Integer o : l){   // 【注意】即使这里写的是Integer也仍然会报错,尽管集合里面都是整型
                System.out.println(o);
        }
    }
}




[Java] 纯文本查看 复制代码
package com.company01.generic;
import java.util.*;

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

        Map<String, Integer> maps = new HashMap<String, Integer>();

        maps.put("西瓜", 10);
        maps.put("苹果", 5);
        maps.put("桃子", 4);
        maps.put("葡萄", 8);

        Set<String> keys = maps.keySet();

        for (String k : keys) {
            Integer v = maps.get(k);
            System.out.println(k + "-->" + v);
        }
    }
}



  
【免责声明】本文部分系转载,原文来源csdn,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与联系我们,我们会予以更改或删除相关文章,以保证您的权益!





欢迎光临 大内高手社区 (https://bbs.tedu.cn/) Powered by Discuz! X3.4