API(三)——集合框架(下)

Keywords: 泛型、Collections工具类、Arrays工具类、可变参数、静态导入、System类、Math类、Date&DateFormat&Calendar

泛型

泛型的概述

问题: 什么类型的元素都可以往集合中存储,导致取出时,如果出现强转就会引发运行时ClassCastException。能不能再创建集合时,就明确容器中元素的类型,如同数组一样。
目的: 让集合使用更安全
解决方案: 泛型,创建集合时,直接在集合上明确要存储的元素的类型,只要不是指定的类型对象,编译器检查会报错。这样就将运行时的问题转移到编译时期。

泛型的好处:

  1. 安全机制
  2. 将运行时期的ClassCastException转移到编译时期,变成了编译失败
  3. 泛型技术,是给编译器使用的技术
  4. 泛型的出现避免了强转的麻烦

格式: 集合类型<元素类型> 变量名 = new 集合类型<元素类型>()

泛型的擦除: 运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除。
为什么擦除: 为了兼容运行的类加载器。生成的class文件中就不带泛型了

泛型的补偿: 在运行时,通过获取元素的类型进行转换动作。不用使用者在强制转换了。

泛型的表现:
泛型技术在集合框架中应用的范围很大,只要看到类,或者接口在描述时右边定义<>,就需要泛型。其实是容器在不明确操作元素的类型的情况下,对外提供了一个参数<>,使用容器时,只要将具体的类型实参传递给该参数即可。说白了,泛型就是传递类型参数。

泛型的应用

定义泛型类

Object类为最上层的父类,很多程序员为了使程序更为通用,设计程序时通常使传入的值与返回的值都以Object类型为主。当需要使用这些实例时,必须正确地将该实例转换为原来的类型,否则在运行时将会发生ClassCastException异常。JDK1.5以后提出了泛型机制。(/day18e/src/cn/itcast/p4/generic/define/demo/Tool.java)
格式:

  1. 类名,其中T代表元素类型
  2. 类名,其中T1T2代表元素类型,这样在实例化指定类型的对象时就可以指定多个类型

定义泛型方法

当方法要操作的类型不确定,不一定和类上的泛型一致时,可以将泛型定义在方法上。(/day18e/src/cn/itcast/p4/generic/define/demo/Tool.java)
格式: public void 方法名(W 参数名),其中W代表元素类型
注意: 如果方法是静态的,且需要使用泛型,那么泛型必须定义在方法上,不能定义在类上

定义泛型接口

(/day18e/src/cn/itcast/p4/generic/define/demo/GenericDefineDemo5.java)
格式: interface 接口名,其中T代表元素类型

通配符

当使用泛型类或者接口时,传递的具体的类型不确定,可以通过通配符?表示。
格式: 泛型类名称
一个栗子

private static void printList(Collection ts) {
    for (Iterator iterator = ts.iterator(); iterator.hasNext();) {
        System.out.println(iterator.next());
    }
}

通配符在api中的使用

Collection接口中的boolean containsAll(Collection c)为例:

class Collection{
    public boolean containsAll(Collection c){}
}

了解containsAll()方法源码内判断包含的依据,是equals()方法:boolean equals(Object o),可以接收任意参数类型,不必与Collection集合所接收参数类型一致。

泛型的限定

如果想要对传递的类型进行限制,只在一些指定的类型,使用泛型的限定。(/day18e/src/cn/itcast/p5/generic/advance/demo/GenericAdvanceDemo2.java)
格式:

  1. 上限:? extends E,接收E类型或E的子类型
  2. 下限:? super E,接收E类型或E的父类型

泛型的限定在api中的使用

TreeSet接口中的TreeSet(Collection c)TreeSet(Comparator comparator)为例:

class TreeSet{
    TreeSet(Collection c){}
    TreeSet(Comparator comparator){}
}

嗐,懒得写了,忘了就去看毕向东

使用细节

使用泛型时,要保证左右类型一致

案例

获取集合中元素的最大值(/day18e/src/cn/itcast/p1/generic/demo/GenericTest.java)

Collections工具类

集合框架中用于操作集合对象的工具类,都是静态的工具方法
(/day19e/src/cn/itcast/p2/toolclass/collections/demo/CollectionsDemo.java)

Arrays工具类

用于操作数组的工具类,类中定义的都是静态工具方法
(/day19e/src/cn/itcast/p3/toolclass/arrays/demo/ArraysDemo.java)

可变参数

数组参数的简化表现形式(/day20_my/src/cn/itcast/param/ParamDemo.java)

public class ParamDemo {
    public static void main(String[] args) {
        int sum = add(4,5,23,45,2,34);
        System.out.println(sum);
    }

    /*
    * 可变参数需要注意,只能定义在参数的最后
    */
    public static int add(int... arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }
}

...用在参数上,称为可变参数,同样是代表数组,但是再调用这个带有可变参数的函数时,不用创建数组,直接将数组中的元素作为实际参数进行传递,其实编译成的class文件,是将这些实参先封装到一个数组中,再进行传递。

注意事项:可变参数一定要定义再参数列表的最后

静态导入

导入的是指定类中的静态成员(/day20_my/src/cn/itcast/staticImport/StaticImportDemo.java)

import static java.util.Collections.*;

System类

  1. 不需要实例化,都是静态的属性和方法
  2. out对应标准输出流,默认显示器
  3. in属性对应键盘

常见方法: (/day20e/src/cn/itcast/p1/otherapi/SystemDemo.java)

  1. 获取当前时间的毫秒值,可以计算程序运行时间:结束时间-开始时间
long currentTimeMillis();
  1. 获取系统属性集及指定信息(/day20e/系统信息.txt)
Properties prop = System.getProperties();//获取系统属性集
Set keySet = prop.stringPropertyNames();
for(String key:keySet){
    String value = prop.getProperty(key);//通过键获取值
    syso(key + "::::" + value);
} 

Properties p = System.getProperty("os.name");//获取指定信息,如:操作系统Windows 10
getProperties键值对应列表
  1. 获取系统中的行分隔符。这样该程序在移植时很方便
//写法一:
System.out.println("hello"+System.getProperty("line.separator")+"XenaLiu");
// 写法二:
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
System.out.println("hello"+LINE_SEPARATOR+"world");

Math类

提供了操作数学运算的方法,都是静态的。(/day20e/src/cn/itcast/p1/otherapi/MathDemo.java)

常用方法:
ceil():返回大于参数的最小整数。
floor():返回小于参数的最大整数。
round():返回四舍五入的整数。
pow(a,b):a的b次方。
random():返回一个double值为正号,大于等于0.0,小于1.0。返回的值是从该范围(大约)均匀分布而伪随机选择的。

Date&DateFormat&Calendar类

(/day20e/src/cn/itcast/p1/otherapi/DateDemo.java)
(/day20e/src/cn/itcast/p1/otherapi/DateDemo2.java)
(/day20e/src/cn/itcast/p1/otherapi/test/DateTest.java)
(/day20e/src/cn/itcast/p1/otherapi/test/DateTest2.java)

你可能感兴趣的:(API(三)——集合框架(下))