- 举例1:中药店,每个抽屉外面贴着标签.
- 举例2:超市购物架上很多瓶子,每个瓶子上都有标签.
- 举例3:家庭厨房中各种调料罐上面的标签.
- Java中的泛型,就类似于上述场景中的标签.
1.2 泛型的引入.
- 在Java中,我们在声明方法时,当在完成方法功能时如果有未知的数据需要参与,这些未知的数据需要在调用方法时才能确定,那么我们把这样的数据通过形参表示。在方法体中,用这个形参名来代表那个未知的数据,而调用者在调用时,对应的传入实参就可以了。受以上启发,JDK1.5设计了泛型的概念。泛型即为“类型参数”,这个类型参数在声明它的类、接口或方法中,代表未知的某种通用类型,由调用者传入的类型决定。
- 举例:
- 集合类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在JDK5.0之前只能把元素类型设计为Object,JDK5.0时Java引入了“参数化类型(Parameterized type)”的概念,允许我们在创建集合时指定集合元素的类型。比如:List<String>,这表明该List只能保存字符串类型的对象。
- 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值或参数的类型。这个类型参数将在使用时确定(即传入实际的类型参数,也称为类型实参)。泛型不能使用基本数据类型,必须是引用类型,如果没有指定泛型,默认是Object类型。不可以在静态方法和异常中使用泛型,但是静态的泛型方法是可以使用泛型的。
1.3泛型方法.
- 如果我们定义类、接口时没有使用<泛型参数>,但是某个方法形参类型不确定时,这个方法可以单独定义<泛型参数>。语法格式如下:
[访问权限] <泛型> 返回值类型 方法名([泛型标识 参数名称]) [抛出的异常]{
}
- 注意事项:
- 方法,也可以被泛型化,与其所在的类是否是泛型类没有关系。
- 泛型方法中的泛型参数在方法被调用时确定。
- 泛型方法可以根据需要,声明为static的。
- 练习:编写一个泛型方法,接收一个任意引用类型的数组,并输出该数组里面所有元素。
1.4通配符?在泛型里面的使用.
1.4.1通配符?的理解.
- 当我们声明一个变量/形参时,这个变量/形参的类型是一个泛型类或泛型接口,例如:Comparator<T>类型,但是我们仍然无法确定这个泛型类或泛型接口的类型变量<T>的具体类型,此时我们考虑使用类型通配符 ? 。
- 使用类型通配符:?,比如:List<?>,Map<?,?>。List<?>是List<String>、List<Object>等各种泛型List的父类。
1.4.2通配符的读和写.
- 写的操作:将任意元素加入其中是不安全的。
- 因为我们不知道c的元素类型,我们不能向其中添加对象。add方法有类型参数E作为集合的元素类型。我们传给add的任何参数都必须是一个未知类型的子类。因为我们不知道那是什么类型,所以我们无法传任何东西进去。唯一可以插入的元素是null,因为它是所有引用类型的默认值。
- 读的操作:读取List<?>的对象list中的元素时,永远是安全的,因为不管 list 的真实类型是什么,它包含的都是Object的子类。
1.4.3使用时注意点.
1.4.4使用案例.
1.5有限制的通配符.
- <?>:允许所有泛型的引用调用;
- 通配符指定上限:<? extends 类/接口>:使用时指定的类型必须是继承某个类,或者实现某个接口。
- 通配符指定下限:<? super 类/接口>:使用时指定的类型必须是操作的类或接口,或者是操作的类的父类或接口的父接口。
- 举例1:
- 举例2:
2.Map集合讲解内容.
2.1相关方法.
2.2迭代器讲解.
解决办法 =============> 迭代器Iterator
迭代器Iterator作用:遍历Set集合或取Set集合中的值。
Iterator方法:
boolean hasNext(); //如果仍有元素可以迭代,则返回 true。
E next(); //返回迭代的下一个元素。
操作步骤:
第一: 声明迭代器(放到一个传送带上)
Iterator<String> 迭代名 = 集合名.iterator<String>();
例:Set ar = new HashSet();
ar.add("java01");
ar.add("java02");
ar.add("java03");
Iterator<String> it = ar.iterator<String>();
第二: 循环取出
while(it.hasNext()){
String str = it.next();
System.out.println(str);
}
2.3HashMap和HashTable的区别.
- HashMap可以加null值,HashTable不可以;
- HashMap在JDK1.2出现;HashTable在JDK1.0出现;
- HashMap没有实现方法的同步;HashTable实