> 文章列表 > 集合与泛型

集合与泛型

集合与泛型

集合

 Collection 接口中包含了所有对集合的基本操作

如果在子类中不重写它们,就是执行Collection中的方法

下面是基本操作

 

所有的Collection实现类都重写了toStrin()方法,使得sout(集合名)能输出集合中所有元素

集合的遍历

使用IteratoI

Iteratol的对象也叫做迭代器,想要遍历一个集合,需要先获取该集合的迭代器,再通过while循环和itertol里的方法:

hasNext:是否有元素

next()返回该指针指向的元素,并且指针向后移一位

1.迭代器遍历完,指针不会复位

2.循环中只能使用一次next()方法

3.迭代器遍历时,不能用集合的方法进行增加或删除元素,会导致指针指向位置异常

如var it = a.iterator();

在遍历循环内部只能用it.remove()进行删除,删除刚刚遍历到的元素

而不能使用a.remove();

foreach循环遍历集合元素

语法:    for(变量类型  变量名  :   集合名){}

快捷方式: 集合名.for

Lambda遍历集合元素

首先创建集合的构造器it,再it.forEachRemaining(变量名->system.out.println(变量名));

List集合

了解List集合中提供的几种方法

//void add(int index,element),在调用该方法的集合中的指定索引位置插入指定元素

//void remove(int index)  删除指定位置元素并且返回该被删除的元素

//void set(int index,element)  将索引处的元素修改成指定值,并返回修改前的值

//void get(int index)返回索引处的元素

List集合遍历

首先获取迭代器

var 变量名 = 集合名.listIterator();

比之前collectio里面的iterator多了一个list,功能多了hasPrevious,判断指针处是否有元素

Previous();使指针向前移动一位并返回当前元素,注意是先移动再返回值

泛型

当使用集合时,因为存入集合的元素都被当成object型,使用的时候需要强转,还可能发生编译错误,所以引入泛型这一概念,在集合关键词后面加<E>,E表示不同的数据类型,也可以是引用类型。这样在将元素推入集合时,系统会先判断要添加的变量类型是否与集合泛型一致,一致的话才添加成功,

泛型类

当类里面的很多方法的参数都是不确定的,那么就可以在定义类时,在类名后面加上<E>,

那么该类的方法的参数都可以用E来表示参数类型,等到实际传入参数时才确定其类型

泛型方法

当类中只有少数几个方法不确定参数类型时,可以直接在方法修饰符后面加上<E>,表示参数类型都是E

定义工具类时要将构造器私有化

方法要用public static来修饰,期望能用工具类名.方法来调用

在使用时,当把String类型的集合填到方法形参时,方法就确定了参数类型都要是String

泛型接口

如何定义泛型接口

修饰符 interface 接口名 <想要的类型>

如何使用带泛型的接口

使用带泛型的接口(如List就是带泛型的接口)有2个方法

 

 具体操作:

1.在实现类定义的时候,在接口名后面加上<想要的类型>

 如果这样的话,在使用实现类去创建对象时,不需要再指定对象的类型

 

2.在定义实现类的时候,在接口名后面加上<E>,并且在实现类名后面也加上<E>

 用实现类创建对象

 

泛型不具备继承性,但数据具备继承性

简单的说,就是指定某个方法形参只能放某种类型集合,那么这种类型的子类不能当作该方法的形参

但是在指定一个集合只能装某种类的元素时,该类型的子类也能放入该集合

先定义一个ye类,然后fu继承他,zi再继承fu类

 定义一个使用泛型方法,形参只能是ye类

 定义三个类型分别为ye,fu,zi的集合

尝试让ye的子类使用way方法

 报错了,因为形参泛型不具备继承性

再尝试将ye的子类fu,和fu类的子类zi 都放入list1集合(定义时指定泛型,只能是ye类)

 可以看到ye的子类能放入list1集合

如何让一个方法能传入及其子类*(通配符)

泛型方法的弊端 

在尖括号内加  ?extends ye,表示可以传递ye和ye所有的子类类型 

 

在尖括号内加  ?super zi,表示可以传递zi和zi所有的父类类型