• 泛型


    泛型

    泛型的好处
    • 提高安全性(将运行期的从错误转换到编译期)
    • 省去强转的麻烦
    泛型基本使用
    • <>中放置的必须是引用数据类型
    注意事项
    • 前后泛型必须一致,或者后面的泛型可以省略不写(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);
    }
    
  • 相关阅读:
    Android Studio精彩案例(四)《DrawerLayout使用详解仿网易新闻客户端侧边栏 》
    Android简易实战教程--第四十七话《使用OKhttp回调方式获取网络信息》
    Android Studio突然不显示logcat日志
    Xcode 调试技巧 --常用命令和断点
    (译)Objective-C 类属性
    Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》
    Android Studio 中设置代码块自动补齐
    RunLoop总结:RunLoop的应用场景(三)
    Android Studio精彩案例(三)《模仿微信ViewPage+Fragment实现方式二》
    .net学习视屏
  • 原文地址:https://www.cnblogs.com/mephisto03/p/9473966.html
Copyright © 2020-2023  润新知