02-Collection/泛型

一、Collection
1.1、概述:
  集合是java中提供的一种容器,可以用来存储多个数据。
集合和数组的区别:
  数组的长度是固定的。集合的长度是可变的。
  数组中存储的同一类型的元素,可以存储基本数据类型值。集合存储的是对象。且对象的类型可以不一致。本质上存的是Object类型。

1.2、集合框架:

集合按照存储接口分为两大类:
  单列集合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。

1.3、Collection常用功能
Collection是所有单列集合的父接口。定义了单列集合(List\Set)通用的一些方法。
一个集合类中应该有什么方法呢?
  -->添加,清除,移除,包含,为空?,大小,存储到数组
  public boolean add(E e): 把给定的对象添加到当前集合中 。
  public void clear() :清空集合中所有的元素。
  public boolean remove(E e): 把给定的对象在当前集合中删除。
  public boolean contains(E e):判断当前集合中是否包含给定的对象。
  public boolean isEmpty():判断当前集合是否为空。
  public int size():返回集合中元素的个数。
  public Object[] toArray(): 把集合中的元素,存储到数组中。

二、Iterator迭代器
2.1、Iterator接口
java.util.Iterator。Iterator接口也是Java集合中的一员。
想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作。
  public Iterator iterator():获取集合对应的迭代器,用来遍历集合中的元素的。
迭代的概念:
  即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代
Iterator接口常用方法:
  public E next():返回迭代的下一个元素。
  public boolean hasNext():如果仍有元素可以迭代,则返回 true。
  tips:在进行集合元素取出时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会发生java.util.NoSuchElementException没有集合元素的错误。

2.2、迭代器的实现原理
  调用类型为 t 集合的iterator()方法获得迭代器对象
  然后使用 hashNext() 方法判断集合中是否存在下一个元素
  如果存在,则调用 next() 方法将元素取出
  否则说明已到达了集合末尾,停止遍历元素

Iterator迭代器对象遍历集合时,内部采用指针方式来跟踪集合中的元素。

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

格式:for(元素的数据类型 变量 : Collection集合or数组){ 
    //写操作代码
}


三、泛型
3.1、概述
  集合中是可以存放任意对象的,只要把对象存储在集合后,那么这是它们就会被提升成 Object 类型。
  当我们取出一对象,进行相应操作,这时必须采用类型转换。

Collection虽然可以存储各种类型对象,但是实际上通常Collection只存储同一类型的对象
JDK5后,新增了泛型(Generic)语法,在设计API时可以指定类或方法支持泛型。这样在使用API的时候也变得更加简洁,并得到编译时期的语法检查
泛型:
  可以在类或方法中预支地使用未知的类型
tips:
  一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。

3.2、使用泛型的好处
  1、将运行时期的ClassCastException,转移到编译时期编程编译失败。
  2、避免类型强转的麻烦。
tips:
  泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型。

3.3、泛型的定义和使用
泛型用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。
3.3.1、定义和使用含有泛型的类:
定义格式:

修饰符 class 类名<代表泛型的变量> {  }

在创建对象的时候确定泛型。

3.3.2.含有泛型的方法
定义格式:

修饰符 <代表泛型的变量> 返回值类型 方法名(参数){  } ==> < T >放在返回值类型前面

在调用方法时,确定泛型的类型。

3.3.3、含有泛型的接口
定义格式:

修饰符 interface 接口名<代表泛型的变量> {  }

1、在创建类时确定泛型的类型。
2、或者始终不确定泛型的类型,直到创建对象时,才确定泛型类型。
==>如public class MyImp2<E> implements MyGenericInterface<E>
   MyImp2<String>  my = new MyImp2<String>();    my.add("aa");

3.4、通配符
  当使用泛型类或者接口时,传递的数据中,泛型数据不确定,可使用通配符<?>表示。
  使用了泛型通配符后,只能使用Object类中共性方法。集合中元素类型自身方法无法使用

3.4.1、通配符的基本使用
泛型的通配符:
  不知道使用什么类型的数据类接收的时候,此时可以使用?,?表示通配符。此时只能接收数据,不能往该集合中存储数据。
tips:
  泛型不存在继承关系 Collection<Object> list = new ArrayList<String>();这种是错误的。


3.4.2、通配符的高级使用-->受限泛型
泛型的上限:

格式:类型名称<? extends 类> 对象名称

意义:只能接收该类型其子类
泛型的下限:

格式:类型名称<? super 类> 对象名称

意义:只能接收该类型及其父类型

泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
  public static void getElement1(Collection<? extends Number> coll){}
泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
  public static void getElement2(Collection<? super Number> coll){}

posted @ 2018-11-11 00:02  payn  阅读(180)  评论(0)    收藏  举报