泛型
泛型的好处
- 提高安全性(将运行期的从错误转换到编译期)
- 省去强转的麻烦
泛型基本使用
<>
中放置的必须是引用数据类型
注意事项
- 前后泛型必须一致,或者后面的泛型可以省略不写(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);
}