2.Collection、泛型

-Collection集合

1.请简述集合框架。

集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map。

Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List和java.util.Set。其中,List的特点是元素有序、元素可重复。Set的特点是元素无序,而且不可重复。List接口的主要实现类有java.util.ArrayList和java.util.LinkedList,Set接口的主要实现类有java.util.HashSet和java.util.TreeSet。

 

2.集合的继承体系

3.Add(E e)其中这个E,看你用的集合类型,它就是什么类型。

集合当中的最高接口:java.util.Collection接口

         子接口List:可以重复,有先后顺序,有索引值。

常用的实现类:ArrayList LinkedList Vector

         子接口Set:不可以重复,不保证先后顺序,没有索引值。

扫描二维码关注公众号,回复: 2726299 查看本文章

常用的实现类:HashSet LinkedHashSet TreeSet

 

Collection接口当中的常用方法:

         (以下四个返回动作为boolean添加add、删除remove、包含contains、是否为空isEmpty、

清空clear、长度size、变成数组toArray

 


-Iterator迭代器

**迭代**:即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。

 使用迭代器遍历集合。

         Iterator<String> iter = coll.iterator();

         while (iter.hasNext()) {

                   System.out.println(iter.next());

         }

注意:在使用迭代器遍历集合的过程当中,一定要避免直接通过集合改变其中元素的个数。
如果不听话,不乖,那么将会发生ConcurrentModificationException并发修改异常。


-增强for

请简述迭代器的实现原理

当遍历集合时,首先通过调用集合的iterator()方法获得迭代器对象,然后使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素。

Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,在调用Iterator的next()方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。

 

 

                   增强for循环(也称for each循环)是**JDK1.5**以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。

Itrable:代表的是一种能力,可以产生迭代器,而itrator:就是迭代器;而为什么for-each能支持迭代器?因为Collection继承了itrable这个接口。

注意:没有索引值,所以无法直接修改;但是确实可以调用方法;

可以通过其他方法间接改变;

引用类型数据,地址和对象不能换,能根据方法改变内容。        

·基本数据值不能变。

 

增强for循环

         1. 支持数组

         2. 支持java.lang.Iterable实例(例如集合)

         格式:for (数据类型 变量名称 : 数组或Iterable实例) {...}

         注意:没有索引值

         语法糖:         对于数组来说,其实底层就是普通的fori循环。

                                     对于Iterable来说,其实底层就是迭代器。

 

 

-泛型

Collection虽然可以存储各种对象,但实际上通常Collection只存储同一类型对象。例如都是存储字符串对象。因此在JDK5之后,新增了**泛型**(**Generic**)语法,让你在设计API时可以指定类或方法支持泛型,这样我们使用API的时候也变得更为简洁,并得到了编译时期的语法检查。

泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型。

泛型的名称用什么都可以,一般推荐使用大写字母。
泛型代表一种尚不确定的类型,所有本类范围之内都能用这个泛型当做不确定的类型进行使用。
什么时候才能确定这个泛型?
当创建泛型类对象的时候,就可以确定。

 

泛型的三种用法:

         1. 泛型类:             class 类名称<泛型>                                   创建对象的时候确定

         2. 泛型接口             interface 接口名称<泛型>             要么实现类直接指定泛型是谁;要么实现类也是一个泛型类

         3. 泛型方法             修饰符 <泛型> 返回值类型 方法名称(参数类型 参数名称) {方法体}

 

使用泛型的好处:
1. 保证类型统一,确保类型安全。
2. 将可能发生的类型安全问题,从运行期提前到编译期。

(有问题尽量在javac的时候就暴露出来最好,别等到java运行时再暴露)
3. 省去向下转型的麻烦。
4. 让代码模板化。

泛型类举例:

 

工厂类

零件类01

零件类02

产品类

 

泛型接口举例

泛型接口

泛型类实现泛型接口

实现类A

实现类B

产品类

泛型方法

举例:编写一个泛型方法,接收一个任意引用类型的数组,并反转数组中的所有元素

泛型的通配符:其实就是问号“?”

相当于一个万能的接收器,但是不能做万能钥匙

 

         <?>:随便,谁都行。

         <? extends 类>:只能是指定的类,或者其子类。(上限,最高不能超过这个类。)

         <? super 类>:只能是指定的类,或者其父类。(下限,最低不能低于这个类。)

举例1

举例2

斗地主案例

         与集合相关的工具类:java.util.Collections(注意有s字母)

         打乱集合的顺序的方法:

         public static void shuffle(List<?> list)

以下仅仅为扩展了解:

  1. 怎么理解类型擦除?变为原始类型
  2. 原时类型:object
  3. 怎么判断这个是否为原始类型?

 

猜你喜欢

转载自blog.csdn.net/qq_40406929/article/details/81435296