介绍
Java各种集合类平时用得最多,用活用对需要对各种集合有较深入了解。对于java.util包中一系列重要集合,首先理清相互之间关系(继承),掌握内部结构(看适当源码),各集合类特点,适用环境,遍历集合的迭代模式.…….
集合框架主要由接口、抽象类、和实现类构成。区分各种实现类的标准主要是:元素是否可重复、是否有序。
总览
下图摘自:
http://www.cnblogs.com/xwdreamer/archive/2012/05/30/2526822.html
![]()
![]()
实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等
综述:
- Collection:集合层次中的根接口之一(Map),JDK没有提供该接口的实现类
- Set:接口,继承自Collection。不能包含重复元素,子接口SortedSet是一个按照升序排列的元素Set
- List:接口,继承自Collection。可包含重复元素,有序集合,提供按索引访问的方式,有次序。
- Iterator:接口,所有集合类都实现了Iterator接口,用于遍历集合中元素的接口。
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
详解
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
如:ArrayList
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this(10);
}
/**
* Constructs a list containing the elements of the specified
* collection, in the order they are returned by the collection's
* iterator.
*
* @param c the collection whose elements are to be placed into this list
* @throws NullPointerException if the specified collection is null
*/
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
Collection中每个元素的遍历:使用iterator()方法,该方法返回一个跌代子,用它可以依次访问Collection中的每一个元素。
Iterator iterator=collection.iterator();
while(iterator.hasNext()){
Object obj=iterator.next();
}
List接口
有序Collection;允许有重复元素;通过索引快速访问元素
- LinkedList类:允许null元素,在LinkedList的首部和尾部提供额外的get,remove,insert方法。可用作stack,queue;没有同步方法。多线程访问一个List,需自己实现访问同步。
- ArrayList类:可变大小数组。允许null。没有同步方法。访问元素运行时间为常数{size(),isEmpty(),get(),set()}。添加n个元素需要O(n)时间。(参见:java源码分析之ArrayList,java源码分析之ArrayList)
- Vector类:类似ArrayList,区别是Vector方法时同步的,开销大。
- Stack类:继承自Vector类,实现了一个后进先出的栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用:push和pop方法,peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
ArrayList和LinkedList的区别:http://blog.youkuaiyun.com/qianzhiyong111/article/details/6678035
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于双向链表的数据结构。
2.继承机制:ArrayList继承于AbstractList,LinkedList继承于AbstractSequentialList,而AbstractSequentialList又继承于AbstractList。AbstractSequentialList 实现了“链表中根据index索引值操作链表的全部函数”。
3.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
4.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
Set接口
无序集合, 不允许有重复元素;任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
- HashSet类:而且采用散列的存储方法,没有顺序(元素插入的顺序与输出的顺序不一致)。基于 HashMap 实现,本质和HashMap相同。HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
- TreeSet类:基于TreeMap实现。TreeSet中的元素将按照升序排列,缺省是按照自然排序进行排列。底层基于红黑树实现(自平衡的排序二叉树)。
Map接口
Map没有继承Collection接口,Map提供key到value的映射。Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
- Hashtable类:同步的(线程安全)。Hashtable 继承自 Dictiionary 而 HashMap继承自AbstractMap。HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。不能有null的key和value
- Hashmap类:HashMap是Hashtable的轻量级实现。线程不安全。允许有null的键和值,但是key值只能有一个null值,因为hashmap如果key值相同,新的key, value将替代旧的。(Java集合—HashMap源码剖析)
- TreeMap类:对key排好序的Map; key 就是TreeSet, value对应每个key; key要实现Comparable接口或TreeMap有自己的构造器;
- Properties类::key和value都是String类型,用来读配置文件;
- IdentityHashMap类:利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。用于拓扑保留对象图形转换,如序列化或深层复制。
- WeakHashMap类:种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。
Hashmap和Hashtable的区别:http://blog.youkuaiyun.com/qianzhiyong111/article/details/6677885
HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样;HashTable不允许null值,key和value都不可以,HashMap允许null值,key和value都可以。HashMap允许key值只能有一个null值
HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样;
HashTable使用Enumeration,HashMap使用Iterator。
HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
哈希值的使用不同,HashTable直接使用对象的hashCode
Hash类实现方法中,作为key的对象要正确复写equals和hashCode方法。HashMap中的hasCode()方法继承自Object类:public native int hashCode(),具细节参见:http://www.cnblogs.com/dolphin0520/p/3681042.html
工具类
- Arrays:包含用来操作数组(比如排序和搜索)的各种方法。
- Collections:包装类(工具类/帮助类),不能实例化,就像一个工具类,用于对集合中元素进行排序、搜索以及线程安全等各种操作,服务于Java的Collection框架。主要提供了在 collection 上进行操作的静态方法(同步集合类方法) 。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestCollections {
public static void main(String args[]) {
//注意List是实现Collection接口的
List list = new ArrayList();
double array[] = { 112, 111, 23, 456, 231 };
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
Collections.sort(list);
for (int i = 0; i < array.length; i++) {
System.out.println(list.get(i));
}
// 结果:23.0 111.0 112.0 231.0 456.0
}
}