首页 > 代码库 > 恶补java(十)---泛型与集合的再学习

恶补java(十)---泛型与集合的再学习

其余的就不多说了,一切都在代码中

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