0819总结
泛型
是对类、接口或者方法的一个约束,泛型其实就是一个参数来替换所有的类型 (泛型中没有继承)
使用场景:当不知道集合存什么类型的数据时
一般表示泛型的字母有:
实例化集合泛型的语法:
//在jdk1.7之后
ArrayList<Integer> list = new ArrayList<>();
注:后面<>里的可以省略,前面不可以省略
//在jdk1.7之前
ArrayList<Integer> list = new ArrayList<Integer>();
//前后的泛型类型必须一样
没有泛型
好处:默认如果没有添加泛型,默认的是Object, 所有的数据类型都可以存
坏处:不安全,会报错:java.lang.ClassCastException(强制类型转换错误)
有泛型
好处:可以避免强制转型;把错误由运行出错提前到编译出错
坏处:只能够存一种数据类型
注:如果使用迭代器来遍历集合,迭代器的泛型必须与集合的泛型是一样的
泛型约束类
public class ArrayList<E> { }
注意:
1、写这个类的具体的信息的时候,没有给其具体的类型
2、在new 的时候给其具体的类型
3、给类加泛型之后,类里所有的都可以使用这个泛型
泛型约束方法
public <T> void printWorld(T t){ }
作用:对方法进行约束
注意点:
在调用其方法的时候就知道其泛型
静态方法不能使用类的泛型的
泛型约束接口
public interface Iter <T> { }
接口有泛型的两种表现形式:
1、实现类确定具体的泛型了
2、实现类不能够确定其泛型(也就是在 new 的时候确定其泛型) 语法如下:
public class IterUpdateImpl<T> implements IterUpdate<T> {}
//开发里常用
泛型的通配符
? :表示任意的泛型
特点:
1、不能在实例化的时候给?泛型
2、一般是作为参数的类型
<? extends E> //表示 E 泛型的子类或者是它本身
<? super E> //表示 E 泛型的父类或者它本身
Set
1、父类是Collection
2、不包含重复的元素
3、没有顺序(不能使用普通的for循环)
4、常规的方法跟 Collection 是一样的
HashSet
1、基层存的是由哈希表结构进行存(查询速度快)
2、不能包含重复的元素,可以包含空("")的数据
用于检查是否重复,执行了两个方法: HashCode 方法和 equals() 方法【可以直接用Alt+Insert点出来】
3、没有顺序(不能使用普通的for循环,并且存入的数据顺序与取出来的顺序不一样)
HashSet的常规方法:
添加:add(E e)
对set集合进行遍历:
// 没有泛型转换成数组
Object [] obj=set.toArray();
for (Object o:obj){
System.out.println(o);
}
// 带泛型转换成数组
Set <String >set=new HashSet<String>();
String [] str=set.toArray(new String[]{});
for (int i=0;i<str.length;i++){}
System.out.println(set);
// 迭代器
Iterator ite=set.iterator();
while (ite.hasNext()){
System.out.println(ite.next());
}
// 增强 for 循环
for (Object obj :set){
System.out.println(obj);
}
注意:因为没有索引,所以不能够使用普通for循环
set 集合不能有重复的值
实际上是使用map来进行存,是以键值对来进行存 map的键是不能够重复的。(实际上调用了两个方法,一个是 hashcode 方法 ,一个 equals())
LinkedHashSet(有序)
父类是HashSet(无序)
存的方式是 采用的数据+ 双重链表式 第一种链表用于来把相同hash值的元素进行串联;第二种链表用于记录每一个值的顺序(也就是它是有序的,存与取都是一致的
作业
若类里面的成员属性用 final 修饰:
1、只使用有参构造 。
2、使用无参构造的话,要先给该成员属性赋初始值,否则报错!