其余的就不多说了,一切都在代码中
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());
}
}
}
转载请注明出处: http://blog.csdn.net/android_jiangjun/article/details/26622775