1、JavaJava高级程序设计高级程序设计第第2 2章章 JavaJava集合框架集合框架2.1 应用场景2.6 课后小结2.2 相关知识 2.7 课后习题2.3 实施过程2.8 上机实训2.4 拓展知识2.5 拓展训练2.1 应用场景在Java编程时,常常需要集中存放多个数据。当然我们可以使用数组来保存多个对象。但数组长度不可变化;而且数组无法保存具有映射关系的数据。为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),就要使用Java提供的集合类。JDK提供了大量优秀的集合实现供开发者使用,合格的程序员必须要能够通过功能场景和性能需求选用最合适的集合,这就要求开发者必须熟
2、悉Java的常用集合框架类。2.2 相关知识2.2.1 集合框架2.2.2 Java集合框架2.3.3 Java集合框架的使用2.2.1 集合框架在现实生活中,集合被理解为:很多事物凑在一起;在。数学中,的集合:为具有共同属性的事物的总体。通常情况下,我们把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合。通常集合有两种表示法,一种是列举法,比如集合A=1,2,3,4,另一种是性质描述法,比如集合B=X|0X100且X属于整数。集合论的奠基人康托尔在创建集合理论给出了许多公理和性质,这都成为后来集合在其他领域应用的基础。2.2.2 Java集合框架在Java语言中,Java语言的设计者对
3、常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为Java集合框架(JavaCollectionFramework),。如图2-1所示。2.2.3 Java集合框架的使用Java程序员在具体应用时,不必考虑数据结构和算法的实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了,这样就大大提高了编程效率。2.3 实施过程2.3.1 List的使用2.3.2 Set的使用2.3.3 Map的使用2.3.1 LIST的使用1.List接口List继承自Collection接口。List是一种有序集合,List中的元素可以根据索引(顺
4、序号:元素在集合中处于的位置信息)进行取得/删除/插入操作。跟Set集合不同的是,List允许有重复元素。对于满足e1.equals(e2)条件的e1与e2对象元素,可以同时存在于List集合中。2.List实现类List接口的实现类主要有ArrayList,LinkedList,Vector,Stack等。2.3.2 SET的使用1.Set接口Set 是继承于Collection的接口。java中的set接口有如下的特点:不允许出现重复元素;集合中的元素位置无顺序;有且只有一个值为null的元素。2.Set接口的实现类实现了Set接口的主要有HashSet、TreeSet、LinkedHas
5、hSet。HashSet依赖于HashMap,它实际上是通过HashMap实现的。HashSet中的元素是无序的。TreeSet依赖于TreeMap,它实际上是通过TreeMap实现的。TreeSet中的元素是有序的。2.3.3 MAP的使用1.Map接口Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value;。Map中的键值对以Entry类型的对象实例形式存在;。键建(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个键最多只能映射到一个值。Map支持泛型,形式如:Map。Map中使用
6、put(K key,V value)方法添加。2.已知实现类在java.util包中接口 Map 存储键值对,作为一个元组存入。元组以键作为标记,键相同时,值覆盖。类型参数:K-此映射所维护的键的类型;V-映射值的类型;其已知实现类:为HashMap、TreeMap。2.4 拓展知识1.Vector前面我们已经提到,Java设计者们在对之前的容器类进行重新设计时保留了一些数据结构,其中就有Vector。用法上,Vector与ArrayList基本一致,不同之处在于Vector使用了关键字synchronized,将访问和修改向量的方法都变成同步的了,所以对于不需要同步的应用程序来说,类Arra
7、yList比类Vector更高效。2.StackStack,栈类,是Java2之前引入的,继承自类Vector。3.HashTableHashTable和前面介绍的HashMap很类似,它也是一个散列表,存储的内容是键值对映射,不同之处在于,HashTable是继承自Dictionary的,HashTable中的函数都是同步的,这意味着它也是线程安全的,另外,HashTable中key和value都不可以为null。上面的三个集合类都是在Java2之前推出的容器类,可以看到,尽管在使用中效率比较低,但是它们都是线程安全的。下面介绍两个特殊的集合类。4.ConcurrentHashMapConc
8、urrent,并发,从名字就可以看出来ConcurrentHashMap是HashMap的线程安全版。同HashMap相比,ConcurrentHashMap不仅保证了访问的线程安全性,而且在效率上与HashTable相比,也有较大的提高。关于ConcurrentHashMap的设计,我将会在下一篇关于并发编程的博客中介绍,敬请关注。5.CopyOnWriteArrayListCopyOnWriteArrayList,是一个线程安全的List接口的实现,它使用了ReentrantLock锁来保证在并发情况下提供高性能的并发读取。2.5 拓展训练任务要求:实现省市两级联动。任务需求:构建信息录入
9、界面,完成人员基本信息的录入工作。其中籍贯中涉及的“省、市/县”能实现联动,即:选择“省”时,“市”会根据选择的“省”做相应的变换。任务设计:省市/县的信息存放在CityMap类中,InputFrame类为界面类,TestInputFrame为测试类。其类图如图2-5-1所示。2.6 课后小结到这里,对于Java集合框架的总结就结束了,还有很多集合类没有在这里提到,更多的还是需要大家自己去查去用。通过阅读源码,查阅资料,收获很大。Java集合框架主要包括Collection和Map两种类型。其中Collection又有3种子类型,分别是List、Set、Queue。Map中存储的主要是键值对映
10、射。规则集Set中存储的是不重复的元素,线性表中存储可以包括重复的元素,Queue队列描述的是先进先出的数据结构,可以用LinkedList来实现队列。效率上,规则集比线性表更高效。ArrayList主要是用数组来存储元素,LinkedList主要是用链表来存储元素,HashMap的底层实现主要是借助数组+链表+红黑树来实现。Vector、HashTable等集合类效率比较低但都是线程安全的。包java.util.concurrent下包含了大量线程安全的集合类,效率上有较大提升。2.7 课后习题三、简答题1.Java集合框架是什么?说出一些集合框架的优点?2.Java集合框架的基础接口有哪些?3.Iterator是什么?3.遍历一个List有哪些不同的方式?4.如何决定选用HashMap还是TreeMap?5.ArrayList和LinkedList有何区别?6.ArrayList和Vector有何异同点?