Java基础---泛型、集合框架工具类:collections和Arrays

本文深入讲解了Java中的泛型,包括泛型的概念、好处、定义、类型参数的兼容性、通配符和泛型限定。此外,还介绍了集合框架中的Collections工具类,提供了常见操作如查找、替换、排序和同步集合的方法。最后,探讨了Arrays工具类,展示了如何将数组转换为集合、进行二分查找、替换和排序等操作,以及Java 1.5版本的新特性,如高级for循环、可变参数和静态导入。
摘要由CSDN通过智能技术生成


第一讲     泛型(Generic

一、概述

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

2JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类型的数据,无法加入指定类型以外的数据。

3、泛型是提供给javac编译器使用的可以限定集合中的输入类型说明的集合时,会去掉“类型”信息,使程序运行效率不受影响,对参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。

4、由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据,如用反射得到集合,再调用add方法即可。

5、没有使用泛型时,只要是对象,不管是什么类型的对象,都可以存储进同一个集合中。使用泛型集合,可以将一个集合中的元素限定为一个特定类型,集合中只能存储同一个类型的对象,这样更安全;并且当从集合获取一个对象时,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换,这样更方便。泛型就是把原来的类名进行了延长!在JDK 1.5中,你还可以按原来的方式将各种不同类型的数据装到一个集合中,但编译器会报告unchecked警告。

6、格式:

       通过<>来定义要操作的引用数据类型

      如:ArrayList<String>  //定义要存入集合中的元素指定为String类型

7、好处

       a、将运行时期出现的问题ClassCastException,转移到了编译时期。方便于程序员解决问题。让运行时期问题减少、安全。

       b、避免了强制转换的麻烦。如在实现某一个接口时,指定传入接口方法的实参的类型的话,在复写该接口方法时就可以直接使用指定类型,而不需要强制转换。

泛型研究:

      只有类被定义成了泛型,才可以对其进行参数化应用。

下面程序的main方法中的第二行代码和注释中的两行代码表达的意思完全相同,注释中的两行代码不能通过编译,而第二行(采用方法调用链)却可以顺利通过编译。

public class Test
{
    public void func()
    {
         System.out.println("func");
    }
 
   public static void main(String args[]) throws Exception
   {
           Object obj = new Test();

           //下面这行可以成功编译  
           ((Test)obj).getClass().newInstance().func();

           //下面这两行无法通过编译
           /*Class c = ((Test)obj).getClass();
           c.newInstance().func(); */
   }
} 

因为Generic,编译器可以在编译期获得类型信息所以可以编译这类代码。将下面那两行改成:

        Class<?extends Test> c = ((Test)obj).getClass();

        c.newInstance().func();

就能通过编译了。

JDK 1.5中引入范型后,Object.getClass()方法的定义如下:

        public final Class<? extends Object>getClass()

这说明((Test)obj).getClass()语句返回的对象类型为Class<? extendsTest>,而Class<T>newInstance()方法的定义如下:

        public T newInstance() throwsInstantiationException,IllegalAccessException

即对于编译器看来,Class<Test>newInstance()方法的对象类型为Test,而((Test)obj).getClass()返回的为对象类型为Class<? extends Test>,所以,编译器认为((Test)obj).getClass().newInstance()返回的对象类型为Test

下面这两行代码之所以无法通过编译

Class c = ((Test)obj).getClass();
c.newInstance().func();

是因为((Test)obj).getClass()返回的为对象类型为Class<? extends Test>,但是我们在第一行将结果强制转换成了Class,然后再去调用ClassnewInstance方法,而不是去调用Class<Test>newInstance方法,编译器当然不再认为ClassnewInstance方法返回的对象为Test了。

 

二、泛型定义中的术语:

        如:ArrayList<E>类和ArrayList<Integer>

        1ArrayList<E>整个称为泛型类型

        2ArrayList<E>中的E称为类型变量或类型参数

        3、整个ArrayList<Integer>称为参数化类型

        4ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数

        5ArrayList<Integer>中的<>称为typeof

        6ArrayList称为原始类型

       参数化:parametered,已经将参数变为实际类型的状态。

 

三、在使用java提供的对象时,什么时候写泛型?

        通常在集合框架中很常见,只要见到<>就要定义泛型。

        其实<>就是用来接收类型的。当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

 

四、关于参数化类型的几点说明:

1、参数化类型与原始类型的兼容性

        第一、参数化类型可引用一个原始类型的对象,编译只是报警告。

        如:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值