2015-04-28 9 views
5

Stavo cercando di unire gli elementi di un array tramite il metodo StringUtils.join(array, separator) dalla libreria di Apache. Qualcuno può spiegarmi perché non riesco a ottenere la stringa risultante e solo un puntatore alla sua posizione se utilizzo una matrice di tipi primitivi come int[]? Si prega di vedere l'esempio codice qui sotto:java - StringUtils.join() puntatore di ritorno

public static void main(String[] args){ 

    String[] s = new String[]{"Anna","has", "apples"}; 
    System.out.println(StringUtilities.join(s, " ")); 

    int[] a = new int[]{1,2,3}; 
    System.out.println(StringUtilities.join(a, " ")); 

    Integer[] b = new Integer[]{1,2,3}; 
    System.out.println(StringUtilities.join(b, " ")); 
} 

Solo utilizzando Integer array funziona. Ho capito che gli array di primitivi sono trattati internamente diversamente da ArrayList o altri oggetti di ordine superiore, ma allora perché è possibile (lo stesso argomento più o meno, ma una domanda diversa forse) per creare un'istanza di HashMap<String, int[]> senza avvisi, eccezioni? Gli array sono internamente avvolti in un altro oggetto? Solo per le mappe? Da quanto ho letto dal doc non puoi parametrizzare una mappa, un set, una lista di array ecc con tipi primitivi, che capisco, ma poi ... Trovo un po 'di confusione. Qualsiasi spiegazione ragionevole sarebbe apprezzata. Grazie.

risposta

6

Date un'occhiata alla firma per int array di StringUtils#join:

join(byte[] array, char separator) 

vi ha chiamati join utilizzando

StringUtils.join(a, " "), 

utilizzando una stringa invece di un char. Prova a utilizzare

StringUtils.join(a, ' ') 

invece.

Che cosa è successo è che la chiamata abbinata un'altra firma:

join(T... elements), 

in modo che le argomentazioni vengono interpretati come due oggetti, un array di interi e una stringa con un carattere di spazio. Durante la creazione della stringa del risultato, il metodo ha concatenato la rappresentazione della stringa dell'array intero con la stringa.

+0

Hai assolutamente ragione. – Kayaman

+1

È lo stesso effetto se utilizzo StringUtils.join (intArray). Non ho bisogno di mettere alcun separatore, era solo per scopi di esempio. Passando una matrice di int (primitive) e chiamando qualsiasi delle firme del metodo (cioè, con o senza separatore, il separatore come char o string produce lo stesso effetto). Prova: 'int [] a = new int [] {1,2,3}; \t \t \t \t System.out.println (StringUtilities.join (a, '')); \t \t System.out.println (StringUtilities.join (a)); \t \t System.out.println (StringUtilities.join (a, "")); ' – Marius

+0

La chiamata' join (a) 'corrisponde anche alla firma varargs, in modo da ottenere la rappresentazione stringa _object_ di intArray, che risulta essere la output spiegato da @Kayaman. Se si desidera concatenare un array int con un carattere separatore, sarà necessario utilizzare l'argomento char corretto. Viene così chiamato il metodo corretto (quello che crea le stringhe dalle singole voci dell'array int). –

4

Un array di ints (una primitiva) è un oggetto.

ho il sospetto l'implementazione non supporta le matrici primitive, e chiede toString() su di essi, con conseguente simile [[email protected] (che si traduce in un'unica matrice bidimensionale (solo uno [) di I nti e la sua "posizione di memoria").

+0

Sì, qualcosa del genere. L'ho visto la prima volta alcuni mesi fa mentre chiamavo toString() su alcuni array, ma mi aspettavo che questo fosse risolto, in termini di implementazione dei metodi toString() per i tipi primitivi o avvertire l'utente che questo non può essere raggiunto. Qual è la colpa? Java o Apache? Suppongo che Java .. apache faccia semplicemente uso dell'API – Marius

+0

È Apache che è "colpa". I tipi primitivi non possono avere un metodo 'toString()', poiché i primitivi non hanno metodi (e non è questo il problema). Gli array non sovrascrivono toString(), perché ciò potrebbe essere potenzialmente devastante (immagina di avere un 'byte [10000000]' e da qualche parte qualcuno chiama 'toString()' su di esso). Se hai bisogno di stampare un array, usa 'Arrays.toString (fooArray);' – Kayaman

+0

Hehehe .. vero vero, ma la comunità Java dovrebbe aver pulito anche questo "pasticcio" o almeno nasconderlo, se un array di le primitive sono considerate un oggetto e hanno un metodo toString(). In ogni caso, per migliorare, questo è quello che stavo usando in ogni caso 'Arrays.toString()'. Grazie per la risposta. – Marius

Problemi correlati