泛型
泛型方法:
在调用方法时,指明泛型的具体类型
泛型好处:(传参数时限制类型,取值时不需要强制转换)
简单安全,将运行时相关的类型错误提前到编译时错误
泛型接口 :
和泛型类差不多
泛型方法注意事项:
- public与返回值中间的<T,E…>可以理解声明此方法为泛型方法
- 一般用T,E,K,V参数
- 在泛型类中使用泛型方法无需在声明泛型
- 是否拥有泛型方法,与其所在的类是否泛型类没有关系。要定义泛型方法,只需将泛型参数列表至于返回之前
泛型接口:
与泛型类完全相同
类型通配符:(不是在声明泛型类,泛型接口时用的,是在创建类对象时使用的)
一般就是一个 ?代替具体参数类型,切记是实参不是形参
类型通配符的上限语法:
注 意:
泛型只存在代码编译阶段,在进入JVM之前,泛型相关的信息会被擦除掉,我们称之为类型擦除
类型通配符好处:
限制泛型,继承之后可以调用方法
Java中集合
Java集合框架:
相当于数组的增强版本,可以实现数组中不容易实现的功能,在某些场景中就是为了代替数组的
数组和集合类有何不同:
- 数组和集合类都是容器
- 数组长度是固定的,集合长度是可变的
- 数组中可以存基本数据类型和引用数据类型,但是集合只能存对象
- 数组中存储数据类型是单一的,集合可以存储任意类型的对象
集合类的特点:
只能存储对象,长度是可变的,可以存储不同类型的对象
Collection接口:
Collection有三个子接口 List,Set,Queue
- List:元素存取是有序的,可以存放重复元素,元素都有下标
- Set:元素都是无序的,不可以存放重复元素,元素没有下标,元素不可以重复
- Queue:队列,实现了先进先出
集合的通用遍历方法有以下几种:
- 普通for遍历
- 增强型for遍历
- 使用迭代器遍历
List接口实现类:(List所代表的是有序的Collection)
- ArrayList:线程不安全,底层使用数组实现,长度可变,查询速度块,增删慢
- LinkedList:链表结构,底层使用链表实现,可变长度,增删速度快
- Vector:底层使用数组实现,线程安全,但是速度慢,已经被ArrayList代替
- Stact:先进先出,底层调用Vector类中的方法,数组实现
LinkedList类:
ArrayList与Vector的区别:
相同点:底层都是由数组实现的
不同点:
- ArrayList不同步,线程相对不安全。效率相对高;Vector同步的线程相对安全,效率相对较低
- ArrayList是JDK1.2出现的Vector是JDK1.0的时候出现的
- 扩容方式不同,ArrayList默认是原数组的1.5倍,Vector默认是原数组的2倍
- 实现方法不同
Set接口实现类:
- HashSet:底层调用HashMap中的方法,集合元素唯一,不保证迭代顺序,(无序,不重复)取速度快,线程不安全
- TreeSet:TreeSet中的元素不重复,并能按照指定顺序排列,存储的对象必须实现Comparable接口,线程不安全(不同步)
- LinkedHashSet:哈希表和链表实现了Set接口,元素唯一,保证迭代顺序,有序不重复
HashSet特点:
TreeSet:
Map接口实现类
类型参数:
K-此映射所维护的键的类型
V-映射值的类型添加
一个映射不能包含重复的键,每个键最多只能映射到一个值,Value可以相同
注意:
Map的存储的是键值对,必须保证键是唯一的,他没有继承Collection