Collection接口,是集合类的最基本接口。集合类(Collection)顾名思义,代表一组元素(Elements)的集合。继承该接口的主要是List、Set和Queue三个接口,不提供直接继承的类。
由此可知,Set、List或Queue都是集合类,是一组元素的集合,与Map有本质性的区别。Map是键值对的形式,而Collection则是单纯的元素(类似数组)。
所有实现Collection接口的类必须实现两个标准的构造函数,一个是空函数,用于创建一个空的Collection;另一个是带有Collection参数的构造函数,用于复制使用。
遍历
Collection的任何实现类均实现了Iterable<E>接口,因此都支持iterator()方法,该方法将返回一个迭代子,从而可逐一访问Collection的每一个元素。
Iterator it = collection.iterator(); // 获得一个迭代子 while(it.hasNext()) { Object obj = it.next(); // 得到下一个元素 }
List
List是有序的Collection,类似于数组,因此是可以重复元素的。实现listIterator接口,多了一些add之类的方法。
特点:
1)有顺序
2)允许重复
LinkedList
单向链表,(类似链表、队列)可以在任何位置高效的插入和删除元素,实现了Queue接口,可以当做队列使用
特点:
1)元素可以重复
2)有顺序
3)允许有null
4)没有同步方法
ArrayList
利用Object[]实现的List。(类似可变大小的数组)随机读写(自动增长50%)
特点:
1)元素可以重复
2)有顺序
3)允许有null
4)没有同步方法
Vector
线程安全的list,采用synchronized(this)进行加锁,内部采用Object[]实现。非常类似ArrayList(自动增长100%)
特点:
1)元素可以重复
2)有顺序
3)允许有null
4)同步的
注意:在使用时,由于使用同一个iterator,但是vector是同步的。所以在使用Iterator时改变了vector会出现异常
Stack
特点:继承自Vector,对Vector进行简单封装实现了一个基本的栈
Set
Set是一种不包含重复元素的Collection,即任意两个元素进行equals判断结果均是false,Set可以有null,但是最多一个null元素。
特点:
1)没有顺序(TreeSet 用二叉排序树存储 排序),这里指的顺序是输入顺序与存储顺序是否相同
2)不允许重复
HashSet
内部包含了一个HashMap,添加元素X时相当于向HashMap添加一个<X,DummyObject>二元组。
特点:
1)元素不重复
2)无顺序,采用hash散列的方式存储
(插入顺序与存储顺序不一致)
3)非线程同步的
4)可以为null元素
LinkedHashSet
内部包含了一个LinkedHashMap对象,同HashSet原理
特点:
1)元素不重复
2)无顺序
3)非线程同步的
4)可以为null元素
TreeSet
内部包含了一个TreeMap对象。同HashSet原理
特点:
1)元素不重复
2)非线程安全
3)不可以为null元素
Map
Map没有继承Collection接口,Map提供的Key-Value键值对的存储。其中Key是不可以重复的,必须唯一,通过Key查找的Value可以重复或null。
作为key的对象必须实现hashCode和equals方法。因为在判断时候,根据key的hashcode方法判断,若不相等,则认为是不同对象;若相等则判断equals,若相等则是同一对象,不相等则是不同对象。
若对象相等,则必须hashcode和equals都为true。若对象equals为true,则hashcode必须相同,且对象为同一对象,因为在同一内存;若对象hashcode相等,则对象不一定相等,还要判断equals。
哈希冲突:两个不同对象的hashcode相同。具体的解决办法参考如下的具体实现。
内嵌类:Entry<K,V>
映射项Key-Value键值对,获得的唯一办法是通过entrySet方法获取entry集合并进行遍历。
遍历
在对Map的遍历中,Map接口提供3种不同的视图,分别是:当做一组Key的集合(keySet());当做一组Value的集合(values());当做一组key-value的集合(entrySet())。
特点:
1)没有顺序(TreeSet 用二叉排序树存储 排序),这里指的顺序是输入顺序与存储顺序是否相同
2)Key必须唯一,Value可以重复
3)key可以为null
HashMap
数组特点:寻址容易,插入删除难;链表特点:插入删除容易、寻址困难。结合链表和数组的优点,产生哈希链表。
特点:
1)key和value均可为null(只允许一条key为null)
2)非同步的
LinkedHashMap
从HashMap派生,利用HashMap实现,与其相比维护的是一个具有双重链表的HashMap,因此支持插入排序或使用排序。
例如:
Map<String, String> m = new LinkedHashMap<String, String>(20, .80f, accessOrder ); m.put("1", "my")); m.put("2", "map")); m.put("3", "test")); m.get("1"); m.get("2");
若accessOrder为true(访问排序)输出 {3=test, 1=my, 2=map};
若accessOrder为false(插入排序)输出 {1=my, 2=map,3=test}
特点同HashMap
HashTable
哈希表
特点:
1)key非空
2)value可以null
3)同步的
TreeMap
基于红黑树实现的Map
特点:
1)根据key排序
2)key和value均为非null
3)非同步的
WeakHashMap
WeakHashMap是一种改进的HashMap,对key实行弱引用。即若key不再被外部引用,则该key可以被回收,对应的Value也会被回收。
用途:简单的缓存表(非同步的)