泛型:
泛型类的案例:
把泛型定义在类上面
格式:public class 类名<泛型类型1,…>
注意:泛型类型必须是引用类型
定义的时候这里的<>里面到底写什么呢?
这里面的内容仅仅表示的使一种参数数据类型,参数类型是一种变量
既然是一种变量,肯定也是符合标识符命名规则的,可以是任意符合标识符命名规则的名字
//泛型类定义的时候,虽然有泛型,但是在使用的时候,可以不去使用
//不加泛型,默认是Object类型
泛型方法
把泛型定义在方法上
格式:public <泛型类型> 返回类型 方法名(泛型类型 .)
泛型接口:把泛型定义在接口上
泛型的高级用法:
泛型通配符<?>
任意类型,如果没有明确,那么就是Object以及任意的Java类了
<? extends E>
向下限定,E及其子类
<? super E>
向上限定,E及其父类
任意的引用数据类型,如果左边定义的时候没有明确,右边new的时候必须给出明确的类型,否则就是Object类型或者任意引用数据类型
增强for循环
增强for循环是在JDK1.5之后出现的
到目前为止,我们学过哪些是JDK1.5之后再出现的特性呢?
Scanner,枚举,包装类,泛型
增强for循环:
用来简化数组和Collection集合的遍历
格式:
for(元素的数据类型 变量名(自定义) : 数组/Collection集合){
直接使用变量即可,这里变量就是元素。
}
好处:简化数组和Collection集合的遍历
注意事项:在使用使用之前确保遍历的对象不是null
增强for循环本来的目的是遍历增强for循环的,是用来替代迭代器的。
静态导入:
静态导入: 不用写类名,就直接写方法调用
语句格式:import static 包名...类名.方法名;
直接导入到方法级别。
注意事项:
1、导入使用的方法必须是静态
2、导入的时候,最后只需要导入到一个方法名就行
//当静态导入的方法名与本类中的方法名冲突了
//这时候再直接调用的话,调用的是本类中静态方法
可变参数:
可变参数概述:定义方法的时候不知道该定义多少个参数
根据案例我们发现,每当参数增加,就需要新增一个方法,因为参数列表的不一致导致找不到方法。但是这样写。我们很麻烦。
所以java替我们考虑到了这一个问题,提供了一个技术给我们使用:可变参数
格式
修饰符 返回值类型 方法名(数据类型… 变量名){}
注意事项:
1、如果将来传参的参数类型不一致,却想要做一样的操作,可变参数就用不了了,为什么?
数组只能存放同一种数据类型的元素。
2、将来传参的时候,传一个字符串,和若干个int类型的数值,输出这个字符串和若干个int类型的值的和定义的时候,需要将可变参数放到最后一个定义
(Arrays工具类中的一个方法
public static <T> List<T> asList(T... a)返回由指定数组支持的固定大小的列表。)
set相关集合:
Set相关集合:
public interface Set<E> extends Collection<E>不包含重复元素的集合,元素唯一且无序(存储和取出的顺序不一致)。
Set集合中的元素为什么不会重复?看源码
(会不会去重取决于该元素类中有没有重写hashCode()和equals()方法)
使用Set集合存储自定义对象
//创建Set集合对象
//创建学生对象
//向集合中添加自定义对象
//遍历集合
集合的嵌套遍历:
集合的嵌套遍历:
例:现在数加科技共有3个班级十六期,十七期,十八期。每一期都有不同的学生,十六期有5个学生,十七期有3个学生,十八期有4个学生。用集合去存储并且遍历每个学生。(最终选择ArrayList去存储) 过程:
//创建一个集合代表是数加科技
//创建十六期集合对象
//创建十七期集合对象
//创建十八期集合对象
//创建十六期学生对象
//创建十七期学生对象
//创建十八期学生对象
//将十六期学员添加到十六期集合中
//将十七期学员添加到十七期集合中
//将十八期学员添加到十八期集合中
//将各期添加到数加集合中
//遍历集合获取元素并打印
//使用增强for循环遍历
LinkedHasSet
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>
哈希表和链表实现了Set接口,具有可预测的迭代次序。 这种实现不同于HashSet,它维持于所有条目的运行双向链表。
哈希表保证了元素的唯一
双链表保证了迭代的顺序
TreeSet
public class TreeSet<E>:
A NavigableSet 实现基于TreeMap的元件使用其有序自然排序,或由Comparator(比较器排序)集合创建时提供,这取决于所使用的构造方法。请注意,此实现不同步。