Java的集合框架大致可以分为四个体系 :List/Set/Queue/Map。其中List/Set/Queue来自Collection根接口,Map来自Map根接口。
注意:Iterator迭代Collection集合 ,迭代过程中,避免对collection更改,除非通过Iterator删除(remove),否则会抛出并发修改异常。
Set 存放不重复的元素,并且存放是无序的(即不会保留元素add的顺序)。
set如何判断两个元素是否相同:equals()
HashSet :采用hash算法 (元素的值-->hash值-->位置-->更快地存取)存取元素。
HashSet如何判断两个元素是否相同:equals() + hashCode() 。
注意:如果需要将一个对象放入HashSet,则要重写该对象对应类的equals()和hashCode()。
如何重写hashCode()?
http://nemogu.iteye.com/admin/blogs/1199521
注意:当向HashSet中添加可变对象时要额外注意,如果修改集合中的对象,有可能导致该对象与集合中其他对象相等,从而导致hashset无法准确访问该对象。
Set--SortedSet--TreeSet
TreeSet :红黑树。集合元素根据其实际值处于排序状态。自然排序(元素类实现Comparable接口)和定制排序(TreeSet构造时传入一个Comparator)。
LinkedList :双向队列+栈(pop/push)+list(按索引随机访问元素),底层用链表存储元素,随机访问性能低于ArrayList和Vector,但是迭代,插入和删除性能要高于其他。
Map
HashMap :非线程安全,null可以作为key或者value。
判断key相等:equals返回true,hashCode相等。
LinkedHashMap :以双向链表维护元素插入的顺序。
Map--SortedMap--TreeMap
TreeMap :红黑树对key排序。
WeakHashMap 与HashMap:WeakHashMap的key对象保存了实际对象的弱引用。意味着key所引用的对象没有被其他强引用变量所引用,这些key所引用的对象会被gc回收。
工具类Collections :
Collections.synchronizedMap(Map)
<Long, String> Map<Long, String> java.util.Collections.synchronizedMap(Map<Long, String> m)
Returns a synchronized (thread-safe) map backed by the specified map. In order to guarantee serial access, it is critical that all access to the backing map is accomplished through the returned map.
It is imperative that the user manually synchronize on the returned map when iterating over any of its collection views:
Map m = Collections.synchronizedMap(new HashMap()); ... Set s = m.keySet(); // Needn't be in synchronized block ... synchronized(m) { // Synchronizing on m, not s! Iterator i = s.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); }
ConcurrentHashMap