2015年6月9日星期二

物联网实践之——一步一步徒手建立智能家具远程控制系统 - heat nan

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
物联网实践之――一步一步徒手建立智能家具远程控制系统 - heat nan  阅读原文»

【摘要】首先非常感谢,上篇文章中一些前辈的指导,其中一些意见让我获益匪浅!关于物联网,我觉得灵魂还是在软件上,前端的各种硬件联网标准一旦形成也就没啥事了,更多的仍然是数据的存储,分析。其实,物联网说白了更是一种数据服务一条龙。从数据的采集到数据的传送以及数据的存储和处理。数据的传送就不用说了,属于通信的范畴... 阅读全文

Guava源码分析――Immutable Collections(4) - PoNa  阅读原文»

Immutable的集合体系,还有中很重要的集合没有介绍,就是ImmutableMap,通过UML图,可以看出ImmutableMap的结构体系。

首先来看一下ImmutableBiMap,因为普通ImmutableMap的实现依赖于它。ImmutableBiMap在ImmutableMap的基础上,加入inverse()等方法,可以使键值反转。ImmutableBiMap的构造,也是根据元素个数的不同,使用不同的实现(0-->EmptyImmutablBiMap,1-->SingletonImmutablBiMap,n(n>=2)-->RegularImmubtalMap),代码如下所示:

public abstract class ImmutableBiMap<K, V> extends ImmutableMap<K, V> implements BiMap<K, V> {

  
public static <K, V> ImmutableBiMap<K, V> of() {
//Empty元素内部,不维护存储结构,inverse()方法直接返回this
return (ImmutableBiMap<K, V>) EmptyImmutableBiMap.INSTANCE;
}

public static <K, V> ImmutableBiMap<K, V> of(K k1, V v1) {
//单个元素构造时,返回此类,内部维护两个元素K,V,inverse()时,返回V,K的SingletonImmutableBiMap
return new SingletonImmutableBiMap<K, V>(k1, v1);
}

public static <K, V> ImmutableBiMap<K, V> of(K k1, V v1, K k2, V v2) {
//多个元素构造是,返回此类,内部维护两个Entry[]集合,一个以key作为hashbucket的位置,
     //另一个以value作为hashbucket的位置,用于inverse()的时候,key-value的反转

return new RegularImmutableBiMap<K, V>(entryOf(k1, v1), entryOf(k2, v2));
}
}

copyOf()方法,在ImmutableCollections中实现的原则就是,如果copyOf()的还是一份ImmutableCollections集合,那么只是进行引用的赋值,因为集合本身不可变。

看过ImmutableBiMap之后,在回头看ImmutableMap就简单了很多,只是在ImmutableBiMap基础上去除了inverse()方法,并在内部为户单一数组(hashbucket)

不需要维护反转的数组。在无元素和单一元素构造的时候,直接调用ImmutableBiMap.of()和ImmutableBiMap.of(K,V)方法,代码如下所示:

public abstract class ImmutableMap<K, V> implements Map<K, V>, Serializable {

/**
* Returns the empty map. This map behaves and performs comparably to
* {
@link Collections#emptyMap}, and is preferable mainly for consistency
* and maintainability of your code.
*/
public static <K, V> ImmutableMap<K, V> of() {
return ImmutableBiMap.of();
}

/**
* Returns an immutable map containing a single entry. This map behaves and
* performs comparably to {
@link Collections#singletonMap} but will not accept
* a null key or value. It is preferable mainly for consistency and
* maintainability of your code.
*/
public static <K, V> ImmutableMap<K, V> of(K k1, V v1) {
return ImmutableBiMap.of(k1, v1);
}
}

多个元素构造的时候,返回RegularImmubtalMap,与RegularImmutableBiMap内部实现大同小异,去除对反转(值-键)的数组维护,去除inverse()等方法。

最后简单的阐述一下ImmutableSortedMap的实现,ImmutableMap单一元素和空元素的实现,就不详细说了,有兴趣的读者可以自己看看。多元素实现的时候,

ImmutableSortedMap的具体实现类是RegularImmutableSortedMap,有意思的是,它的内部维护key和value的数据结构是两个List,那么可想而知,排序早在构造的时候就已经完成了,而事实确实是这样,具体代码如下所示:

@SuppressWarnings("unchecked")
public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) {
//将排序器和entires传入fromEntries方法
return fromEntries(Ordering.natural(), false, 4, entryOf(k1, v1), entryOf(k2, v2),
entryOf(k3, v3), entryOf(k4, v4));
}
static <K, V> ImmutableSortedMap<K, V> fromEntries(
Comparator
<? super K> comparator, boolean sameComparator, int size, Entry<K, V>... entries) {
for (int i = 0; i < size; i++) {
Entry
<K, V> entry = entries;
entries
= entryOf(entry.getKey(), entry.getValue());
}
if (!sameComparator) {
sortEntries(comparator, size, entries);
//遍历entries排序
validateEntries(size, entries, comparator);
}

return fromSortedEntries(comparator, size, entries);
}
static <K, V> ImmutableSortedMap<K, V> fromSortedEntries( Comparator<? super K> comparator,int size,Entry<K, V>[] entries) {
if (size == 0) {
return emptyMap(comparator);
}
//遍历排序之后的entries,分开key和value,分别组成各自的List
ImmutableList.Builder<K> keyBuilder = ImmutableList.builder();
ImmutableList.Builder
<V> valueBuilder = ImmutableList.builder();
for (int i = 0; i < size; i++) {
Entry
<K, V> entry = entries;
keyBuilder.add(entry.getKey());
valueBuilder.add(entry.getValue());
}

return new RegularImmutableSortedMap<K, V>(
new RegularImmutableSortedSet<K>(keyBuilder.build(), comparator),
valueBuilder.build());
}

ImmutableMap中的Entry,也是被Guava重新实现,增加了bucket的计算逻辑,如下图UML:

AbstractMapEntry在原有Map.entry基础上,将写操作,置为直接抛异常,ImmutableEntry实现getKey()和getValue(),ImmutableMapEntry再加入bucket的计算和维护方法(链表),最

阅读更多内容

没有评论:

发表评论