1.集合接口或集合类在jdk5时都修改为带泛型的结构。
2.在实例化集合类时,可以指明具体的泛型类型
3.指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法、构造器,属性等)使用到类的泛型的位置,都指定为实例化的泛型类型。
4.注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类来替换。
5.如果实例化时,没有指明泛型的类型。默认类型为java.Lang.object类型。
HashMap<Integer,String> map1 = new HashMap<>();
map1.put(1,"a");
map1.put(2,"b");
map1.put(3,"c");
System.out.println(map1);
HashMap<Integer,String> map2 = new HashMap<>();
map2.put(1,"x");
map2.put(2,"y");
map2.put(3,"z");
HashSet<Object> obj = new HashSet<>();
obj.add(map1);
obj.add(map2);
ArrayList<Object> o = new ArrayList<>();
o.add(obj);
System.out.println(obj);
System.out.println(o);
System.out.println("------------");
//泛型的嵌套
Set<Map.Entry<Integer, String>> set1 = map1.entrySet();
Set<Map.Entry<Integer, String>> set2 = map2.entrySet();
ArrayList<Object> a = new ArrayList<>();
a.add(set1);
a.add(set2);
//遍历
Iterator<Object> iterator = a.iterator();
while (iterator.hasNext()){
Object next = iterator.next();
System.out.println(next);
// Integer key = next.getKey();
// String value = next.getValue();
// System.out.println(key+"--"+value);
}
System.out.println("-------------------");
Set<Integer> integers = map1.keySet();
//增强for
for (Integer s:integers){
String s1 = map1.get(s);
System.out.println(s+" "+s1);
}
/*创建集合对象,使用泛型
好处:
1 .避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型
2.把运行期异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候会报错)
弊端:
泛型是什么类型,只能存储什么类型的数据
*/
private static void show2() {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// list.add(123);//报错不能往里放除了string以外的类型
//增强for
for (String s:list){
System.out.println(s);
}
System.out.println("--------------------");
//使用迭代器
Iterator<String> i = list.iterator();
while (i.hasNext()){
String s = i.next();
System.out.println(s+" cd:"+s.length());
}
}
/*创建集合对象,不使用泛型
好处:
集合不使用泛型,默认的类型就是object类型,可以存储任意类型的数据
弊端:
不安全,会引发异常
*/
private static void show1() {
ArrayList list = new ArrayList();
list.add("abc");
list.add(123);
//使用迭代器遍历集合1.创建迭代器2.使用hasNext和next进行遍历
Iterator i = list.iterator();//1
while (i.hasNext()){//2
Object o = i.next();//存入的是object,取出的也是object
System.out.println(o);
//想要使用string类特有的方法, Length获取字符串的长度;不能使用多态 object obj = "abc";
// 需要向下转型
//会抛出ClassCastException类型转换异常,不能把Integer类型转换为string类型
String s=(String) o;
System.out.println(s.length());
}
}