番石榴表的原始替代品

时间:2013-08-21 20:51:20

标签: java guava trove4j

是否有替代Guava Tables使用基元而不是泛型类型作为键?

我想使用原语来避免因使用Java Numbers和Java Maps创建的其他入口对象而导致的自动装箱。

我使用Trove TLongObjectMap推出了我自己的基本LongLongObjectTable,但如果有可用标准库,则更愿意使用。

private static class LongLongObjectTable<T> {
    private final TLongObjectMap<TLongObjectMap<T>> backingMap = new TLongObjectHashMap<>();

    T get(final long rowKey, final long columnKey) {
        final TLongObjectMap<T> map = this.backingMap.get(rowKey);
        if (map == null) {
            return null;
        }
        return map.get(columnKey);
    }

    void put(final long rowKey, final long columnKey, final T value) {
        TLongObjectMap<T> map = this.backingMap.get(rowKey);
        if (map == null) {
            map = new TLongObjectHashMap<>();
            this.backingMap.put(rowKey, map);
        }
        map.put(columnKey, value);
    }

    Collection<T> values() {
        final List<T> values = new ArrayList<T>();
        for (final TLongObjectMap<T> map : this.backingMap.valueCollection()) {
            values.addAll(map.valueCollection());
        }
        return values;
    }
}

1 个答案:

答案 0 :(得分:2)

不是真的。问题是这样的实现很快就不是通用的(根据定义),需要逐个定义。这意味着重要的重复,并可能有很多可能的收集排列。

也就是说,其他语言通过使编译器为类型为T的集合的实例生成代码而不是使用type erasure来实现这一点,但这不是java的方向。

对于绝大多数情况,您可以在现有集合上使用自动盒装变体(如Long或Integer),因为开销相对较低。此外,标准库的设计者可能更喜欢保持纤细,而不是使用其他自定义变体污染它。