Java集合类主要由两个接口派生出:Collection和Map
Collection中,Set为无序集合且元素不可重复、List为有序集合且元素可重复、Queue为队列
Map中的Key不可重复,通过Key获取Value
Set集合中的元素不允许重复,靠equals()方法来判断两元素是否相同。Set提供了Iterator方法执行迭代任务。HashSet判断两元素相同的标准是:两个元素通过equals方法比较相等,而且两个对象的HashCode方法返回值(元素在HashSet中的存储位置)也相等。LinkedHashSet也是根据HashCode值决定元素的存储位置,但它同时使用链表维护元素的次序,用链表来维护内部顺序。
TreeSet是SortedSet的唯一实现,正如SortedSet名字所述,TreeSet确保集合元素处于排序状态;TreeSet并不以元素插入顺序排序,而是以元素实际值排序。EnumSet是一个专为枚举类设计的集合类,EnumSet中的集合元素也是有序的,EnumSet以枚举值在Enum类中的定义顺序来决定集合元素的顺序。
Set的几个子类都不是线程安全的,如想保持同步,可用Collections类的SychronizedSortedSet方法来包装该集合:SortedSet s=Collections.synchronizedSortedSet(new TreeSet()).
List接口。List集合代表一个有序集合,并允许使用重复的元素。List接口提供了Iterator和ListIterator执行迭代任务,ListIterator可执行向前迭代。
ArrayList和Vector的元素个数默认为10,而元素个数可根据需要自动增加。ArrayList与Vector的区别是:ArrayList是线程不安全的,多线程访问时,要手动保证集合的同步性。Vector是线程安全的,所以其性能比ArrayList要低(其是早期JDK中的实现,后被ArrayList代替)。Vector性能低,所以一般不推荐使用,但Vector有一个Stack子类,模拟栈的实现,提供Pop()push()等方法。
Queue接口。Queue用于模拟了队列这种数据结构,提供add()、poll()等方法。Deque是Queue的子接口,实现双向队列,提供addFirst、addLast、pop、push等方法。而LinkedList实现了List及Deque接口,其可用来当做栈、双向队列、List来使用。PriorityQueue队列中元素顺序不是按加入队列的顺序,而是按元素大小排列。
Map用于保存具有映射关系的数据。
跟Set很类似,Map也提供了几乎一样的子类:HashMap、LinkedHashMap、SortedMap、TreeMap、EnumMap等实现类和子接口。而方法有Put(key,value)(增加元素),get(key),remove(key)等。
Map中包括了一个子类:Entry。该类封装了一个Key-value对,Entry包含三个方法:getKey(),getValue(),SetValue()
我们可以把Map理解成一个特殊的Set,该Set包含的集合元素是Entry对象。
HashMap和Hashtable实现类
HashMap和Hashtable都是接口Map的典型实现类,他们之间的关系完全类似于ArrayList与Vector的关系:HashTable是一个古老的Map实现类。
HashMap不是线程安全的,而Hashtable是线程安全的,所以Hashtable的性能较低,但多线程访问Map时,使用Hashtable实现类更好。
HashMap可以使用Null作为Key或Value,而Hashtable不允许Null作为Key或Value,这会引发NullPointerException异常。
尽量少用Hashtable。
SortedMap接口和TreeMap实现类
同Set一样,Map接口派生出SortedMap子接口,而SortedMap有一个TreeMap实现类。
WeakHashMap实现类:实现机制与HashMap基本相似,但其Key只保留对对象的弱引用。
IdentityHashMap实现类:实现机制与HashMap基本相似,但在处理两个Key相等时比较独特:当且仅当Key1==Key2时, 才认为相等。
EnumMap:是一个与枚举类一起使用的Map实现。
操作集合的工具类:Collections
Java提供了一个操作Set、List和Map等集合的工具类:Collections。该工具类提供了对元素的排序、查询、修改及对集合对象实现同步等方法。
正如前面提到的,Java常用集合推荐的三个实现类:HashSet、ArrayList、HashMap都是线程不安全的。Collections提供了synchronizedList、synchronizedSet、synchronizedMap等方法来实现同步,如:List l=Collections.synchronizedList(new ArrayList);