day15
泛型:
泛型 :
是对,类 ,接口后者方法的一个约束,泛型其实就是一个参数来替换所有的类型 (泛型中没有继承)
场景:
当不知道集合存什么类型的数据的时候就使用泛型
泛型里一般表示的之母:
T E W K V
在实例化集合泛型的语法:
在jdk1.7之后 ArrayList list = new ArrayList<>(); (注意点就是后面<>里的可以省略,前面不可以进行省略)
在jdk1.7之前 ArrayList list = new ArrayList();必须这样写, 前后的泛型类型必须是一样
泛型来约束类
public class ArrayList
语法: 访问修饰符 关键字(class) 类名<泛型>{
类里的具体的内容
}
注意点 :
- 在 写这个类的具体的信息的时候,没有给其具体的类型
2. 也就是在new 的时候给其具体的类型
3.当给类加泛型之后,类里所有的都可以使用这个泛型
// 需求 模仿 LinkedList 实现 addFrist() 和 remove() 在描述这个类的时候不能给其具体的泛型
给方法来定义泛型:
作用: 也就是对方法来进行约束
语法 : 访问修饰符<泛型> 返回值类型 方法的名称(参数(参数可以使用泛型的数据类型)){
方法体
}
注意点:
在调用其方法的时候知道其泛型
静态方法:
也可以加泛型:
需求:
定义一个 方法 ( 有一个数组, 数组里的泛型是不固定, 要实现数组里元素值进行交换)
注意点:
静态方法不能使用类的泛型的,只能有方法的泛型
泛型接口:
语法:
访问修饰符 interfance 接口的名称{
抽象方法
}
泛型接口的实现类分两种:
1、接口在被一个类实现后这个类还是一个泛型类,可以直接使用泛型接口中的泛型符号,而且泛型符号必须和接口中定义的符号一致
2、接口在一个类实现后,可以把泛型替换为明确数据类型
泛型通配符
Set:
Set
- 父类是Collection
- 不能包含重复的元素
- 无序(不能使用普通的for循环)
- 常规的方法跟 Collection 是一样的
Set集合的遍历:
1.第一种使用没有泛型 转换成数组的方式
2.使用带泛型,转换成数组的方式
3.使用迭代器的方式
4.使用增强for 循环的方式
注意点:因为没有索引,索引不能够使用普通for循环
set集合不能够值重复的原因:
实际上是使用map来进行存,是以键值对来进行存 map的键是不能够重复的
==> 实际上调用了两个方法, 一个是hashcode 方法 , 一个equals()
HashSet存储特点:
- 基层存 是由哈希表结构进行存(查询速度快)
2. 不能包含重复的元素,可以包含"" 的数据 用于检查是否重复,执行了两个方法 第一个是HashCode方法 第二个是equals()方法
3.无序(不能使用普通的for循环) :存入的数据顺序与取出来的顺序不一样
HashSet保证元素唯一性原理的总结:
1、某个对象obj,在即将要存储到HashSet集合的时候,首先计算obj的hashCode值
2、在集合中的所有元素的哈希值,都和obj的哈希值不同,说明在集合中不存在obj,可以直接将obj存储到HashSet中
3、在集合中有若干元素的哈希值,和obj的哈希值相同,并不能说明obj已经存在于集合中,需要使用equals判断obj是否和那些与自己哈希值相同的元素是否相等
4、如果这些元素所有的和obj比较equals之后,都不相等,那么就说明obj不存在于集合中,可以将obj存储到HashSet中
5、如果这些元素有任意一个和obj比较equals之后,发现相等,那么就说明obj已经存在于集合中,所以obj就不能存储,存储失败。
LinkedHashSet:
是HashSet的一个子类,和HashSet保证元素唯一的原理相同。
将每个元素在存储的时候,都记录了前后元素的地址
效果:
可以根据存储元素的顺序,将元素取出
应用:
既需要保证元素的唯一,又需要保证原来的顺序,就可以考虑LinkedHashSet类型
存的方式是采用的数据+ 双重链表式
第一种 链表式用于来把相同hash值的元素进行串联
第二种 链表式来记录每一值的顺序