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>,其中T代表元素类型
  2. 类名<T1,T2>,其中T1T2代表元素类型,这样在实例化指定类型的对象时就可以指定多个类型

定义泛型方法

当方法要操作的类型不确定,不一定和类上的泛型一致时,可以将泛型定义在方法上。(/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)
格式:

  1. 上限:? extends E,接收E类型或E的子类型
  2. 下限:? 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类

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

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

  1. 获取当前时间的毫秒值,可以计算程序运行时间:结束时间-开始时间
long currentTimeMillis();
  1. 获取系统属性集及指定信息(/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
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)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348