您的位置:首页 > 编程语言 > Java开发

Java基础-->集合框架

2014-10-07 13:32 211 查看
第一节   集合框架的概述

一、概述:

1、简述:

      所谓集合,就是为方便对多个对象的操作,对对象进行存储。集合就是存储对象最常用的一种方式。

2、集合与数组的区别:

      数组:可存储同种类型的数据,但长度固定,也可存储基本类型的数据

      集合:只可存储对象,长度可变,类型可以不同。

3、集合的特点:

      只用于存储对象,长度可变,也可存不同类型的对象。

      集合是一个接口,将每种容器的共性提取,形成的一个体系。

4、数据结构:

      由于每种容器对数据的存储方式都各不相同,所以出现了不同的容器。此种存储方式称之为数据结构。



二、集合体系如图:



三、集合中的共性方法:

下面从增删改查等方面对这些共性发方法进行简单介绍:

说明:

   a.add方法中的参数类型是Object,以便于接收任意类型的对象

    b.集合中存储的都是对象的引用(即地址)。

1、增加:

   add(Object obj);   ----->  添加元素

2、删除:

   remove();      ----->  删除集合中指定参数的元素

   removeAll();   ----->  删除当前集合中与另一集合相同的元素,即只保留与另一集合不同的元素

   clear();       ----->  清空集合中的元素,集合还存在

3、获取集合长度:

   size();        ----->  获取集合长度,即集合元素的个数

4、修改:

   set(int index,e);  ----->  将指定位置(index)上的元素修改为给定的参数e

5、判断:

   boolean contains(e); ----->  判断给定元素e是否存在于集合中

6、迭代器:iterator()   ----->  集合取出元素的方式

   boolean hasNext();   ----->  判断是否还有下一个元素

   next();              ----->  取出下一个元素



示例:







四、Collection接口包含的子类

Collection接口包含List与Set等子类

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

Set:元素是无序的,元素不可重复

第二节   List集合

一、概述:

List集合包含三个子类:ArrayList、LinkedList以及Vector等。

具体区别如下:

1、ArrayList:底层的数据结构时数组结构

      特点:查询速度很快,因为有索引(角标),但增删速度稍慢。是线程不同步的。

2、LinkedList:底层使用的是链表数据结构

      特点:增删速度很快,但查询速度稍慢,因为每一个元素都链接到前一元素。

3、Vector:底层是数组结构,JDK1.0出现,比较老。

      特点:增删查询都很慢,被ArrayList替代了,线程是同步的。



二、对于List集合特有的方法:

凡是可操作角标的方法都是该体系特有的方法,基本方法和Collection中的一样。

1、增加:
   add(int index,e);               ----->  在指定位置增加给定的元素
   addAll(int index,Collection);   ----->  在指定位置增加给定集合中的所有元素,若省略位置参数,则在当前集合的后面依次添加元素

2、删除:
   remove(int index); ----->  删除集合中指定位置上的元素

   
3、修改:
   set(int index,e);  ----->  将指定位置(index)上的元素修改为给定的参数e

4、查询:
   get(int index);    ----->  获取指定位置上的元素

   indexOf(e);        ----->  通过指定元素获取其在集合中的位置

   subList(int from,int to);    ----->  获取从from到to位置上的元素

   Iterator listIterator();     ----->  返回Iterator接口类型值





注:
1、listIterator是List特有的迭代器,是Iterator子接口。在迭代时,不可通过集合对象的方法操作集合中的元素,因为会发生ConcurrentModficationException异常。所以,在迭代时,只能用迭代器的方法操作,可Iterator方法是有限的,若想要其他操作如增删改写等,就需要使用子接口,即ListIterator,该接口只能通过List集合的listIerator方法获取。
2、在迭代时,循环中的next()调用一次,就要对hasNext判断一次,不可判断一次调用两次。
3、List集合判断元素是否相同,一句的是元素的equals方法,其中,contains中就是调用的equals方法。

arraylist实现iterator原码解释:



三、Vector类:

Vector中有种特殊的取出方式,即为枚举

1、枚举和迭代器十分相似,其实两者是一样的,由于枚举的名称以及方法名都过长,因此,就被迭代器取代了。这里就不过多的介绍了。



四、LinkedList类特有方法:

一)JDK1.6之前的方法

1、增加:

   addFirst(obj);   ----->  在集合头部添加给定的元素

   addLast(obj);    ----->  在集合尾部添加给定的元素

2、获取:

   getFirst();   ----->  获取集合第一个元素,若集合中没有元素,则出现NoSuchElementException

   getLast();    ----->  获取集合最后一个元素,若集合中没有元素,则出现NoSuchElementException

   

3、删除:

   removeFirst();  ----->  获取并删除集合第一个元素,若集合中没有元素,则出现NoSuchElementException

   removeLast();   ----->  获取并删除集合最后一个元素,若集合中没有元素,则出现NoSuchElementException

二)JDK1.6出现的替代方法:

1、增加:
   offerFirst(obj);   ----->  在集合头部添加给定的元素

   offerLast(obj);    ----->  在集合尾部添加给定的元素

2、获取:
   peekFirst();   ----->  获取集合第一个元素,若集合中没有元素,则返回null
   peekLast();    ----->  获取集合最后一个元素,若集合中没有元素,则返回null
   
3、删除:
   pollFirst();  ----->  获取并删除集合第一个元素 ,若集合中没有元素,则返回null
   pollLast();   ----->  获取并删除集合最后一个元素,若集合中没有元素,则返回nul

arraylist实现iterator原码解释

三、Vector类:

Vector中有种特殊的取出方式,即为枚举

1、枚举和迭代器十分相似,其实两者是一样的,由于枚举的名称以及方法名都过长,因此,就被迭代器取代了。这里就不过多的介绍了。

四、LinkedList类特有方法:

一)JDK1.6之前的方法

1、增加:

   addFirst(obj);   ----->  在集合头部添加给定的元素

   addLast(obj);    ----->  在集合尾部添加给定的元素

2、获取:

   getFirst();   ----->  获取集合第一个元素,若集合中没有元素,则出现NoSuchElementException

   getLast();    ----->  获取集合最后一个元素,若集合中没有元素,则出现NoSuchElementException

   

3、删除:

   removeFirst();  ----->  获取并删除集合第一个元素,若集合中没有元素,则出现NoSuchElementException

   removeLast();   ----->  获取并删除集合最后一个元素,若集合中没有元素,则出现NoSuchElementException

二)JDK1.6出现的替代方法:

1、增加:
   offerFirst(obj);   ----->  在集合头部添加给定的元素

   offerLast(obj);    ----->  在集合尾部添加给定的元素

2、获取:
   peekFirst();   ----->  获取集合第一个元素,若集合中没有元素,则返回null
   peekLast();    ----->  获取集合最后一个元素,若集合中没有元素,则返回null
   
3、删除:
   pollFirst();  ----->  获取并删除集合第一个元素 ,若集合中没有元素,则返回null
   pollLast();   ----->  获取并删除集合最后一个元素,若集合中没有元素,则返回nul



第三节  Set 集合

一、概述:

1、Set集合的特点:

1)集合中的元素师无需的(存入和取出的顺序不一定一致),且元素不可重复。

2)Set集合的功能和Collection集合的是一样的,并没有什么特别的方法。

这里主要说一下关于HashSet和TreeSet两种集合的方法和特点:

二、HashSet类

1、特点:

   底层数据结构时哈希表,且元素取出方式只有迭代器方法

2、哈希表简介:

1)哈希表是按照哈希值的大小进行排列的,如果两个哈希值不同,则大的值放后面;如果两个哈希值相同,则再用equals方法比较两个元素的对象是否相同,如果不同,则将第二个值顺延,两个值串起来,放在同一个位置上。

2)取值时是按照哈希值取出来的。

3)哈希值的取值方式:哈希值存入哈希表中,哈希表也称散列表。散列表是存放记录的数组。具体来说,散列表是根据散列函数H(Key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”,作为这条记录在表中的存储位置,这种表表称为散列表,这一映象过程就称为散列造表或散列,所存储位置称为散列地址(这是百度百科上的内容)。我的理解是:存入的对象的地址是通过提取其信息摘要,通过散列函数计算而获得的一个关键码(Key)即哈希值,然后将这个值存入哈希表,而哈希表的存值方式是按照哈希值的大小顺序存储的,并且在这个哈希表中有自己的索引,但是哈希表的取值方式并不是按照索引的方式取出的。取出方式是按照哈希表中特有的算法取出的哈希值(注意,现在说的是哈希值,不是元素的取出),这些算法有直接寻址法、折叠法、平方取中法以及其他的一些方法等等。具体是按哪种算法查找的,我并不太清楚,所以,取出的哈希值可能就不是按照哈希值的大小顺序取出的了。

3、HashSet如何保证元素的唯一性:

通过元素的两个方法hasCode和equals方法来完成的。

如果元素的hashCode的值相同,才会判断equals是否为true。如果元素的hashCode值不相同,就不会调用equals方法了。

注:对于判断元素是否存在和删除(或添加)。依赖的方法是元素的hashcode和equals方法。



HashSet常见方法:



三、TreeSet类:

1、特点:

1)底层的数据结构为二叉树结构(红黑树结构)

2)可对Set集合中的元素进行排序,是因为:TreeSet类实现了Comparable接口,该接口强制让增加到集合中的对象进行了比较,需要复写compareTo方法,才能让对象按指定需求(如人的年龄大小比较等)进行排序,并加入集合。

java中的很多类都具备比较性,其实就是实现了Comparable接口。

注意:排序时,当主要条件相同时,按次要条件排序。

3)二叉树示意图:



2、保证元素唯一性的依据:

实现的compareTo方法的返回值,是正整数、负整数或零,则两个对象较大、较小或相同。相等时则不会存入。

3、两种比较方式:

      排序有两个要素:元素和集合

1)第一种排序方式:自然排序

      让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法,这种方式也称为元素的自然排序或默认排序方式。





2)第二种排序方式:比较器

      当元素自身不具备比较性是,或者具备比较性,却不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时就有了比较方式(即参阅构造函数)。

当两种排序方式都存在时,以比较器为主。

      如何构造比较器:定义一个类,实现Comparator接口,覆盖compare方法。

注:字符串本身具备比较性,但是它的比较方式可能不是所需要的,这时,就只能使用比较器了。





第四节  Map 集合

一、概述:

1、简述:

      Map<K,V>集合是一个接口,和List集合及Set集合不同的是,它是双列集合,并且可以给对象加上名字,即键(Key)

2、特点:

1)该集合存储键值对,一对一对往里存

2)要保证键的唯一性。

二、方法简介:

Map集合中的方法和上面集合的方法是很相似的,这里不一一都具体说明了,用示例的形式体现一下:

1、添加:      添加单个元素:put(k key,V value); 添加一个集合:putAll(Map<? extends K,? extends V> m)

2、删除:      获取并移除:remove(Object key); 清空集合中元素:clear (Object key)

3、判断:      判断集合是否为空: isEmpty()  ; 键对应的值是否存在:containsKey(Object key); 值对应的键是否存在:containsValue(Object obj)  ---->     返回boolean类型

4、获取:      获取单个元素:get(Object key); 获取长度:size();    获取Map集合中的所有值(value),返回Conllection集合。

注:

a.也可以通过get()方法的返回值来判断一个键是否存在,通过返回null来判断。

b.其中put方法:如果出现添加相同的键,那么后添加的值会覆盖原有键对应的值,并且该方法返回被覆盖的值即原值。

示例:



三、Map集合中的子类:

1、HashTable:特点 -- > 底层是哈希表数据结构,不可存入null键和null值。该集合是线程同步的,效率较低

2、HashMap:特点   -- >  底层是哈希表数据结构,允许使用null值和null键。该集合是线程同步的,效率较高

3、TreeMap:特点     -- > 底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键值进行排序,和Set很像,其实,Set集合的底层就是使用了Map集合。

四、两种获取集合元素的方法:

        重点说一下获取方法中的两个:keySet()和entrySet()方法

1、keySet()方法获取元素

原理:将Map集合中的所有键存入到Set集合中,因为Set集合具备迭代器,所以可以用迭代方式取出所有的键,再根据get方法获取每一个键对应的值。简单说就是:Map集合---->Set集合 ---->迭代器取出

示例:



2、entrySet()方法获取元素:

原理:将Map集合中的映射关系存入到了Set集合中,而这个映射关系的数据类型是Map.Entry,在通过迭代器将映射关系存入到Map.Entry集合中,并通过其中的getKey()和getValue()放取出键值。

示例:



补充:关于Map.Entry

Map是一个接口,其实,Entry也是一个接口,它是Map的子接口中的一个内部接口,就相当于是类中有内部类一样。为何要定义在其内部呢?

原因:a.Map集合中村的是映射关系这样的两个数据,是先有Map这个集合,才可有映射关系的存在,而且此类关系是集合的内部事务。

            b.并且这个映射关系可以直接访问Map集合中的内部成员,所以定义在内部。

五、Map集合的应用及扩展:

1、何时使用Map集合:当量数据之间存在着映射关系的时候,就应该想到使用Map集合。

2、示例:

获取该字符串中的字母出现的次数,如:"sjokafjoilnvoaxllvkasjdfns";希望打印的结果是:a(3)c(0).....

通过结果发现,每个字母都有对应的次数,说明字母和次数之间有映射关系。测试如下:





第二节   List集合

一、概述:

List集合包含三个子类:ArrayList、LinkedList以及Vector等。

具体区别如下:

1、ArrayList:底层的数据结构时数组结构

      特点:查询速度很快,因为有索引(角标),但增删速度稍慢。是线程不同步的。

2、LinkedList:底层使用的是链表数据结构

      特点:增删速度很快,但查询速度稍慢,因为每一个元素都链接到前一元素。

3、Vector:底层是数组结构,JDK1.0出现,比较老。

      特点:增删查询都很慢,被ArrayList替代了,线程是同步的。

二、对于List集合特有的方法:

三、Vector类:

Vector中有种特殊的取出方式,即为枚举

1、枚举和迭代器十分相似,其实两者是一样的,由于枚举的名称以及方法名都过长,因此,就被迭代器取代了。这里就不过多的介绍了。

四、LinkedList类特有方法:

一)JDK1.6之前的方法

1、增加:

   addFirst(obj);   ----->  在集合头部添加给定的元素

   addLast(obj);    ----->  在集合尾部添加给定的元素

2、获取:

   getFirst();   ----->  获取集合第一个元素,若集合中没有元素,则出现NoSuchElementException

   getLast();    ----->  获取集合最后一个元素,若集合中没有元素,则出现NoSuchElementException

   

3、删除:

   removeFirst();  ----->  获取并删除集合第一个元素,若集合中没有元素,则出现NoSuchElementException

   removeLast();   ----->  获取并删除集合最后一个元素,若集合中没有元素,则出现NoSuchElementException

二)JDK1.6出现的替代方法:

1、增加:
   offerFirst(obj);   ----->  在集合头部添加给定的元素

   offerLast(obj);    ----->  在集合尾部添加给定的元素

2、获取:
   peekFirst();   ----->  获取集合第一个元素,若集合中没有元素,则返回null
   peekLast();    ----->  获取集合最后一个元素,若集合中没有元素,则返回null
   
3、删除:
   pollFirst();  ----->  获取并删除集合第一个元素 ,若集合中没有元素,则返回null
   pollLast();   ----->  获取并删除集合最后一个元素,若集合中没有元素,则返回nul
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 基础