泛型的作用
1. 泛型的定义
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型,可以在类 接口 和方法中创建,分别称为泛型类、泛型接口、泛型方法。 Java 语言引入泛型的好处是安全简单。
2. 泛型的作用
引入泛型的好处是安全简单 可以将运行时类型相关错误提前到编译时错误. (避免了使用强转可能导致的问题)
3. 泛型的特点
- 所有的泛型类的参数在编译时都会被擦除,虚拟机运行时没有泛型.
- java 泛型不支持基本类型
- 在泛型内部,无法获得有关系泛型参数类型的信息,如果传入的类型参数为 T,那么在泛型代码内部你不知道 T 有什么方法,属性,关于 T 的一切信息都丢失了
- 创建泛型对象时,清指明类型.
- java 的泛型类型不能用于 new 构建对象,也不能用于初始化数组.
集合接口
1.为什么要使用集合接口
如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使用 Java 集合框架
2. 集合框架组成
Java 容器主要包括 Collection 和 Map 两种,Collection 存储这对象的集合,而 Map 存储着键值对(两个对象)的映射表
Collection 接口是最基本的集合接口.
- Set
TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作,但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)
HashSet:基于哈希表(实际上是一个 HashMap 的实例)实现,内部使用 HashMap 来存储数据,数据存储在 HashMap 的 key 中,value 都是同一个默认的 Object 值,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的
linkedHashSet:具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序,与 HashMap 的区别是内部使用 LinkHashMap 来存储数据,意义是保证元素的顺序 - List
ArrayList:基于动态数组(Object[])实现,支持随机访问。动态数组是当容量不够时,创建一个大约 1.5 倍于原数组的空数组,然后将旧数组拷贝至新创建的数组中。 - Vector:和 ArrayList 类似,但它是线程安全的
LinkedList:基于双向链表实现,只能随机访问,但是可以快速的在链表中插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。 - Queue:
LinkedList:可以用它来实现双向队列。
PriorityQueue:基于堆结构,可以用它来实现优先队列。
- Set
Map 接口(实现类:HasMap . TreeMap)
- TreeMap:基于红黑树实现。
- HashMap:基于哈希表实现。
- HashTable:和 HashMap 类似,但它是线程安全的,这意味着同 一时刻多个线程可以同时写入 HashTable 并且不会导致数据不一致。它是遗留类,现在可以使用 ConcurrentHashMap 来支持线程安全,并且 ConcurrentHashMap 的效率会更高,因为它引入了分段锁。
- LinkedHashMap:使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。