2013-08-21 3 views
13

Esiste un'alternativa a Guava Tables che utilizza come chiavi le primitive, anziché i tipi generici?Alternativa primitiva a Guava Tabella

Vorrei utilizzare le primitive per evitare il box automatico causato dall'utilizzo di Numeri Java e degli oggetti voce aggiuntivi creati da Java Maps.

Ho eseguito il rollover del mio LongLongObjectTable di base utilizzando Trove TLongObjectMap, ma preferirei utilizzare una libreria standard se disponibile.

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

Mappe, elenchi, insiemi in Java operano sugli oggetti. Alla fine la boxe avverrà comunque che li usi. IMHO non vale la pena lottare contro di esso. Se hai bisogno di un'interfaccia più semplice, puoi sempre implementarla con un modello di delega come quello che hai incollato. – allprog

+2

Hai profilato la tua domanda? Potresti stare bene con i Tavoli di Guava, nonostante gli oggetti di boxe e di entrata. –

+2

IMHO questo sembra l'ottimizzazione iniziale. Capisco che tu voglia far funzionare la tua app il più velocemente possibile. Ma per l'autoboxing per iniziare a essere un collo di bottiglia, avresti bisogno di un carico di '> 10^n' operazioni al secondo, con' n' a seconda del tuo problema specifico, anche se in generale 'n> 3'. Sei sicuro che questo sia il tuo caso? –

risposta

2

Non proprio. Il problema è che tali implementazioni sono imminentemente non generiche (per definizione) e dovrebbero essere definite una per una. Ciò significa ripetizione significativa e potenzialmente molte possibili permutazioni di raccolta.

Detto questo, altri linguaggi consentono questo al compilatore di generare codice per istanze di una raccolta con tipo T piuttosto che utilizzare type erasure, ma non è la direzione in cui è andato java.

Il fatto che sia possibile utilizzare varianti auto-boxed come Long o Integer nella raccolta esistente è sufficiente per la maggior parte dei casi, poiché il sovraccarico è relativamente basso. Inoltre, i progettisti della libreria standard probabilmente preferiscono mantenerlo sottile piuttosto che inquinarlo con ulteriori varianti personalizzate.