2017-06-08 5 views
0

Je travaille sur un programme où j'essaye de réduire la quantité de mémoire allouée, que j'utilisais auparavant pour concaténer des chaînes mais le problème était que je faisais ce processus plusieurs millions de fois et plus je faisais plus il fallait de temps pour allouer ces chaînes. Au lieu de cela, j'essaie de travailler avec des octets. Je veux faire quelque chose comme ceci:Concaténation de 2 octets en Java efficacement

byte[] arr = new byte[5]; 
byte cat = arr[0] + arr[1] //this addition would give me an error obviously. It's for demostration purposes 

System.out.println(cat); 

Je veux juste prendre le premier octet et mettre le second juste après sans utiliser toute forme de classe chaîne car elle nécessite plus de frais généraux pour concaténer des chaînes en tant que tel. Y a-t-il un moyen de le faire avec un minimum d'opérations?

+0

Jetez un oeil à cette [question] (https://stackoverflow.com/questions/11947138/combining-two-bytes-in-java) –

+1

Que voulez-vous concaténer les octets en? Votre code vous montre que vous essayez de les concaténer en un seul «byte», ce qui n'a pas beaucoup de sens. Deux octets peuvent faire un 'byte [2]', un 'short', ou un' char'. –

+1

Vous devez créer un tableau d'octets (ou, comme d'autres l'ont mentionné, empaqueter jusqu'à 8 octets ensemble dans une primitive plus grande, comme un short, int, ou long). Mais, quand votre concaténation de chaînes prenait trop de temps - utilisiez-vous StringBuilder, ou '+'? – yshavit

Répondre

0

Créer un nouveau tableau d'octets de sortie de la taille égale à la somme de tous vos octets qui sont à concaténer dans un nouveau tableau d'octets en utilisant System.arraycopy()

Comme System.arraycopy() est appel natif, il sera certainement plus rapide que la concaténation chaîne .

+0

Combien coûte le système? .arraycopy()? – ProgrammingCuber

+2

System.arraycopy() est le moyen le plus efficace de copier un tableau quelle que soit sa longueur. – mhasan

0

Si vous voulez « concaténer » deux octets ou plus, dans un nouveau tableau d'octets, il suffit d'utiliser la syntaxe array initializer:

byte a = 1; 
byte b = 42; 
byte c = 99; 

byte[] cat = {a,b,c}; 

System.out.println(Arrays.toString(cat)); // prints: [1, 42, 99] 

Votre exemple est cependant plus proche d'un appel substring(), et que vous devrait utiliser Arrays.copyOfRange(), par exemple

byte[] arr = {5,4,3,2,1}; 

byte[] cat = Arrays.copyOfRange(arr, 0, 2); 

System.out.println(Arrays.toString(cat)); // prints: [5, 4] 
+0

Je ne veux pas un nouveau tableau Je veux juste un nouvel octet et n'utiliser aucune méthode de chaîne pour concaténer les deux valeurs. – ProgrammingCuber

+0

@ProgrammingCuber Mais deux octets ne peuvent pas être stockés dans un seul octet. Vous pouvez les "ajouter", mais vous demandez spécifiquement de les concaténer. Un octet a une longueur de 8 bits. Si vous avez deux octets (8 + 8 = 16 bits), vous ne pouvez pas stocker cela en un seul octet. Votre demande est impossible. – Andreas

+0

@ProgrammingCuber C'est la même chose que concaténer deux chaînes. Si la première chaîne est longue de 3 et la seconde longue de 5, la chaîne concaténée est longue de 8. La taille de la concaténation est la somme des tailles des valeurs concaténées. – Andreas