一、笔记
1.泛型
对,类 ,接口后者方法的一个约束,泛型其实就是一个参数来替换所有的类型 (泛型中没有继承)。
场景: 当不知道集合存什么类型的数据的时候就使用泛型。
泛型里一般表示的之母:
在实例化集合泛型的语法:
在jdk1.7之后 ArrayList<Integer> list = new ArrayList<>(); (注意点就是后面<>里的可以省略,前面不可以进行省略)
在jdk1.7之前 ArrayList<Integer> list = new ArrayList<Integer>();必须这样写, 前后的泛型类型必须是一样
没有泛型的时候:
好处: 默认如果没有添加泛型,默认的是Object, 所有的数据类型都可以进行存
坏处:不安全,会报错(java.lang.ClassCastException) 强制类型转换错误
有泛型的时候:
好处: 1.避免强制转型 2.把错误由运行出错提前到编译出错
坏处: 只能够存一种数据类型
注意点:如果使用迭代器来遍历集合,迭代器的泛型必须与集合的泛型是一样的
用泛型来约束类
public class ArrayList<E>
语法: 访问修饰符 关键字(class) 类名<泛型>{
类里的具体的内容
}
注意点 :
1.在 写这个类的具体的信息的时候,没有给其具体的类型
2.也就是在new 的时候给其具体的类型
3.当给类加泛型之后,类里所有的都可以使用这个泛型<T>
给方法来定义泛型:(对方法来进行约束)
语法 : 访问修饰符<泛型> 返回值类型 方法的名称(参数(参数可以使用泛型的数据类型)){
方法体
}
例子: 给方法加泛型的语法
public <T>void printWorld(T t){
System.out.println(t);
}
注意点:在调用其方法的时候知道其泛型
静态方法:也可以加泛型:
注意点:静态方法不能使用类的泛型的,只能有方法的泛型
接口的泛型:来约束接口
语法:
访问修饰符 interfance 接口的名称<T>{
抽象方法
}
例子:
public interface Iter<T> {
}
如果接口有泛型,实现类有两种表现形式:
1.实现类确定具体的泛型了
2. 实现类不能够确定其泛型(也就是在 new 的时候确定其泛型)
第二种情况的语法: public class IterUpdateImpl<T> implements IterUpdate<T> {}
泛型的通配符 :
? 任意的泛型
特点:
1.不能在实例化的时候给?泛型
2,一般是作为参数的类型
<? extends E> 这种表示 是 E 泛型的子类或者是它本身
<? super E> 这种表示是 E 泛型的父类或者它本身
2.set
常规的方法跟 Collection是一样的
1. 父类是Collection
2. 不能包含重复的元素
3. 无序(不能使用普通的for循环)
子类: HashSet
1. 基层存 是由哈希表结构进行存(查询速度快)
2. 不能包含重复的元素,可以包含"" 的数据 用于检查是否重复,执行了两个方法 第一个是HashCode方法 第二个是equals()方法
3.无序(不能使用普通的for循环) :存入的数据顺序与取出来的顺序不一样
哈希表结构:如图:
HashSet 常规的方法: add(E e) 添加
对set集合进行遍历 :
1.第一种使用没有泛型 转换成数组的方式
Object[] o= set.toArray();//返回的是Object类
for (Object ob:o){
System.out.println(ob);
}
2.使用迭代器的方式
Iterator iter=set.iterator();
while (iter.hasNext()){
System.out.println(iter.next());
}
3.使用增强for 循环的方式
for (Object obj:set){
System.out.println(obj);
}
4.使用带泛型,转换成数组的方式
HashSet<String> set = new HashSet<String>();
set.add("苍老师");
set.add("波多老师");
String [] str = set.toArray(new String[]{});
for(int i =0;i<str.length;i++){
System.out.println(str[i]);
}
注意点:因为没有索引,索引不能够使用普通for循环
set集合不能够值重复 :
原因:实际上是使用map来进行存,是以键值对来进行存 map的键是不能够重复的
==》实际上调用了两个方法, 一个是hashcode 方法 , 一个equals()
如图:
LinkedHashSet(有序): 父类是HashSet(无序)
存的方式是采用的数据+ 双重链表式
第一种链表式用于来把相同hash值的元素进行串联
第二种链表式来记录每一值的顺序
有序的:存与取都是一致的
二、总结
第十五天的学习,今天学习了泛型与Collection的另一个子接口set,HashSet虽然无序,但是LinkedHashSet却是有序的,代码犹如人生,一物降一物,万事总有解决的办法的。加油干!