黑马程序员Java知识回顾之集合_泛型介绍

------------------ <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、

<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
泛型:jdk1.5新特性,用于解决安全问题,是一个类型安全机制;明确表示你要向集合中装入那种类型的数据,无法加入指定类型以外的数据,

       泛型是提供给java编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时,会去掉“类型”信息是程序不受影响,(运行期失效)

1好处:

1将运行时期出现的问题classCastException转移到了编译时期,方便与程序员解决问题,让运行时

问题减少,更安全;

2避免了强制转换的麻烦,泛型的补偿:在运行时通过获取元素的类型进行转换动作;(免强转)

泛型格式:通过<>来定义要操作的引用数据类型;通常在集合框架中很常见;<>就是用来接收泛型的;当使用集合时将集合中要存储的数据类型作为参数传递到<>中即可;

              ArrrayList<String> al=newArrayList<String>();

2何时使用泛型:

当操作的引用数据类型不确定的时候,就使用<>将要操作的引用数据类型传入<>其实<>就是一个用于接收具体引用数据类型的参数范围;

泛型技术是给编译器使用的技术;用于编译时期,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,确保了类型的安全;运行时会将泛型去掉,生成的class文件中不带泛型的,这称之为泛型的檫除;擦出是为了兼容运行的类加载器;也可使程序运行效率不搜影响,

3泛型与反射:

对于参数化的泛型类型,getclass()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型数据,用反射的到集合,在调用append()方法即可

4泛型的通配符:

?未知类型,使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数无关的方法,不能调用与参数化有关的方法;(没理解清楚)

?通配符的扩展:

?extends XXX:限定通配符的上边界:

应用:Vector<? extends Number> v=new Vector<integer>();  //ok

        Vector<? exends Number> v=newVector<String>();     //no ok

? super XXX :限定通配符的下边界:

应用:Vector<? super integer> v=nw Vector<Number>();     //ok

         Vector<? super integer> v=newVector<Bute>();  //no ok

提示:限定通配符总是包括自己;

5泛型限定应用场景:

?extends E :接收E类型或者E的子类型对象,(即上限)一般存储对象的时候用,如添加;

 

?super E :接收E类型或者E的父类型对象,(即下限)一般用于取出对象时用;如比较器;

6泛型术语:

Arraylist<E>类定义和Arraylist<integer>类型引用中涉及如下术语,整个称为Arraylist<E>泛型类型Arraylist<E>中的E称为类型变量或类型参数,整个Arraylist<integer>称为参数化的类型,integer称为类型参数的实例或实际类型参数;<>念做typeOf,整个称为arraylist type of integer.Arraylist称为原始类型;

7泛型之参数化类型与原始类型的兼容性:

       参数化类型可以引用一个原始类型的对象,编译报友好提示警告。

       应用:collection<String> v=new Voctor();  //ok

       原始类型可以引用一个参数化类型对象,编译报友好提示警告。

       应用:collection col=new Voctor<String>();       //ok

8参数化类型的规范:

参数化类型不考虑类型参数的继承关系:

       Vector<object> v=newVector<integet>();       //no ok

       Vector<String> v=newVector<object>();  //no ok

       在创建数组实例时,数组的元素不能使用参数化的类型;

       Vector<object> v[]=newVector<object>[21];   //no ok

       下面的代码是可行的,不报错:

       Vector v1=new Vector<String>();

       Vector<object>=v1;

 

9泛型集合类的综合案例:

       HashMap<String,Integer> hm=newHashMap<String,Integer>();

       hm.put(“zxx”,19);

       hm.put(“lhm”18);

       for ( Map.Entry<String,Integer>entry : hm.entrySet() ) {

              sop(entry.getKey()+”;”+entry.getValue());

       }

       Collection<Integer> s1=hm.values();

       Set<String> s2=hm.keySet();

       Set<Map.Entry> s3=hm.entrySet();

------------------<ahref="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、

<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值