学习java第十五天
泛型:对类、接口后者方法的约束,用于方法参数、数据类型不确定时
泛型的时候:
好处:
1.避免强制转型 2.把错误由运行出错提前到编译出错
坏处:
只能够存一种数据类型
注 :如果使用迭代器来遍历集合,迭代器的泛型必须与集合的泛型是一样的
泛型中没有继承
泛型一般用以下字母表示:T、W、Q、K、V、E。
泛型类:描述这个类的时候不给其具体的类型
定义:
class 类名 <泛型类型1,泛型类型2,..>{
}
使用:
类名 <引用数据类型> 对象名 =new 类名 <引用数据类型>( );
在使用这个类时确定泛型。
在实例化集合类泛型的语法:
jdk1.7之后:
集合类 <引用数据类型> 对象名 = new 集合实现类 < >( );
jdk1.7之前:
集合类 <引用数据类型> 对象名 = new 集合实现类 <引用数据类型>( );
泛型方法定义:
非静态:
访问修饰符 <泛型> 返回值类型 方法名(泛型 参数1,...){
}
静态:
静态的方法不能使用类的 泛型!
访问修饰符 static <泛型> 返回值类型 方法名(泛型 参数1,...){
}
.
接口泛型:
访问修饰符 interface 接口名 <泛型类型1,泛型类型2,...>{
}
.
泛型接口使用:
1、实现类不是泛型类,而是确定了接口泛型的类。(看List)
访问修饰符 class 实现类类名 implements 接口名 <具体类型>{
}
2、声明的类还是一个泛型类,泛型与接口泛型一致 (看Scanner)
访问修饰符 class 实现类类名 <泛型1> implements 接口名 <泛型1> {
}
通配符 ? :任意的泛型
特点:
- 不能在实例化的时候给?泛型
- 一般是作为参数的类型
这种表示 是 E 泛型的子类或者是它本身:<? extends E>
这种表示是 E 泛型的父类或者它本身:<?super E>
集合Set:
- Collection 下的子接口
- 不能包含重复的元素
- 无序(不能使用普通的for循环)
方法跟 Collection 一样
对set集合进行遍历 :
1.第一种使用没有泛型 转换成数组的方式
Object [] obj =set.toArray();
for (Object o :obj){
System.out.println(o);
}
2.使用带泛型,转换成数组的方式
String [] s2 = set.toArray(new String[]{});
System.out.println(Arrays.toString(s2));
3.使用迭代器的方式
Iterator iter=set.iterator();
while (iter.hasNext()){
System.out.println(iter.next());
}
4.使用增强for 循环的方式
for (Object o :set){
System.out.println(o);
}
注:set集合因为没有索引,不能够使用普通for循环
HashSet类:是Set的实现类
- 哈希表结构进行存储 (查询速度快)
- 不能包含重复的元素,元素加进去是执行了两个方法用于判断是否重复:第一个是HashCode方法 第二个是equals()方法
- 无序,存储的数据和读出来的数据顺序不一样。
常规方法:public boolean add(E e):添加指定元素
LinkedHashSet类:是HashSet的子类,但是它有序!
存的方式是采用的数据+ 双重链表式 第一种链表式用于来把相同hash值的元素进行串联
第二种链表式来记录每一值的顺序
也就是它是有序的:存与取都是一致的
总结:学习的这个泛型,我对知识点还是有点懵懵懂懂的,一开始看泛型,觉得类似于方法的重载,只知道这个泛型是不确定的类型,调用时我们给定的引用数据类型,避免产生强制转换的麻烦。但是再深入的使用,想要提高代码的重用时却还是生疏。