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

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

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

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

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

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

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

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

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

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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值