2016-06-08 3 views
3

Je voudrais avoir un objet qui est une liste redimensionnable de byte s qui implémente l'interface suivante:Java: quel type dois-je utiliser comme liste de primitives redimensionnable?

  • obtenir la taille actuelle
  • clairement la liste (Réinitialiser la taille à zéro)
  • ajouter un byte à la fin
  • supprimer un byte de l'extrémité
  • valeur get d'un élément quelconque de l'indice

Il est également connu que cette liste ne doit jamais contenir plus de 21 éléments.

J'ai déjà implémenté cet objet comme un simple tableau, byte[] de taille 21, et un int qui donne l'index du prochain élément non encore rempli, et qui a eu beaucoup de succès en l'utilisant.

Cela semble être une implémentation simple mais Java n'a-t-il pas déjà un type de construction pour ce genre de chose? J'imagine que la nécessité d'une telle chose est extrêmement préventive. J'ai essayé d'utiliser un ArrayList<Byte> mais il est super lent et mon runtime évolue exponentiellement avec des itérations. Est-ce que je souffre des pertes de performance de boxe/déballage? Quel type prédéfini dois-je utiliser comme ma liste de primitives redimensionnable?

+2

Qu'en est-'' LinkedList ? c'est la meilleure option pour les quatre premières clauses – Andrew

+2

@AndrewTobilko: Si 'ArrayList ' est '' super lent '' dans leur cas d'utilisation, je ne peux pas voir 'LinkedList ' étant beaucoup, voire aucun, meilleur. –

+0

Quelle est votre motivation pour faire un changement? Si vous avez quelque chose qui fonctionne bien pour votre scénario et que vous savez déjà que 'ArrayList ' ne convient pas ...? –

Répondre

2

Si une bibliothèque externe est autorisée, vous pouvez utiliser HPPC (Collections primitives haute performance pour Java). Il prend en charge Listes, ensembles et cartes de toutes les primitives Java.

Vous devrez faire un compromis en faisant face à ces exigences. Je recommande de trouver l'opération la plus utilisée et de choisir la structure de support en fonction de cela.

+1

fastutil est meilleur. – leventov

0

Standard Java n'offre pas de collections pour les types primitifs.

Mais le compilateur fait beaucoup d'auto-boxing pour vous; et il existe de belles méthodes d'assistance, donc aller de byte[] à List<Byte> est probablement pas beaucoup de travail codant sage.

Mais il semble que vous ayez rencontré le gros problème avec un tel code: il est livré avec un coût de performance. Mais cela ne peut pas être évalué en en parlant à un niveau aussi générique. Bref, si votre environnement vous permet de vous tourner vers l'une des bibliothèques tierces recommandées, il vous suffit de les essayer. Sinon, vous devez comprendre où vos cycles CPU viennent:

a) en établissant le profil

ou

b) par un examen approfondi (si vous avez des collègues de travail aux yeux pointus autour de - leur montrer votre code, et ensuite vous essayez de comprendre où (dé) boxe a lieu, et comment l'éviter)

Si la "révision interne" ne fonctionne pas pour vous, vous pouvez vous tourner vers codereview.stackexchange.com

1

Comme d'autres l'ont déjà dit, Java standard ne le fait pas soutenir les collections primitives.Si vous êtes ouvert à une bibliothèque tierce, Eclipse CollectionsMutableByteList prend en charge la liste des exigences que vous avez spécifiées.

MutableByteList byteList = ByteLists.mutable.empty(); 
Assert.assertEquals(0, byteList.size()); 
byteList.add((byte) 1); 
byteList.add((byte) 2); 
byteList.add((byte) 3); 
Assert.assertEquals(3, byteList.size()); 
byteList.removeAtIndex(2); 
Assert.assertEquals(
    ByteLists.mutable.with((byte) 1, (byte) 2), byteList); 
byteList.addAtIndex(2, (byte) 3); 
Assert.assertEquals(
    ByteLists.mutable.with((byte) 1, (byte) 2, (byte) 3), byteList); 
Assert.assertTrue((byte) 2 == byteList.get(1)); 
byteList.clear(); 
Assert.assertEquals(0, byteList.size()); 

Note: Je suis un validateur pour Eclipse Collections