您的位置:首页 > 运维架构 > 网站架构

[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.等补充

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: