首页 > 代码库 > 黑马程序员——集合基础知识(泛型)
黑马程序员——集合基础知识(泛型)
集合:泛型基础知识 |
泛型。(泛型就是类型参数化,默认的时object,虽然不用强制类型转换,这个就要你自己去写特性方法,比如compareto是string的特有方法吧,你可以写但是父类肯定调用不了)
itnex t对象都是obj要使用对象的特性功能必须强。编译的时候没问题,因为都不知道你会传什么对象,你橙子也可以当作apple来传,设计的时候并不知道!
泛型作用。1.用于解决安全问题。运行时期出现的问题classcastexception转移到编译时期。2.迭代器里面的itnext()不用强转了。
泛型的格式:通过尖口号来定义要操作的引用数据类型。你在集合创建的时候指定了element的类型,其实尖括号就是来接受类型的,当集合中要存储的类型作为参数传递进集合就行了,就像是参数类型传参数一般。
练习:来一个treeset,传了个字符串,可以打印长度也可以打印内容。如果我想要按长度来排列呢泛型避免了强转。。comparater<>,comparable<>也是,equals必须强转,Object不是泛型,指定类型了嘛。就不用强转啦
所以现在创建类的时候要写hashcode、equsals,compareto,compare方法,以便存储。
集合框架:泛型类
工人,学生。我们定义一个工具来创建/改写等操作。程序都是通过这样的方式提高扩展性的,obj作为形式参数,我也不知道操作什么类型的对象,但是功能确定,对方调用的时候指定操作的类型队象,但还是有安全问题。传说中的泛型类,不是一般的牛。让问题发生在编译时期。。。什么时候需要定义泛型类,当类中要操作的引用数据类型(基本数据类型不能不确定)不确定的时候,早期定义object来完成扩展,现在通过泛型来提高安全性,而且避免了强转。
集合框架:泛型方法。
以前我们做函数的时候要确定参数类型,现在用泛型就行!当你指定这个类是String的时候,这里面的方法全都可以操作String,你要操作其他对象,重新建一个改工具对象。泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经确定了
想要不同类操作方法,但是不想new对象,可以将泛型修饰在方法上。集合就是泛型类,只要集合已确定,里面方法要操作的对象类型都是确定的。
集合框架"静态方法类。这个T只有建立对象的时候才能明确,所以静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,泛型可以定义在函数上。放在返回值前面。
集合框架:泛型接口
我实现你的时候也不知道操作什么类型
集合框架:泛型限定!!(高级的应用)
比如现在有两个集合,ArrayList<String>和ArrayList<Integer>然后存完后都想去出来,有必要定义两个迭代器吗?我想打印任意类型的对象,不知道什么类型是吗?那就打个问号。接收ArrayList里面任何类型的元素,只能使用通用的方法,不能使用特有方法。。。这也是多态的特点。虽然学生继承了人,你定义的集合存的是人但是你的学生集合里面只能存学生,不能存学生之外的人。左右两边类型就不一致!!如果我搞个问号,集合什么类都能打印(?)但是我只想然这个方法在一个范围使用,只打印人和人的子类,?extends person!!!这就是泛型限定,两个限定,向上限定,向下限定。
通配符?泛型的限定。?extends E:可以接受e类型或者e子类类型。上限限定
? super E:可以接受e和其父类类型,下限限定treeset里面的compartor 哟,人家接口是?super e。你跟据实际情况改成Person~!既能接受person也能使学生或者工人,但是一定要调用共有方法。
集合框架
泛型:指定引用类型
限定:特定的类型及其子类或者父类
如何理解通配符:?通配符其实是自动匹配类型,当你左边是问号的时候,右边可以是任意类型来匹配通配符。
?extends Number就是说,比如 Integer,字符类型都可以。
? super E就是说,其他都不行,只能是Integer或者Number。
集合框架:泛型嵌套
public class GernericTest { public static void main(String[] args) { // TODO Auto-generated method stub Map<String,Integer> hm= new HashMap<String,Integer>(); hm.put("mia", 52); hm.put("mfg", 53); hm.put("mua", 51); System.out.println(hm); Set<Map.Entry<String, Integer>> mm=hm.entrySet(); for( Map.Entry<String, Integer> en:mm){ System.out.println(en.getKey()+">>>"+en.getValue()); }} }//打印结果 /*{mia=52, mua=51, mfg=53} mia>>>52 mua>>>51 mfg>>>53*/
Map集合的取出方法中,Map.Entry里面用的是嵌套的泛型。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。