单例集合的体系
-------|Collection 单例集合的根接口
--------------|List 特点是:有序,重复
---------------------|ArrayList 底层有一个Object[]数组维护,特点:查询速度快,增删慢
---------------------|LinkedList 底层使用链表数据结构实现,特点:查询慢,增删快
---------------------|Vector 底层有一个Object[]数组维护,线程安全,操作效率低,JDK1.0出现
--------------|Set 特点:无序,不可重复
---------------------|HashSet 底层是使用一个哈希表支持的,特点:存取速度快
HashSet的实现原理:
往Haset添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值 ,然后通过元素 的哈希值经过移位等运算,就可以算出该元素在哈希表中 的存储位置。
1.
如果算出的元素存储的位置目前没有任何元素存储,那么该元素可以直接存储在该位置上
2.
如果算出的元素的存储位置目前已经存在有其他的元素了,那么还会调用该元素的equals方法与该位置的元素再比较一次,如果equals方法返回的是true,那么该位置上的元素视为重复元素,不允许添加,如果返回的是false,则允许添加、
---------------------|TreeSet 底层是使用了红黑树(二叉树)数据结构实现的,特点:会对元素进行排序存储
TreeSet要注意的事项:
1.
添加元素时,如果元素本身具备自然顺序的特性,那么会根据元素自然顺序的特性进行排序存储。
2.
添加元素时,如果元素本身不具备自然顺序的特性,那么元素所属的类必须要实现Comparable接口,把元素的比较规定规定在Comparable接口的方法上。
3.
添加元素时,如果元素本身不具备自然顺序的特性,且元素所属的类没有实现Comparable接口,那么必须要创建TreeSet对象的时候传入比较器
4.
如果比较的方法(ComparaTo或Compare)返回的是0,那么这个元素被视为重复元素,不允许添加
比较器的定义格式:自定义一个类实现Comparator接口。
class 类名 implements Comparator{
}
泛型
泛型是JDK1.5出现的新特性
泛型的特点:
1.
将运行时的问题提前至了编译时
2.
避免了无谓的强制类型转换
自定义泛型:自定义泛型就是一个数据类型的占位符,或者理解为一个数据类型的变量
一.泛型方法:
修饰符 <声明自定义泛型>返回值类型 函数名(自定义的泛型 变量名){
}
泛型方法需要注意的事项:
1.
泛型方法中的自定义数据类型是在调用该函数的时候传入实参时确定的
2.
自定义泛型所用的标识符,只要符合标识符的命名规则即可,我们一般使用一个大写字母表示。如T E
二.泛型类:
泛型类的定义格式
class 类名<声明自定义的泛型>{}
泛型类要注意的事项:
1.
泛型类上自定义泛型是在使用类创建对象的时候指定具体的数据类型的
2.
如果一个类已经定义了泛型,使用该类创建对象的时候如果没有指定泛型的具体数据类型,那么默认Object类型
3.
静态的函数不能使用类上定义的泛型,如果静态函数需要使用,必须要在函数上自定义泛型
三.泛型接口
泛型接口的定义格式
interface 接口名<声明自定义的泛型>{
}
泛型接口要注意的事项:
1.
泛型接口上的自定义类型是在实现该接口的时候指定具体数据类型的
2.
如果实现接口的时候,没有指定接口上的自定义泛型的具体数据类型,那么默认Object数据类型
3.
如果需要在创建接口实现类对象的时候才指定接口上的自定义泛型,那么需要以下格式: class 类名 implements 接口{}
泛型上下限:
?<>super Interger 允许Integer数据类型或是Integer父类数据类型 (泛型的下限)
?<>extends Number 允许Number数据类型或是Number子类的数据类型 (泛型的上限)