文章目录
- 泛型
- 介绍
- 解决问题
- 好处
- 使用
- 通配符
- 泛型的下限
- 泛型的上限
- 数据结构
- 定义
- 常见的数据结构
- 栈(先进后出)
- 队列(先进先出)
- 数组结构
- 链表结构
- 哈希表结构
- 集合
- List集合
- 特点
- 特有方法
- 子类及其底层数据结构
- LinkedList集合
- Set集合
- 特点
- 没有特有方法
- 子类及其底层数据结构
- LinkedHashSet集合
泛型
介绍
在Java语言中,是一种类型参数,可以设置存储数据的类型
解决问题
在创建对象时,明确了集合中所存储元素的类型(限定类型)
- 泛型是使用在代码编写时期的技术方法(编译期技术)
- 泛型在程序运行时,就会被擦除
好处
- 在编译时就对类型做判断,避免不必要的类型转换操作
- 元素类型->Object类型
- 精简代码,不用调用特有方法来转型,避免发生错误
- Object类型->需要的类型
- Object类型->需要的类型
使用
- 泛型类
public class 类名<T>{
}
//当不确定类中的成员变量使用什么类型时,可以用泛型表示
public class 泛型类<T>{
private T 变量;
}
//在创建泛型类对象时,明确类型
泛型类<String> 对象 = new 泛型类<>();
//泛型类中成员变量的类型为:String
- 泛型接口
public interface 接口名<A>{
}
//当不确定接口中某个方法参数使用什么类型,或者方法的返回值使用什么类型时,可以用泛型表示
public interface 泛型接口<A>{
public void method(A a);
}
//情况1:在子类编写时,指定接口上泛型的具体类型
public class 子类 implements 泛型接口<String>{
public void method(String a){
}
}
//情况2:在子类编写时,没有指定接口上的泛型。意味着:子类也使用和接口相同的泛型(子类:泛型类)
public class 子类<A> implements 泛型接口<A>{
public void method(A a){
}
}
子类<String> 对象 = new 子类<>();
//创建子类对象时,明确了泛型的类型
- 泛型方法(非泛型类)
修饰符 <泛型> 返回值类型 方法名(泛型 参数){
//方法体
}
//当前类没有声明泛型类,但该类中的方法参数或方法返回值不确定类型时:使用泛型方法
public <T> void method(T param){
}
//当调用该方法时,向方法中传递参数的类型,就是泛型的类型
通配符
? 表示任意类型
通常在开发中,?是和泛型的上下限一起使用
泛型的下限
指定泛型中的最小类型
<? super 最小类型>
泛型的上限
指定泛型中的最大类型
<? extends 最大类型>
注:集合中泛型不支持多态
数据结构
定义
是一个存储数据的排列方式
常见的数据结构
栈(先进后出)
队列(先进先出)
数组结构
定义:数组在内存中是一块连续存储数据的空间
特点:查询快,增删慢
ArrayList底层就是使用数组结构
链表结构
在内存中是使用节点存储数据
节点:数据+地址
特点:有头有尾
分类:
- 单向链表:只能从头到尾
- 双向链表:可以从头到尾,也可以从尾到头(提高查询效率)
代表集合:LinkedList
哈希表结构
底层:使用大小为16的数组+链表组成的存储方式
存储数据的方式:就是根据对象的地址或者属性结合哈希算法算出int类型的哈希值 Object.hashCode()
- 判断:计算出的存储位置上是否有元素存在
- 没有元素存在,直接存储
- 有元素存在 拿要存储的元素和已经存储的元素进行比较 Object.equals()
- 相同:属于重复元素,不存储
- 不相同:再次拿当前存储空间作为算法因子,进行哈希算法,计算新的存储空间;如何重复上述操作
哈希值的特点:
- 同一个对象多次调用hashCode()方法返回的哈希值是相同的
- 默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,不同对象的哈希值有可能相同(比如:“abc”,“cba”,“bca”)
优化:从JDK1.8开始,使用数组+链表/红黑树(当链表的长度>8时,自动把链表转换为红黑树)
集合
体系划分
- Collection(接口)
- Map(接口)
java.util.Collection集合:是一个接口,无法实例化
- java.util.List集合(接口)
- 常用子类:ArrayList,LinkedList
- java.util.Set集合(接口)
- 常用子类:HashSet,LinkedHashSet,TreeSet
- 常用子类:HashSet,LinkedHashSet,TreeSet
List集合
特点
- 带有索引
- 存储元素的顺序和获取元素的顺序一样(存取有序)
- 可以存储重复元素
特有方法
子类及其底层数据结构
- ArrayList:数组结构
- LinkedList:双向链表
- Vector:数组结构
LinkedList集合
底层结构:双向链表
双向链表:每个节点有三个部分的数据,一个是保存元素数据,一个是保存前一个节点的地址,还有一个是保存后一个节点的地址。查询效率比单向链表高。
特有方法:
Set集合
特点
- 元素没有索引
- 存取元素不保证顺序
- 不能存储重复元素
没有特有方法
方法都来自Collection集合
子类及其底层数据结构
- HashSet:哈希表结构
- LinkedHsahSet:链表+哈希表结构
- TreeSet:红黑树
LinkedHashSet集合
底层结构:哈希表+链表结构
哈希表保证无重复元素
链表保证存取元素顺序有序