1 集合

Java集合大致分为SetListMapQueueSet代表无序、不可重复的集合;List为有序、可重复集合;Map为有映射关系的集合;Queue代表队列关系集合。

       集合类主要由两个接口派生而成:CollectionMap,关系树如图1.11.2所示:

 

collection_uml

1.1

 

1.2

有两种方式遍历集合元素:Iteratorforeach;但是迭代过程中,集合不能被修改。否则会抛出java.util.ConcurrentModificationException异常。Iterator可以通过iterator.remove()来删除元素(删除的是上一个迭代元素)

1.1 Set

Set的特征:元素不能重复,判断依据为equals方法

1.1.1 HashSet/LinkedHashSet

特征:采用hash算法存取元素,有较好的读取性能。

HashSet判断两个元素相等的依据是两个对象的hashcodeequals返回值均相等。因此重写对象的equals方法返回true时,一定要保证它们的hashcode值也相等。

       LinkedHashSet维护了元素的位置信息。迭代访问时效果佳。

1.1.2 TreeSet

元素是排序的。如果放入的元素是对象,则该对象类需要实现Comparable接口指定排序依据。

注意:元素如果是可变对象,修改元素的属性将影响集合特性,如元素无法删除等。所以放入的元素最好是不可变对象。

定制排序:默认TreeSet为自然排序;通过传入Comparator改变排序规则:

 

  1. TreeSet ts = new TreeSet(new Comparator(){  
  2.  
  3.        @Override  
  4.  
  5.        public int compare(Object arg0, Object arg1) {  
  6.  
  7.               //compare  
  8.  
  9.        }});  
  10.    
  11.  
  12.  

 

1.1.3 EnumSet

枚举集合,元素必须来自枚举类。

1.2 List

判断元素相同的依据是equals返回值

 

  1. class A {  
  2.  
  3.     public boolean equals(Object o) {  
  4.  
  5.         return true;  
  6.  
  7.     }  
  8.  
  9. }  
  10.    
  11.  
  12.  

 

  1. ArrayList<String> list = new ArrayList<String>();  
  2.  
  3. list.add(“android”);  
  4.  
  5. list.remove(new A());// first element was deleted  
  6.   

结果第一个元素被删除!

1.2.1 实现类

实现均是基于数组,封装了可再分配的数组Object[],默认大小10,大数据量时,最好一次性赋予较大容量以提高性能。

void trimToSize(): List的容量调整为实际使用大小,可节省空间。

Vector线程安全的(现已不推荐使用)

1.3 Queue

1.3.1 LinkedList

实现ListDeque接口,即是一个双向列表。内部以链表实现,增、删效率高。

1.3.2 PriorityQueue

按元素大小排序的队列。

1.4 Collection类使用建议

对于经常增加、删除的操作,采用linkedList效果佳

对于访问频繁的,数组类型集合效率高

遍历集合时,ArrayListVector等数组实现的结构采用随机访问get(i)方式效率较高,而LinkedList采用Iterator

1.5 HashMapHashtable

他们的区别类似于ArrayListVector

1.HashMap是非线程安全,而Hashtable是线程安全

2,HashMap可以null作为keyvaluehashtable反之

如果以对象作为key,需重写对象的equalshashcode方法

1.5.1 LinkedHashMap

保持了插入时的顺序。

1.5.2 Properties

将属性文件与map关联,由于文件的键值均为字符串,因此propertieskeyvalue为字符串类型。

1.5.3 TreeMap

mapkey是以TreeSet实现的,key相同的判断依据是equalscompareTo都相同

1.5.4 WeakHashMap

HashMapvalue做成了弱引用

1.5.5 IdentityHashMap

如名字所述,key的要求是必须”==”相同,即要求是同一对象或值

1.6 工具类

Collections中有大量帮助方法,可以分为排序、查找、同步控制等,例举比较实用的:

void sort(List list); 排序

int binarySearch(List list,Object obj);查找指定元素的下标,要求list已排序。

synchronizedXXX(XXX xxx); 创建同步集合。XXX可以是ListSetMap