------- android培训java培训、期待与您交流! ----------

集合类 

为什么出现集合类:

    面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就要对对象进行存储,集合就是存储对象最常用的一种方式。

数组和集合的不同之处:

    数组虽然也可以存储对象,但长度是固定的;可以存储任意数据类型。

    集合长度是可变的。集合只能存储对象。

集合类的特点:集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

Collection

  |--List:元素是有序的,元素可以重复,因为该集合体系有索引。

    |--ArrayList:底层的数据结构使用的是数组结构。 特点:元素的查询速度很快,但是增删稍慢。线程不同步。

    |--LinkedList:底层的数据结构是链表数据结构。特点:查询速度慢,但是增删操作快速。

    |--Vector :底层是数组数据结构。线程同步。被ArrayList替代了。


 |--Set:元素是无序的(存入和取出的顺序不一定一致),元素不可以重复。

     |--HashSet: 底层数据结构是哈希表。     线程是非同步的

     |--TreeSet :可以对Set集合中的元素进行排序。底层数据结构是二叉树


Collection中的常用方法:


boolean add(Object o):该方法用于向集合里面添加一个元素,若集合对象被添加操作改变了,返回true.

boolean addAll(Collection c):把集合c里面的所有元素添加到指定集合里面去,如果集合对象被添加操作改变了返回true.

void clear():清除集合里面的所有元素,将集合长度变为0。

boolean contains(Object o):返回集合里是否包含指定的元素。

boolean containsAll(Collection c):返回集合里是否包含集合c内所有的元素。

boolean isEmpty():返回集合是否为空(长度是否为0)。

Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素。

boolean remove(Object o):删除集合中指定元素o。

boolean removeAll(Collection c):从集合中删除集合c里面的元素。若删除一个或以上返回true。

boolean retainAll(Collection c):从集合中删除集合c里不包含的元素。

int size():得到集合元素的个数。

Object[] toArray():把集合转成一个数组,所有集合元素变成数组元素。


LinkedList特有方法

    addFirst();    addLast(); 在头/尾增加元素

    getFirst();    getLast(); 获取头/尾元素(获取元素但不删除)如果集合中没有元素,会出现NoSuchElementException

    removeFirst();removeLast(); 获取头/尾元素(但是删除元素)。如果集合中没有元素,会出现NoSuchElementException


在JDK1.6出现了代替方法。

offerFirst();  offerLast();

peekFirst();  peekLast();获取头/尾元素(获取元素但不删除)如果集合中没有元素,则返回null。

pollFirst();  pollLast();获取头/尾元素(但是删除元素)。如果集合中没有元素,则返回null。


Set集合

    Set集合的功能和Collection是一致的。

HashSet是如何保证元素的唯一性的呢?

    是通过元素的两个方法:hashCode和 equals来完成

    如果元素的hashCode值相同,才会判断equals是否为true。

    如果元素的hashCode值不同,不会调用equals。

注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法。


TreeSet保证元素唯一性的依据:

    compareTo方法return 0。

TreeSet排序的第一种方式: 让元素自身具备比较性。

    元素需要实现comparable接口,覆盖compareTo方法。这种方式也称为元素的自然顺序,也叫默认顺序。

TreeSet的第二种排序方式。

    当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。因此定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。当两种排序都存在时,以比较器为主

    定义一个类,实现Comparator接口,覆盖compare方法。

Iterator接口 

主要方法:

    boolean hasNext():若被迭代的集合元素还没有被遍历,返回true.

    Object  next():返回集合的下一个元素.

    void remove():删除集合上一次next()方法返回的元素。(若集合中有多个相同的元素,都可以删掉)

    iterator对于集合才能用,foreach不同,只要是循环都可用。 

模板代码:

Iterator iter = l.iterator();

while(iter.hasNext())

{

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

}

泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个安全机制。

好处:

1、  将运行时期出现问题ClassCastException,转移到了编译时期,方便于程序员解决问题,让运行时期问题减少,更加安全。

2、  避免了强制转换的麻烦操作。

泛型格式: 通过<>来定义要操作的引用数据类型。

注意: ?为通配符,可以理解为占位符。

            ? extends E : 可以接收E类型或者E的子类型。上限。

            ? super E  : 可以接收E类型或者E的父类。下限。

在使用java提供的对象时,什么时候写泛型呢?

通常在集合框架中很常见,只要见到<>就要定义泛型。  

其实<>就是用来接收泛型的。

当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

泛型类定义的泛型,在整个类中有效,如果被方法调用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。

为了让不同方法可以操作不同数据类型,而且类型还不确定,可以将泛型定义在方法上。