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
)