泛型集合
泛型集合不是指某种集合,而是指在集合的基础上增加了泛型。
泛型集合中,一旦传入了泛型参数“类A”;则只能向这个集合中添加类A或类A子类的对象,不能添加其他对象了。
从泛型集合中获取对象时,对象的类型是类A,而不是Object类型的对象了。
泛型List
例如:上面说到的两种List集合,都可以加入泛型
package collection.list.arrayList;
import java.util.ArrayList;
import java.util.List;
/**
* 演示泛型集合的使用
* @author 学霸联盟 - 赵灿
*/
public class GenericListDemo {
public static void main(String[] args) {
//创建对象
Father f = new Father();
Son s = new Son();
/******************* 未使用泛型的集合 ********************/
//父类List的引用指向子类ArrayList的对象,多态的应用
List list = new ArrayList();
//将上面创建的两个对象加入到集合中
//任何对象都可加入
list.add(f);
list.add(s);
//想要使用对象中特有的成员时,必须强制类型转换
Father f1 = (Father) list.get(0);
f1.work();
Son s1 = (Son) list.get(1);
s1.play();
/******************* 使用了泛型的集合 ********************/
System.out.println("-----------------------------");
/*
* 创建泛型集合对象,可以使用ArrayList,也可以使用LinkedList
* 注意:
* 1、泛型只能使用引用类型,不能使用基本数据类型
* 例如:List<int>是错误的
* 2、List<Father>和ArrayList<Father>存在继承关系
* 但是ArrayList<Father>和ArrayList<Son>是完全不同的两种类型
* 也不存在继承关系
* 例如:List<Father> fatherList = new ArrayList<Son>();
* ArrayList<Father> fatherList = new ArrayList<Son>();
* 都是错误的
*/
List<Father> fatherList = new ArrayList<Father>();
List<Son> sonList = new ArrayList<Son>();
//使用泛型后,该fatherList集合只能存储Father类型
//除了Father以外的任何类型都不能添加到该集合中
fatherList.add(f);
//使用泛型后,该sonList集合只能存储Son类型
sonList.add(s);
//获取元素时无需强制类型转换
Father f2 = fatherList.get(0);
f2.work();
Son s2 = sonList.get(0);
s2.play();
}
}
class Father{
public void work(){
System.out.println("工作");
}
}
class Son extends Father{
public void play(){
System.out.println("玩耍");
}
}
运行结果:
工作
玩耍
-----------------------------
工作
玩耍
泛型Set
package collection.set.hashSet;
import java.util.HashSet;
import java.util.Set;
/**
* 演示泛型Set集合
*
* @author 学霸联盟 - 赵灿
*/
public class GenericSetDemo {
public static void main(String[] args) {
//创建HashSet对象
Set<String> set = new HashSet<String>();
//泛型规定只能加入String类型,所以此处不能加入其他类型的元素
set.add("张三");
set.add("李四");
set.add("张三");
//使用了泛型String类型,所以此处泛型集合set中取出的就是String类型
for(String str : set){
System.out.println(str);
}
}
}
运行结果:
李四
张三
泛型Map
package map.hashMap;
import java.util.HashMap;
import java.util.Map;
/**
* 演示加入泛型后的Map集合
*
* 当使用多个泛型,占位符中间使用英文格式的逗号隔开
* 例如:Map<K,V>
* 使用时也是按照位置顺序对应传入
* 例如:Map<String,Integer>
* 其Map类中所有的K都会被替换成String
* 所有的V都会被替换成Integer
* 当想集合中存储值是也要对应数据类型
*
* @author 学霸联盟 - 赵灿
*/
public class GenericMapDemo {
public static void main(String[] args) {
//创建泛型Map
Map<String,Integer> map = new HashMap<String,Integer>();
/*
* 由于创建对象map时使用了泛型
* 所以添加值时只能添加对应的数据类型值
*/
map.put("张三", 18);
map.put("李四", 26);
map.put("王五", 23);
/*
* 根据key的值获取对应value的值
* 使用泛型后无需强制类型转换
*/
int age = map.get("张三");
System.out.println("张三的年龄是:" + age);
}
}
运行结果:张三的年龄是:18
泛型集合总结
语法格式:集合类名A<类名B>
作用:集合A中只能存储类型B的数据
声明并创建对象:List<String> list = new ArrayList<String>()
注意:1、集合<父类> 和 集合<子类> 是不兼容的两种类型
2、集合<父类> 的对象中,可以存储子类对象;反之,则不能通过
3、加入泛型集合中的元素类型,只能是泛型规定的类型或其子类
4、从泛型集合中取出元素的类型,就是泛型规定的类型