泛型

泛型
泛型的好处
  • 提高安全性(将运行期的从错误转换到编译期)
  • 省去强转的麻烦
泛型基本使用
  • <>中放置的必须是引用数据类型
注意事项
  • 前后泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)
import java.util.ArrayList;
import java.util.Iterator;
import com.mephisto.bean.Student;

public class Demo6 {

    public static void main(String[] args) {
        // 菱形泛型
        // 泛型一般不定义成Object, 因为Object是顶层类
        ArrayList<Student> list = new ArrayList<>();
//      list.add(100);
//      list.add(true);
        list.add(new Student("张三", 18));
        list.add(new Student("李四", 18));
        Iterator<Student> iterator = list.iterator();

        while (iterator.hasNext()) {
            // 向下转型
            // next 方法只能调用一次, 若调用多次,指针也会向下多次
            // Student student = (Student) iterator.next();
            Student student = iterator.next();
            System.out.println(student.getName() + " " + student.getAge() );
        }
    }
}
泛型类
  • 把泛型定义在类上
格式
public class 类名 <泛型类型1,...>
注意事项

泛型类型必须是引用数据类型

泛型方法
  • 把泛型定义在方法上
格式
public 返回类型 方法名(泛型类型 变量名)  // 方法泛型与类的泛型一致
public <泛型类型> 返回类型 方法名(泛型类型 变量名) //方法泛型与类的泛型不一致
注意事项

静态方法必须声明自己的泛型, 静态方法先于对象创建存在

public static <泛型类型> void print(泛型类型  变量名)
泛型接口
  • 把泛型定义在接口上
格式
public interface 接口名<泛型类型>
泛型实例
public class Demo4 {

    public static void main(String[] args) {    
        Demo.method("Mephisto");
    }
}

interface Inter<T>{
    public void show(T t);
}


// 推荐使用
class Demo implements Inter<String>{

    @Override
    public void show(String t) {
        System.out.println(t);
    }
    public static void method(String t) {
        System.out.println(t);
    }
    
}
/*
 * 没有必要在实现接口的时候没必要给类加泛型
 class Demo<T> implements Inter<String>{

    @Override
    public void show(String t) {
        System.out.println(t);
    }
    public static void method(String t) {
        System.out.println(t);
    }
    
    }
 */
泛型通配符

任意类型, 没有明确,就是Object类或其他Java类

  • ? extends E
    • 向下限定, E及其子类
  • ? super E
    • 向上限定, E及其父类
增强for循环(foreach)(Jdk1.5)

简化数组和Collection集合的遍历, 底层依赖迭代器(Iterator)

格式
for(元素数据类型 变量 : 数组或Collection集合){
    使用变量即可,该变量就是元素
}
eclipse快捷键
foreach
三种迭代是否可以删除
  • 普通for循环,可以删除,但是索引会漏删 所以要进行 索引--
  • 迭代器,可以删除但是不需使用迭代器自身方法remove,否则会出现并发修改异常
  • 增强for循环不能删除
public static void main(String[] args) {

        // demo1();
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("e");
        list.add("e");
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("a");
        list.add("d");
        list.add("d");
        list.add("a");
        list.add("f");
        list.add("f");
        list.add("a");
        
        // 普通for循环删除
        for (int i = 0; i < list.size(); i++) {
            if("b".equals(list.get(i))) {
                // 通过索引删除元素
//              list.remove(i);    // 会漏删
                list.remove(i--);
            }
        }
        System.out.println(list);
        
        // 2. Iterator迭代器删除
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()) {
            if("e".equals(iterator.next())) {
                // list.remove("b");   不能使用集合的方法删除, 会出现并发修改异常
                iterator.remove();
            }
        }
        System.out.println(list);
        
        for(Iterator<String> iterator2 = list.iterator(); iterator2.hasNext();) {
            if("f".equals(iterator2.next())) {
                // list.remove("b");   不能使用集合的方法删除, 会出现并发修改异常
                iterator2.remove();
            }
        }
        System.out.println(list);
        
        // 增强for循环, 增强for只能遍历不能删除
        /*
        for (String string : list) {
            if("d".equals(string)) {
                list.remove("d");
            }
        }
        */
        System.out.println(list);
}

转载于:https://www.cnblogs.com/mephisto03/p/9473966.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值