第十章集合类总结

目录

10.1 集合类概述

10.2 Collection接口

10.3 List集合

10.3.1  List接口

10.3.2  List接口的实现类

 10.3.3  Iterator迭代器

10.4 Set 集合

10.4.1  Set接口

10.4.2  Set接口的实现类

10.5  Map集合

10.5.1  Map接口

 10.5.2  Map接口的实现类

10.6  集合的使用场合


 

10.1 集合类概述


        java.util包中提供了一些集合类,这些集合类又被称为容器。提到容器不难想到数组,集合类与数组的不同之处是,数组的长度是固定的,集合的长度是可变的;数组用来存放基本类型的数据,集合用来存放对象的引用。常用的集合有List 集合、Set 集合和Map集合,其中List与Set继承了Collction接口,各接口还提供了不同的实现类。上述集合类的继承关系如图10.1所示:

10.2 Collection接口


        Collection接口是层次结构中的根接口。构成Collection的单位称为元素。Collection 接口通常不能直接使用,但该接口提供了添加元素、删除元素和管理数据的方法。由于List接口与Set接口都继承了Collection接口,因此这些方法对List集合与Set集合是通用的。Collection接口的常用方法如图10.1所示:

10.3 List集合

        List集合包括List接口以及List接口的所有实现类。List 集合中的元素允许重复,各元素的顺序就是对象插入的顺序。类似Java数组,用户可通过使用索引(元素在集合中的位置)来访问集合中的元素。

10.3.1  List接口

        List接口继承了Cllection接口,因此包含Colletion中的所有方法,此外,List接口还定义了以下两个非常重要的方法。如图10.2所示:

10.3.2  List接口的实现类


        List接口由于不能直接实例化,因此,在JDK中提供了其实现子类,最常用的实现子类有ArayList类与LinkedList类,分别如下:

(1)  ArrayList类的优点是实现了可变的数组,允许保存所有元素,包括null, 并可以根据索引位置对集合进行快速的随机访问;缺点是向指定的索引位置插入对象或删除对象的速度较慢,因为ArayList实质上是使用数组来保存集合中的元素的,在增加和删除指定位置的元素时,虚拟机会好建新的数组,效率低,所以在对元素做大量的增删操作时不适合使用ArayList集合。

(2)  LinkedList类采用链表结构保存对象,这种结构的优点是便于向集合中插入和删除对象,需要向集合中插入、删除对象时,使用LinkedList类实现的List 集合的效率较高;但对于随机访问集合中的对象,使用LinkedList类实现List集合的效率较低。

使用List集合时通常声明为List类型,可通过不同的实现类来实例化集合。

例如,分别通过ArrayList、LinkedList 类实例化List集合。代码如下:

  1. List<E> list = new ArrayList<>();

  2. List<E> list2 = new LinkedList<>();

 在上面的代码中,E代表Java中的泛型。例如,如果集合中的元素为字符串类型,那么E可以修改为String。

 例 10.1 代码:

package java10;

import java.util.ArrayList;
import java.util.List;

public class ListTest {
    public static void main(String[] args) { // 主方法
        List<String> list = new ArrayList<>(); // 创建集合对象
        // 向集合添加元素
        list.add("a"); 
        list.add("b");
        list.add("c");
        int i = (int) (Math.random() * list.size()); // 获得0~2之间的随机数
        System.out.println("随机获取数组中的元素:" + list.get(i));
        list.remove(2); // 将指定索引位置的元素从集合中移除
        System.out.println("将索引是'2'的元素从数组移除后,数组中的元素是:");
        for (int j = 0; j < list.size(); j++) { // 循环遍历集合
            System.out.println(list.get(j)); // 获取指定索引处的值
        }
    }

}

 运行结果:

 10.3.3  Iterator迭代器


        在使用了for循环遍历List集合中的元素,那么有没有其他更加快捷有效的遍历集合中元素的方法呢?答案是肯定的,在java.util 包中提供了一个Iterator 接口,该接口是一个专门对Colletion进行迭代的迭代器,其常用方法如图10.3所示:

 

 程序中使用Iterator迭代器时,可以使用Collection接口中的iterator()方法返回一个Iterator对象。

 例 10.2 代码:

package java10;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class IteratorTest {
    public static void main(String args[]) {
        Collection<String> list = new ArrayList<>(); // 实例化集合类对象
        // 向集合添加数据
        list.add("a"); 
        list.add("b");
        list.add("c");
        Iterator<String> it = list.iterator(); // 创建迭代器
        while (it.hasNext()) { // 判断是否有下一个元素
            String str = (String) it.next(); // 获取集合中元素
            System.out.println(str);
        }
    }

}

 运行结果:

10.4 Set 集合

Set 集合中的对象不按特定的方式排序,只是简单地把对象加入集合中,但 Set 集合中不能包含重复对象。Set 集合由 Set 接口和 Set 接口的实现类组成。

10.4.1  Set接口

        Set接口是一个不包含重复元素的集合,由于其继承了Collction接口,因此包含Collection 接口的所有方法。

  由于Set集合中不允许有重复元素出现,因此,在向Set集合中添加元素时,需要先判断元素是否已经存在,再确定是否执行添加操作。例如HashSet的流程如图10.3所示: 

10.4.2  Set接口的实现类


Set接口常用的实现类有HashSet类与TreeSet类,分别如下:

(1) HashSet是Set接口的一个实现类,它不允许有重复元素。HashSet主要依据哈希算法直接将元素指定到一个地址上。当向HashSet 集合中添加一个元素时,会调用equals方法来判断该位置是否有重复元素。判断是通过比较它们的HashCode来进行比较的。HashSet集合的常用方法都是重写了Set接口中的方法。此集合允许保存null。

(2) TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,因此,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,也可以制定排序规则,让集合按照我们想要的方式进行排序。TreeSet 类新增的方法如图10.4所示,此集合不能保存null。

 例10.3代码:

package java10;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSetTest {
    public static void main(String[] args) {
        Set set = new HashSet();// 创建Set集合
        set.add("a");// 向集合中添加数据
        set.add("b");
        set.add("c");
        set.add("c");
        Iterator<String> it = set.iterator();// 创建迭代器
        while (it.hasNext()) {// 遍历HashSet集合
            String str = (String) it.next();// 获取集合中的元素
            System.out.println(str);
        }
    }
}
 

运行结果:

 

    从上面的运行结果可以看出,遍历出的Set集合中只有3个元素,而代码中通过add方法添加了c、c、a和b4个元素,造成这种结果的原因是Set集合中不允许有重复元素,而添加的4个元素中有两个相同的c,所以编译器默认只添加了一个c元素,另外一个并没有执行添加操作。 

10.5  Map集合


        在现实生活中,每辆车都有唯一的车牌号,通过车牌号可以查询到这辆车的详细信息,这两者是一对一的关系,在应用程序中,如果想存储这种具有对应关系的数据,则需要使用JDK中提供的Map接口。Map接口没有继承Collection接口,其提供的是key到value的映射。Map 中不能包含相同的key,每个key只能映射一一个value,另外,key还决定了存储对象在映射中的存储位置,但不是由key对象本身决定的,而是通过一种 “ 散列技术”进行处理,产生一个散列码的整数值来确定存储对象在映射中的存储位置。Map集合包括Map接口以及Map接口的所有实现类。

10.5.1  Map接口

        Map按口提供了将key映射到值的对象。一个映射不能包含重复的key,每个key最多只能映射个值。Map接口的常用方法及说明如图10.4所示:

 

 10.5.2  Map接口的实现类


Map接口常用的实现类有HashMap和TreeMap两种,分别如下:

(1)  HashMap类是基于哈希表的Map接口的实现,此实现提供所有可选的映射操作,并允许使用null值和null键,但必须保证键的唯-性。HashMap通过哈希表对其内部的映射关系进行快速查找。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

(2)  TreeMap类不仅实现了Map接口,还实现了java.util.SortedMap接口,因此,集合中的映射关系具有一定的顺序。但在添加、删除和定位映射关系时,TreeMap 类比HashMap类性能稍差.由于TreeMap类实现的Map集合中的映射关系是根据键对象按照定的顺序排列的, 因此不允许键对象是null。

例 10.4代码:

 

package java10;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class qw {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();// 创建Map实例
        map.put("ISBN-978654", "Java从入门到精通"); // 向集合中添加对象
        map.put("ISBN-978361", "Android从入门到精通");
        map.put("ISBN-978893", "21天学Android");
        map.put("ISBN-978756", "21天学Java");
        Set<String> set = map.keySet(); // 构建Map集合中所有key对象的集合
        Iterator<String> it = set.iterator(); // 创建集合迭代器
        System.out.println("key值:");
        while (it.hasNext()) { // 遍历集合
            System.out.print(it.next()+"\t");
        }
        Collection<String> coll = map.values(); // 构建Map集合中所有values值集合
        it = coll.iterator();
        System.out.println("\nvalues值:");
        while (it.hasNext()) { // 遍历集合
            System.out.print(it.next()+"\t");
        }
    }

}

 运行结果:

 

10.6  集合的使用场合


        前面介绍了java中最常见的3种集合: List集合、Set集合和Map集合,那么在实际开发中,具体何时应该选择哪种集合呢?这里我们总结了以下原则:

(1) List集合关注的是索引,其元素是顺序存放的,例如一个班的学生成绩,成绩可以重复,就可以使用List集合存取。

(2) Set集合关注唯一性,它的值不允许重复,例如每个班的学生的学号,每个学生的学号是不能重复的。

(3) Map集合关注的是唯一的标识符(KEY),它将唯一的键映射到某个元素,例如每个班学生的学号与姓名的映射,每个学号对应一个学生的姓名,学号是不能重复的,但是学生的姓名有可能重复。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值