java源码之集合类学习心得和笔记

java源码之集合类学习心得和笔记
一List
1.首先是Vector和ArrayList类,他们都继承了AbstractList并且实现了List,RandomAccess,Cloneable,Serializable等接口。而AbstractList继承了AbstractCollection也实现了List接口。Vector和ArrayList之间的 区别一就是Vector方法都是线程同步的,所以Vector更为安全,相反,其执行效率就会下降。 区别二在于ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。ArrayList:
int newCapacity = (oldCapacity * 3)/2 + 1; 

Vector:
int newCapacity = (capacityIncrement > 0) ?
		(oldCapacity + capacityIncrement) : (oldCapacity * 2);

主要就是这两个区别,剩下来的就是方法的调用不一样。而方法的实现内容都是一样的。

2.再来看LinkedList类,他继承自AbstractSequentialList,而这个类又继承了AbstractList。而AbstractSequentialList主要是用listIterator()去实现了AbstractList中的get,set,add,remove,addAll等方法。LinkedList实现了List,Deque,Cloneable,Serializable等接口。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。

3.AbstractList和AbstractSequentialList最大的区别在于,AbstractList完成的是我们需要随机访问”数据存储(如数组)所需的工作。对于连续的访问数据(如链表),应优先使用 AbstractSequentialList,这里的随机访问代表我们可以随机访问,只有顺序表才可以,而连续的访问数据代表我们必须连续的访问数据,对于链表我们必须连续的访问,不能跳着随机访问,所以说我们在对于链表处理操作时考虑使用AbstractSequentialList类。

二Set
1.HashSet,它继承自AbstractSet,而AbstractSet继承自AbstractCollection,这个AbstractSet也实现了Set接口。而HashSet由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。他的方法不是同步的,也就是不是synchronized的。

2.LinkedHashSet,它继承自HashSet,就是强加了一个顺序,它的几个构造方法调用的是父类的方法。而这个父类就是采用LinkedHashMap来实现的。所以强加了一个顺序。也就是元素插入的顺序来维护集合的链接表。

3.TreeSet,它也继承自AbstractSet,而TreeSet实现了NavigableSet、Cloneable、Serializable接口。它使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。 其中的NavigableSet接口提供了对Set导航的便捷方法。
而TreeSet的构造方法就是创造一个TreeMap,然后把TreeMap对象赋值给TreeSet中的m属性。

三Map
首先Map不是Collection框架下的,它是独立的一个分支。
1.HashMap和HashTable,
区别一:HashMap继承自AbstractMap,并且实现了Map,Cloneable,Serializable接口,而HashTable继承自Dictionary,同样实现了一样的接口。
区别二:HashMap是不安全,HashTable中的方法都是synchronized,也就是线程安全的。
区别三:HashMap支持null值,无论是在值或是键中。HashMap允许null值是指可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。
区别四:HashTable有一个contains(Object value)方法时HashMap没有的,功能和containsValue(Object value)功能一样。
区别五:HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。具体可参见 http://www.chineselinuxuniversity.net/articles/36817.shtml

2.LinkerHashMap,继承自HashMap,但是内部维持了一个双向链表,可以保持顺序。

3.TreeMap,继承自AbstractMap,实现了NavigableMap<K,V>, Cloneable, java.io.Serializable。它使用元素的自然顺序对元素进行排序,或者根据创建map时提供的 Comparator 进行排序,具体取决于使用的构造方法。 其中的NavigableMap接口提供了对Map导航的便捷方法。
具体类之间的关系可见:
http://blog.csdn.net/zztfj/article/details/7563262更全的类之间的关系也可见
http://www.iteye.com/topic/395544(有些小错误)

你可能感兴趣的:(java)