黑马程序员——泛型,Map集合

------- android培训java培训、期待与您交流! ----------


泛型
JDK1.5后出现的新特性,用于解决安全问题,是一个安全机制。在集合中常见,见到<>就要定义泛型,<>就是用来接收类型的。
格式:通过<>来定义要操作的引用数据类型。
如:ArrayList<String> al=new ArrayList<String>();


好处:1,将运行时出现的问题ClassCastException转移到编译时期,方便程序员解决问题,让运行事情问题减少,安全。
      2,避免了强制转换的麻烦。
定义泛型的情况:当类中要操作的引用数据类型不确定时。泛型可以定义在类上,也可以定义在方法上。
早期定义Object来完成扩展。现在定义泛型来完成扩展。

演示:

class GenericTest
{
	public static void main(String[] args)
	{
		//ArrayList a1=new ArrayList();
		ArrayList<String> a1=new ArrayList<String>();//加泛型后,没有了编译时出现的安全提示


		a1.add("abc001");
		a1.add("abc021");
		a1.add("abc301");


		//a1.add(4);//如果不加泛型,异常不会出现在编译时期


		Iterator<String> it=a1.iterator();
		while(it.hasNext())
		{
			String s =it.next();//加泛型后避免了强制转换
			System.out.println(s+":"s.length());
		}
	}
}


泛型限定
对于一个范围内的一类事物,可以通过泛型限定的方式定义,有两种方式:
1,? extends E:可接收E类型或E类型的子类型;称之为上限。
    如:ArrayList<? extends Number>x = new ArrayList<Integer>();
2,? super E:可接收E类型或E类型的父类型;称之为下限。


Map集合

特点:该集合存储键值对,而且保证键的唯一性。一个映射不能包含重复的键,每个键最多只能映射到一个值。

Map集合共性方法:
1、添加
        put(K key,V value);//添加元素。
        voidputAll(Map <? extends K,? extends V> m);//添加一个集合
2、删除
        clear();//清空
        Vremove(Object key);//删除指定键值对
3、判断
        containsKey(Objectkey);:判断键是否存在
        containsValue(Objectvalue):判断值是否存在
        isEmpty();:判断是否为空
4、获取
        Vget(Object key);:通过键获取对应的值
        size();:获取集合的长度
        value();:获取Map集合中所以得值,返回一个Collection集合


        entrySet();:
将Map集合中的映射关系存入到Set集合中,而这个关系的数据类型就是:Map.Entry
     
        keySet();:
将map中所有的键存入到set集合。因为set具备迭代器。所以可以通过迭代方式取出所以键的值,再通过get方法。获取每一个键对应的值。


Map集合的子类
        Map
            |--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。
            |--HashMap:底层是哈希表数据结构。允许使用null键null值,该集合是不同步的。
            |--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给Map集合中的键进行排序。

map集合的取出原理:将map集合转成set集合,再通过迭代器取出。


结合两种取出方式练习:

/* 
每一个学生都有对应的归属地。 
学生Student,地址String。 
学生属性:姓名,年龄。 
注意:姓名和年龄相同的视为同一个学生。 
保证学生的唯一性。 
 
思路:1、描述学生类 
      2、定义一个Map集合,存储学生对象和地址值 
      3、获取Map中的元素 
*/  
  
import java.util.*;  
  
//描述学生类  
class Student implements Comparable<Student>  
{  
    private String name;  
    private int age;  
    Student(String name,int age)  //构造函数
    {  
        this.name=name;  
        this.age=age;  
    }  
    public String getName()  
    {  
        return name;  
    }  
  
    public int getAge()  
    {  
        return age;  
    }  
  
    //覆盖hashCode  
    public int hashCode()  
    {  
        return name.hashCode()+age*34;   
    }  
    //复写equals,比较对象内容  
    public boolean equals(Object obj)  
    {  
        if(!(obj instanceof Student))  
            throw new ClassCastException("类型不匹配");  
        Student s=(Student)obj;  
        return this.name.equals(s.name)&&this.age==s.age;  
    }  
  
    //复写compareTo,以年龄为主  
    public int compareTo(Student c)  
    {  
        int num=new Integer(this.age).compareTo(new Integer(c.age));  
        if(num==0)  
        {  
            return this.name.compareTo(c.name);  
        }  
        return num;  
    }  
  
    //复写toString,自定义输出内容  
    public String toString()  
    {  
        return name+"..."+age;  
    }  
  
}  
class  HashMapTest  
{  
    public static void main(String[] args)   
    {  
        HashMap<Student,String > hm=new HashMap<Student,String >();  
        hm.put(new Student("stylekai",25),"shanghai");  
        hm.put(new Student("mango",23),"shenzhen");  
        hm.put(new Student("joseph",22),"guangzhou");  
        hm.put(new Student("melon",24),"beijing");  
        
  
        keyset(hm);  
    }  
  
    
    public static void keyset(HashMap<Student,String> hm)  
    {  
        Iterator<Student> it=hm.keySet().iterator();  //keySet取出方式  
  
        while(it.hasNext())  
        {  
            Student s=it.next();  
            String addr=hm.get(s);  
            System.out.println(s+":"+addr);  
        }  
    }  
}  


需求:对学生对象的年龄进行升序排序


因为数据是以键值对形式存在的,所以要使用可以排序的Map集合:TreeMap。

//编译时要先编译上例中的Student类。
import java.util.*;
class TreeMapTest
{
	public static void main(String[] args)
	{
		TreeMap<Student,String> tm=new TreeMap<Student,String>();


		tm.put(new Student("stylekai",25),"shanghai");  
        	tm.put(new Student("mango",23),"shenzhen");  
        	tm.put(new Student("joseph",22),"guangzhou");  
        	tm.put(new Student("melon",24),"beijing"); 
 
		//entrySet取出方式
		Set<Map.Entry<Student,String>> entrySet = tm.entrySet();


		Iterator<Map.Entry<Student,String>> it=entrySet.iterator();


		while(it.hasNext())
		{
			Map.Entry<Student,String> me=it.next();


			Student stu=me.getKey();
			String addr=me.getValue();
			System.out.println(stu+"==="addr);
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值