数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作的方法。 在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为Java集合框架(JavaCollectionFramework)。 Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了,这样就大大提高了编程效率。
1.java.util包中提供了一些集合类,这些集合类又成为容器。提到容器不难想到数组,集合类与数组的不同之处是,数组的长度是固定的,容器的长度是可变的;数组用来存放基本类型的数据,集合用来存放对象的引用。常用的集合类有List集合,Set集合和Map集合。其中List集合和Set集合继承了Collection接口,各接口还提供了不同的实现类。
2. 先说Set和List:
2.1. Set子接口:无序,不允许重复。List子接口:有序,可以有重复元素。具体区别是
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。<对应类有 HashSet,TreeSet>
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。<相应类有 ArrayList,LinkedList,Vector>
Set和List具体子类:
2.2. <实例比较>
HashSet:以哈希表的形式存放元素,插入删除速度很快。
ArrayList:动态数组,LinkedList:链表、队列、堆栈。
Vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。
3.Collection接口:
Collection接口是层次结构中的根接口。构成Collection的单位称为元素。Collection接口通常不能直接使用,但该接口提供了添加元素,删除元素,管理数据的方法。由于List接口与Set接口都继承了Collection接口,因此这些方法对List集合与Set集合是通用的。遍历集合,通过使用迭代器实现。Collection接口中的iterator()方法可返回在此Collection进行迭代的迭代器。
3.List集合
List集合包括List接口以及List接口的所有的实现类。List集合中的元素允许重复,各元素的顺序就是对象插入的顺序。类似java数组,用户可通过使用索引(元素在集合中的位置)来访问集合中的元素。
List接口继承了Collection接口中的所有方法,同时它自己也实现了两个重要的方法:get(int index),set(int index,Object obj)。
List接口常用实现类有ArrayList类与LinkedList类。
ArrayList类实现了可变的数组,适合用于按位置查找
LinkedList类采用链表结构保存对象,适合用于添加删除元素
4.Set集合
Set集合中的对象不按特定的方式排序,只是简单地把对象加入集合中,但Set集合中不能包含重复对象。Set集合由Set接口和Set接口的实现类组成。Set接口继承了Collection接口,因此包含Collection接口的所有方法。
Set集合常用实现类有HashSet类和TreeSet类。
HashSet类中大部分操作都是O(1)
TreeSet类大部分操作都是O(log(n)),但是有序,实现了SortedSet
5.Map集合
Map集合没有继承Collection接口,其提供的是key到value的映射。Map中不能包含相同的key,每个key只能映射到一个value。key还决定了存储对象在映射中的存储位置,但不是有key对象本身决定的,而是通过一种“散射技术”进行处理,产生了一个散列码的整数值,散列码通常用作一个偏移量,该偏移量对应分配给映射的内存区域的起始位置,从而确定存储对象在映射中的存储位置。Map集合包括Map接口以及Map接口的所有实现类。
Map接口常用的实现类有HashMap和TreeMap。建议使用HashMap类实现Map集合,因为由HashMap类实现的Map集合添加和删除映射关系效率更高。
HashMap类是基于哈希表的Map接口的唯一性。
TreeMap类不仅实现了Map接口,还实现了SortedMap接口。