[Java]集合架构分析
2015-06-17 16:06
417 查看
研究源码可以学到大神的思路和如何写出优雅的代码
下面是我看Java集合源码过程中帮助很大的很厉害的博主
http://www.cnblogs.com/skywang12345/http://blog.csdn.net/ns_code/article/details/35564663
实现的细节和源码的分析我就不多赘述,下面分享一下自己学习过程中的疑惑和集合框架设计的一些思路。
借用一张图
1.List,Set接口都是继承Collection接口,而Map是依赖Collection
原因是List和Set本质上都是一个集合,而Map本质上是一个键值对集合,拆分开来是键集合和值集合。在Map中定义有三个方法
1.1 keyset
public Set<K> keySet();获取所有键集合,因为Map是只承认一对多关系,一个键对应多个值,所以键不能重复,Set接口规定不包含重复的元素;
1.2 values
public Collection<V> values();值集合是集合,而且允许重复。
1.3 entrySet
public Set<Map.Entry<K,V>> entrySet();获取Map中所有Entry的集合,而且不允许重复。根据Entry的Hash值作为判断是否重复的基准,不同对象的Hash值有可能相同,但可能性太低忽略不计。
2.Map接口中定义了内部接口Entry
Map是一个基于链表的数组,其中数组内放的就是Entry。
Map接口中包括的是对数组的操作,例如clear清空数组,entrySet返回包含所有entry的set对象。2.1实现Map接口的抽象类AbstractMap帮我们覆写了其中大部分的方法。
2.2实现 Map.Entry<K, V>接口的抽象类SimpleImmutableEntry(值不可变),SimpleEntry(值可变)位于抽象类AbstractMap内部
2.3在HashMap等AbstractMap的实现子类中,覆盖了AbstractMap中没有重写Map接口中的方法,entrySet、put这些方法。
3.HashTable与HashMap的区别之一在于线程安全,而HashMap也有一个线程安全的类ConcurrentHashMap,它们之间的异同。
3.1HashTable是线程同步的
3.2ConcurrentHashMap是支持线程并发的。
3.3总结 同一个时间段内,只有一个线程能访问HashTable,而可以有多个线程能访问ConcurrentHashMap。
4.HashSet是通过HashMap来实现的
4.1 通过构造HashMap,在其键内储存
HashMap<E, HashSet<E>> backingMap;
4.2 添加元素在键中
@Override public boolean add(E object) { return backingMap.put(object, this) == null; }
4.3 只能通过迭代器遍历HashMap的键集合获得值
@Override public Iterator<E> iterator() { return backingMap.keySet().iterator(); }
5.等补充
相关文章推荐
- 一些有趣的网站
- CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
- 架构师到底要做什么?
- vc学习的一个网站链接
- 软件架构之我见
- 网站分析相关汇总
- 技术文章存档
- Sharepoint2013权限管理之老王乱弹一
- Lucene学习总结之二:Lucene的总体架构
- 【Heritrix基础教程之3】Heritrix的基本架构
- 【搜索引擎基础知识1】搜索引擎的技术架构
- 【搜索引擎基础知识3】搜索引擎相关开源项目及网站
- 【搜索引擎基础知识1】搜索引擎基本架构
- 《大型网站技术架构》1:概述
- 5月钓鱼网站简报:共处理钓鱼网站2483个 环比下降
- PayPal网站付款标准版(for PHP)
- MVC架构设计参考
- 大型网站关键技术
- php使用curl打开https网站的方法
- solr 学习网站