ArrayListMultimap源码

2022-07-27

总算明白了美悦苦心积虑让我看guava的良苦用心,真是太香了啊!!

综述

我们都知道,ArrayListMultimap的key允许重复,value可以append,类似于下面这样

private final Multimap<Integer, String> newFiles = ArrayListMultimap.create();
newFiles.put(1, "science");
newFiles.put(1, "nature");
newFiles.put(1, "nature");
System.out.println(newFiles.get(1));
// 会打印出下面的东西
["science", "nature", "nature"]

ArrayListMultimap继承了AbstractListMultimap,AbstractListMultimap继承了AbstractMapBasedMultimap中实现了我们常规的对key、value的操作,源码如下

put方法

@Override
  public boolean put(@Nullable K key, @Nullable V value) {
    Collection<V> collection = map.get(key);
    if (collection == null) {
      collection = createCollection(key);
      if (collection.add(value)) {
        totalSize++;
        map.put(key, collection);
        return true;
      } else {
        throw new AssertionError("New Collection violated the Collection spec");
      }
    } else if (collection.add(value)) {
      totalSize++;
      return true;
    } else {
      return false;
    }
  }

get方法

/**
   * {@inheritDoc}
   *
   * <p>The returned collection is not serializable.
   */
  @Override
  public Collection<V> get(@Nullable K key) {
    Collection<V> collection = map.get(key);
    if (collection == null) {
      collection = createCollection(key);
    }
    return wrapCollection(key, collection);
  }

  /**
   * Generates a decorated collection that remains consistent with the values in
   * the multimap for the provided key. Changes to the multimap may alter the
   * returned collection, and vice versa.
   */
  Collection<V> wrapCollection(@Nullable K key, Collection<V> collection) {
    // We don't deal with NavigableSet here yet for GWT reasons -- instead,
    // non-GWT TreeMultimap explicitly overrides this and uses NavigableSet.
    if (collection instanceof SortedSet) {
      return new WrappedSortedSet(key, (SortedSet<V>) collection, null);
    } else if (collection instanceof Set) {
      return new WrappedSet(key, (Set<V>) collection);
    } else if (collection instanceof List) {
      return wrapList(key, (List<V>) collection, null);
    } else {
      return new WrappedCollection(key, collection, null);
    }
  }

  private List<V> wrapList(
      @Nullable K key, List<V> list, @Nullable WrappedCollection ancestor) {
    return (list instanceof RandomAccess)
        ? new RandomAccessWrappedList(key, list, ancestor)
        : new WrappedList(key, list, ancestor);
  }

本文地址:https://blog.csdn.net/u010659877/article/details/110251874

《ArrayListMultimap源码.doc》

下载本文的Word格式文档,以方便收藏与打印。