1.泛型概述
泛型是一种特殊的类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。
集合模仿数组的做法,在创建对象的时候明确元素的数据类型。 而这种技术被称为:泛型。
1.格式:
<数据类型>
此处的数据类型只能是引用类型。
2.泛型的好处
- 提高了程序的安全性
- 将运行期遇到的问题转移到了编译期
- 省去了类型强转的麻烦
2.泛型应用
1. 泛型类
把泛型定义在类上
格式:public class 类名<泛型类型1,…>
注意:泛型类型必须是引用类型
2.泛型方法
把泛型定义在方法上
格式:public <泛型类型> 返回类型 方法名(泛型类型 .)
3.泛型接口
把泛型定义在接口上
格式:public interface 接口名<泛型类型1…>
4.泛型高级(通配符)
泛型通配符 <?>
任意类型,如果没有明确,那么就是Object以及任意的Java类了
? extends E
向上限定,E及其子类
? super E
向下限定,E及其父类)
3.可变参数
可变参数
定义方法的时候不知道该定义多少个参数
格式
修饰符 返回值类型 方法名(数据类型… 变量名){}
注意:
这里的变量其实是一个数组
如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
4.Set接口
Set是一个不包含重复元素的 Collection接口。
Collection
|–List
有序(存储顺序和取出顺序一致),可重复
|–Set
无序(存储顺序和取出顺序不一致),唯一
5.HashSet
它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。
1.HashSet如何保证元素唯一性
底层数据结构是哈希表(元素是链表的数组)
哈希表依赖于哈希值存储
添加功能底层依赖两个方法:
int hashCode()
boolean equals(Object obj)
2.HashSet:存储字符串并遍历
问题:为什么存储字符串的时候,字符串内容相同的只存储了一个呢?
通过查看add方法的源码,我们知道这个方法底层依赖 两个方法:hashCode()和equals()。
3.LinkedHashSet类
元素有序唯一
由链表保证元素有序(存储和取出是一致)
由哈希表保证元素唯一
6.TreeSet类
TreeSet类概述
使用元素的自然顺序对元素进行排序
或者根据创建 set 时提供的 Comparator 进行排序
具体取决于使用的构造方法。
TreeSet集合的特点:排序和唯一
TreeSet集合保证元素排序和唯一性的原理
唯一性:是根据比较的返回是否是0来决定。
排序:
A:自然排序(元素具备比较性)
让元素所属的类实现自然排序接口 Comparable
B:比较器排序(集合具备比较性)
让集合的构造方法接收一个比较器接口的子类对象Comparator