黑马程序员_泛型、Map集合

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

 

泛型

1.JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。

2.好处

(1)将运行时期出现问题ClassCastException,转移到了编译时期。方便于程序员解决问题。提高了程序的安全性,将运行期遇到的问题转移到了编译期。

(2)避免了强制转换麻烦,优化了程序设计。

3.泛型格式:通过<>来定义要操作的引用数据类型。

4.什么时候写泛型呢?

通常在集合框架中很常见,只要见到<>就要定义泛型。其实<>就是用来接收类型的。当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

5.泛型在类上定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。

6.为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。

7.特殊之处:

静态方法不可以访问类上定义的泛型。如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

8.什么时候定义泛型类?

当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展。现在定义泛型来完成扩展。

9.泛型中“?”代表通配符。也可以理解为占位符。

10.泛型的限定;

上限:?extends E可以接收E类型或者E的子类型。

下限:?super E可以接收E类型或者E的父类型。

示例

泛型定义在类上

classUtils<QQ>

{

       private QQ q;

       public void setObject(QQ q)

       {

              this.q = q;

       }

       public QQ getObject()

       {

              return q;

       }

}

泛型定义在方法上

classDemo<T>

{

       public void show(T t)

       {

              System.out.println("show:"+t);

       }

       public static <W> void method(W t)//静态方法

       {

              System.out.println("method:"+t);

       }

}

泛型定义在接口上

interfaceInter<T>

{

       void show(T t);

}

classInterImpl<T> implements Inter<T>

{

       public void show(T t)

       {

              System.out.println("show:"+t);

       }

}

Map集合

1. MapCollection在集合框架中属并列存在。该集合存储键值对。一对一对往里存。而且要保证键的唯一性。Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素。

2.Map集合常用的类HashtableHashMapTreeMap

(1)Hashtable:底层是哈希表数据结构,不可以存入nullnull值。该集合是线程同步的。jdk1.0.效率低。

       (2)HashMap:底层是哈希表数据结构,允许使用 null值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。

(3)TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

3.Map集合常用的方法

       (1)添加

put(K key, V value)

              putAll(Map<? extends K,?extends V> m)

       (2)删除

              clear()移除所有映射关系

              remove(Object key)

       (3)判断。

              containsValue(Object value)

              containsKey(Object key)

              isEmpty()是否包含包含键-值映射关系。

(4)获取

              get(Object key)

              size()

              values()

              entrySet()返回此映射中包含的映射关系的Set视图。

              keySet()返回此映射中包含的键的Set视图。

4.MapSet很像。Set底层就是使用了Map集合。

5.map集合的两种取出方式:

(1)Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。

(2)Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.EntryEntry其实就是Map中的一个static内部接口。

       为什么要定义在内部呢?

       因为只有有了Map集合,有了键值对,才会有键值的映射关系。关系属于Map集合中的一个内部事物。而且该事物在直接访问Map集合中的元素。

6.map集合被使用是因为具备映射关系。

示例:学生Student,地址String。学生属性:姓名,年龄。每一个学生都有对应的归属地。注意:姓名和年龄相同的视为同一个学生。保证学生的唯一性。

(1)描述学生。

(2)定义map容器。将学生作为键,地址作为值。存入。

(3)获取map集合中的元素。

importjava.util.Comparator;

importjava.util.Iterator;

importjava.util.Map;

importjava.util.Set;

importjava.util.TreeMap;

classStudent implements Comparable<Student>

{

       private String name;

       private int age;

       Student(String name,int age)

       {

              this.name = name;

              this.age = age;

       }

       public int compareTo(Student s)

       {

              int num = new Integer(this.age).compareTo(newInteger(s.age));

              if(num==0)

                     returnthis.name.compareTo(s.name);

              return num;

       }

       public int hashCode()

       {

              return name.hashCode()+age*34;

       }

       public boolean equals(Object obj)

       {

              if(!(obj instanceof Student))

                     throw newClassCastException("类型不匹配");

              Student s = (Student)obj;

              return this.name.equals(s.name)&& this.age==s.age;

       }

       public String getName()

       {

              return name;

       }

       public int getAge()

       {

              return age;

       }

       public String toString()

       {

              return name+":"+age;

       }

}

classStuNameComparator implements Comparator<Student>

{

       public int compare(Student s1,Student s2)

       {

              int num =s1.getName().compareTo(s2.getName());

              if(num==0)

                     return newInteger(s1.getAge()).compareTo(new Integer(s2.getAge()));

              return num;

       }

}

class  StudentDemo

{

       public static void main(String[] args)

       {

       TreeMap<Student,String> tm = newTreeMap<Student,String>(new StuNameComparator());

              tm.put(newStudent("bcdi3",23),"nanjing");

              tm.put(newStudent("lisi1",21),"beijing");

              tm.put(newStudent("aloi4",24),"wuhan");

              tm.put(new Student("lisi1",21),"tianjin");

              tm.put(newStudent("des2",22),"shanghai");

/*Set<Map.Entry<Student,String>>entrySet = tm.entrySet();//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);

              }*/

              Set<Student> keySet =tm.keySet();//keyset()取出方式

              Iterator<Student> it =keySet.iterator();

              while(it.hasNext())

              {

                     Student stu = it.next();

                     String  addr= tm.get(stu);

                     System.out.println(stu+":::"+addr);

              }

       }

}

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值