首页 > 代码库 > 黑马程序员——集合基础知识(泛型)

黑马程序员——集合基础知识(泛型)

集合:泛型基础知识

泛型。(泛型就是类型参数化,默认的时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里面用的是嵌套的泛型。