Java高级特性-集合
2019-02-24 本文已影响0人
Harper324
1、集合
-
定义
集合是一种工具类,就像容器,能够存储任意数量的具有共同属性的对象。 -
作用
1、在类的内部,对数据进行组织。集合就是一种容器,当一个类拥有相同类型的多个对象时,可以考虑用集合来承载他们。
2、集合适用于简单而快速的搜索大数量的条目。
3、有的集合接口,提供了一系列排列有序的元素,可以在序列中间快速的插入或者删除指定元素。
4、有的集合接口,提供了映射关系,可以通过关键字key去快速的查找对应的唯一对象,而这个关键字可以是任意类型。 -
集合与数组的区别
1、数组的长度是固定的,不容易动态扩展;集合的长度是可变的,能够动态扩展。
2、数组只能通过下标来访问元素,并且类型固定;而有的集合可以通过任意类型查找所映射的具体对象。
3、数组元素既可以是基本类型的值,也可以是对象。集合里只能保存对象(实际上只是保存对象的引用变量),基本数据类型的变量要转换成对应的包装类才能放入集合类中。 -
Collection体系结构
collection体系结构
在Java语言中,有两种类型的集合接口:Collection和Map,前者表示的是对象的容器集合,后者表示的是键值对的容器集合。
-
Collection
Collection是一个接口,它主要有三个接口来继承它:List(序列)、Queue(队列)和Set(集)。List中最主要的实现类是ArrayList(数组序列);Queue中最主要的实现类是LinkedList(链表),它同样实现了List接口;Set中最主要的实现类是HashSet(哈希集)。 -
Map
Map是一个接口,它有一个重要的实现类HashMap(哈希表) -
特点
- List和Queue是排列有序,可重复的
- Set是无序且不可重复的,在Set接口中重复添加某个对象,只保留第一次添加的对象(引用)
- Map中一对键值对:<Key, Value> = Entry,Key值不可重复,Key与Value的映射关系为一对一或一对多
2、泛型
-
定义
一种不确定的类型,可以在编译期间确定的数据类型。 - 语法
//用E来代替实际类型,在编译时确定
public class ArrayList<E> {
//code
}
-
泛型类与泛型方法:
- 泛型类:带有泛型参数的类就是泛型类。对此总结成一句话:泛型类型在逻辑上可以看成是多个不同的类型,实际上都是相同的基本类型 比如上面的ArrayList就是泛型类。
- 泛型方法:带有泛型参数或者返回值的方法就叫做泛型方法。方法定义时的返回类型为泛型。
-
优点:
- 在编译期间有更强的类型检查: 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。
- 避免强制类型转换: 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会
- 潜在的性能收益: 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。
-
泛型的一些规则和限制:
- 泛型的类型参数只能是引用类型(包括自定义类),不能是基本类型。
- 同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
- 泛型的类型参数可以有多个
- 泛型集合中,只能添加泛型规定的类及其子类
通配符(?)
-
定义:
通配符表示一种未知类型,并且对这种未知类型存在约束关系。
通常有类:
- ? extends T(上边界通配符upper bounded wildcard) 对应协变关系,表示 ? 是继承自 T的任意子类型.也表示一种约束关系,只能提供数据,不能接收数据。 ? 的默认实现是 ? extends Object, 表示 ? 是继承自Object的任意类型。
- ? super T(下边界通配符lower bounded wildcard) 对应逆变关系,表示 ? 是 T的任意父类型。也表示一种约束关系,只能接收数据,不能提供数据(或者用object来接受)
- 通配符也包括自己。
举个例子: 假设有类A, B, C, D; 类D继承自C, 类C继承自类B, 类B继承自类A。
ArrayList<? extends A> upperBoundedList = new ArrayList<B>();
upperBoundedList = new ArrayList<C>();
upperBoundedList.add(new C());// error, can not add data.
ArrayList<? super B> upperBoundedList = new ArrayList<A>();
upperBoundedList.add(new C());
upperBoundedList.add(new D());
upperBoundedList.add(new B());