2013-08-21 29 views
13

是否有替代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; 
    } 
} 
+5

Java中的地图,列表,集合对对象进行操作。最后,无论如何,拳击将发生你利用他们。恕我直言,这是不值得对付它。如果您需要更简单的界面,您可以始终使用您粘贴的代理模式来实施它。 – allprog

+2

你是否分析了你的应用程序?尽管拳击和进入的对象,你可能会用番石榴的表。 –

+2

恕我直言,这听起来像是早期的优化。我知道你想尽可能快地运行你的应用程序。但是为了让自动装箱开始成为一个瓶颈,你需要每秒钟处理大于10^n次的操作,'n'取决于你的具体问题,尽管一般来说'n> 3'。你确定这是你的情况吗? –

回答

2

不是。问题是这样的实现不是通用的(根据定义),需要逐个定义。这意味着重大的重复和潜在的很多可能的收集排列。也就是说,其他语言通过让编译器为类型为T的集合的实例生成代码而不是使用type erasure来实现这一点,但这不是java去的方向。

事实上,您可以在现有集合上使用像Long或Integer这样的自动装箱变体,这对于绝大多数情况来说已经足够了,因为开销相对较低。此外,标准库的设计者可能更喜欢保持苗条而不是用额外的定制变体污染它。