Keywords: 泛型、Collections工具类、Arrays工具类、可变参数、静态导入、System类、Math类、Date&DateFormat&Calendar类
泛型
泛型的概述
问题: 什么类型的元素都可以往集合中存储,导致取出时,如果出现强转就会引发运行时ClassCastException。能不能再创建集合时,就明确容器中元素的类型,如同数组一样。
目的: 让集合使用更安全
解决方案: 泛型,创建集合时,直接在集合上明确要存储的元素的类型,只要不是指定的类型对象,编译器检查会报错。这样就将运行时的问题转移到编译时期。
泛型的好处:
- 安全机制
- 将运行时期的
ClassCastException转移到编译时期,变成了编译失败 - 泛型技术,是给编译器使用的技术
- 泛型的出现避免了强转的麻烦
格式: 集合类型<元素类型> 变量名 = new 集合类型<元素类型>()
泛型的擦除: 运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除。
为什么擦除: 为了兼容运行的类加载器。生成的class文件中就不带泛型了
泛型的补偿: 在运行时,通过获取元素的类型进行转换动作。不用使用者在强制转换了。
泛型的表现:
泛型技术在集合框架中应用的范围很大,只要看到类,或者接口在描述时右边定义<>,就需要泛型。其实是容器在不明确操作元素的类型的情况下,对外提供了一个参数<>,使用容器时,只要将具体的类型实参传递给该参数即可。说白了,泛型就是传递类型参数。
泛型的应用
定义泛型类
Object类为最上层的父类,很多程序员为了使程序更为通用,设计程序时通常使传入的值与返回的值都以Object类型为主。当需要使用这些实例时,必须正确地将该实例转换为原来的类型,否则在运行时将会发生ClassCastException异常。JDK1.5以后提出了泛型机制。(/day18e/src/cn/itcast/p4/generic/define/demo/Tool.java)
格式:
-
类名<T>,其中T代表元素类型 -
类名<T1,T2>,其中T1,T2代表元素类型,这样在实例化指定类型的对象时就可以指定多个类型
定义泛型方法
当方法要操作的类型不确定,不一定和类上的泛型一致时,可以将泛型定义在方法上。(/day18e/src/cn/itcast/p4/generic/define/demo/Tool.java)
格式: public <W> void 方法名(W 参数名),其中W代表元素类型
注意: 如果方法是静态的,且需要使用泛型,那么泛型必须定义在方法上,不能定义在类上
定义泛型接口
(/day18e/src/cn/itcast/p4/generic/define/demo/GenericDefineDemo5.java)
格式: interface 接口名<T>,其中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<E>{
public boolean containsAll(Collection<?> c){}
}
了解containsAll()方法源码内判断包含的依据,是equals()方法:boolean equals(Object o),可以接收任意参数类型,不必与Collection集合所接收参数类型一致。
泛型的限定
如果想要对传递的类型进行限制,只在一些指定的类型,使用泛型的限定。(/day18e/src/cn/itcast/p5/generic/advance/demo/GenericAdvanceDemo2.java)
格式:
- 上限:
? extends E,接收E类型或E的子类型 - 下限:
? super E,接收E类型或E的父类型
泛型的限定在api中的使用
以TreeSet接口中的TreeSet(Collection<? extends E> c)和TreeSet(Comparator<? super E> comparator)为例:
class TreeSet<E>{
TreeSet(Collection<? extends E> c){}
TreeSet(Comparator<? super E> 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类
- 不需要实例化,都是静态的属性和方法
-
out对应标准输出流,默认显示器 -
in属性对应键盘
常见方法: (/day20e/src/cn/itcast/p1/otherapi/SystemDemo.java)
- 获取当前时间的毫秒值,可以计算程序运行时间:结束时间-开始时间
long currentTimeMillis();
- 获取系统属性集及指定信息(
/day20e/系统信息.txt)
Properties prop = System.getProperties();//获取系统属性集
Set<String> keySet = prop.stringPropertyNames();
for(String key:keySet){
String value = prop.getProperty(key);//通过键获取值
syso(key + "::::" + value);
}
Properties p = System.getProperty("os.name");//获取指定信息,如:操作系统Windows 10

- 获取系统中的行分隔符。这样该程序在移植时很方便
//写法一:
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)