其余的就不多说了,一切都在代码中
package com.gc.generic; /** * JDK5 之前集合对象使用问题: * 1、向集合添加任何类型对象 * 2、从集合取出对象时,数据类型丢失,使用与类型相关方法,强制类型转换 * 存在安全隐患 * * ***************************** * * JDK5中的泛型:允许程序员使用泛型技术限制集合的处理类型 * List<String> list=new ArrayList<String>(); * 从而在取出集合中元素时,获得的是具体数据类型元素(不需要进行类型强制) * * 注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器 * 在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛型的java * 程序后,生成的class文件中将不再带有泛型信息,以此使程序运行效率不受到影响 * ,这个过程称之为“擦除” * * 泛型技术 只是编译器阶段技术,为javac命令起到安全检查作用,生成.class文件后,泛型信息将会被擦除 * * List<String> ----参数化类型 * * 泛型技术 对象List、set。Map 进行类型安全约束 * * 使用泛型的对象进行类型转换时,等号两端对象使用泛型类型必须一致 */ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.Map.Entry; import org.junit.Test; /** * * @author Android将军 * */ public class GenericTest { @Test public void demo5() { //使用类型安全的Map---因为map是一个键值对结构,指定两个类型泛型 Map<String,String> map=new HashMap<String, String>(); map.put("aaa", "111"); map.put("bbb", "222"); //因为使用了泛型,所以key和value类型都必须为String //取出map元素-----两种 //(1)遍历Map 通过keySet(2)遍历Map通过EntrySet取出每一个键值对 Map.Entry定义键值对 通过Entry的getKey和getValue来进行遍历 //第一种通过Map的keySet进行遍历 Set<String> keys=map.keySet(); for (String key : keys) { System.out.println(key+":"+map.get(key)); } System.out.println("------------"); //第二种 通过map的entrySet---获得每一个键值对 Set<Map.Entry<String, String>> entrySet=map.entrySet();//每一个元素就是一个键值对 for (Entry<String, String> entry : entrySet) { //通过entry的getKey和getValue来获得每一个键和值 System.out.println(entry.getKey()+":"+entry.getValue()); } } @Test public void demo4() { //使用类型安全的Set Set<String> set=new TreeSet<String>(); set.add("asd"); set.add("fdf"); set.add("bxc"); //因为使用泛型只能添加String类型元素 //取出Set元素---两种 因为Set是无序的,所以比List少一种遍历方法 //第一种继承Collection 所以使用Iterator遍历 Iterator<String> iterator=set.iterator(); while(iterator.hasNext()) { String s=iterator.next(); System.out.println(s); } System.out.println("-----------------"); //第二种 JDK引入foreach循环结构,通过foreach结构遍历set for (String s : set) { System.out.println(s); } } @Test public void demo3() { //使用类型安全List List<String> list=new LinkedList<String>(); list.add("aaaa"); list.add("bbbb"); list.add("cccc"); //因为使用泛型,只能将list添加String类型元素 //遍历List---三种 //第一种 因为list是有序的(存入顺序和取出顺序一样)通过size和get方法进行遍历 for(int i=0;i<list.size();i++) { String s=list.get(i); System.out.println(s); } System.out.println("------------------------"); //第二种 因为List继承了Collection接口,通过Collection的iterator进行遍历 Iterator<String> iterator=list.iterator(); // 遍历iterator 通过迭代器hasNext和next方法进行遍历 while(iterator.hasNext()) { String s=iterator.next(); System.out.println(s); } System.out.println("------------------------"); //第三种 JDK引入foreach循环结构,通过foreach结构遍历list for (String s: list) { System.out.println(s); } System.out.println("------------------------"); } @Test public void demo2() { //应用泛型集合 //这个list中只能存放String类型的数据 List<String> list=new ArrayList<String>(); list.add("abc"); list.add("def"); //操作集合中对象,遍历集合 将数据取出来 通过size()方法和get(index)方法遍历集合 for(int i=0;i<list.size();i++) { String s=list.get(i); System.out.println(s.toUpperCase()); } } @Test public void demo1() { //JDK5之前集合对象 List list=new ArrayList(); //因为没有泛型类型检查,添加对象可以是任意类型 list.add("abc"); list.add(123); //操作集合中对象,遍历集合 将数据取出来 通过size()方法和get(index)方法遍历集合 for(int i=0;i<list.size();i++) { //取出对象时,数据类型丢失了 Object o=list.get(i); //操作String方法----强制将数据转换相应类型 String s=(String)o; System.out.println(s.toUpperCase()); } } }
恶补java(十)---泛型与集合的再学习,布布扣,bubuko.com
原文地址:http://blog.csdn.net/android_jiangjun/article/details/26622775