2016-05-25 38 views
7

Ho una stringa e ho bisogno di attraversarlo come un array di caratteri. Naturalmente il metodo normale è quello di utilizzare toCharArray()Come posso convertire una stringa in char [] senza copiare l'oggetto?

String str = "Hello"; 
char[] charArr = str.toCharArray(); 

Ora, il codice sorgente per toCharArray() è il seguente.

Quindi Java sta creando un nuovo oggetto in memoria di tipo char [] e copia l'oggetto stringa nel nuovo oggetto.

La mia domanda è se sia possibile o meno utilizzare una stringa come char [] senza copiare l'array. La mia intenzione è di risparmiare spazio sulla memoria. Se questo non è possibile, c'è una ragione?

Grazie in anticipo!

+4

Consegnare un riferimento diretto ad una matrice mutabile 'char []' di un oggetto che dovrebbe essere immutabile, sarebbe una pessima idea, specialmente se l'oggetto immutabile in questione è di tipo 'String', che ha per adempiere ai ruoli rilevanti per la sicurezza. – Holger

+2

Se vuoi risparmiare spazio nella memoria, non chiedere l'array 'char []'. Non hai spiegato, perché pensi di averne bisogno. – Holger

+0

Ho bisogno di un array per poterlo scorrere attraverso l'indice. Tuttavia, ciò che non ho realizzato e che Nicolas Filotto ha sottolineato è che le stringhe sono semplicemente una classe che memorizza la stringa in una matrice 'char []'. Doy! Errore dei principianti :) –

risposta

11

No, non lo è. Non senza riflessione, che dovresti evitare. Messing con il sottostante char[] in una stringa tramite riflessione è una ricetta per bug sottili. Puoi accedere a singoli caratteri in una stringa utilizzando charAt, ma se hai davvero bisogno di un char[] devi semplicemente chiamare toCharArray.

Se ciò non è possibile, c'è un motivo?

Primo motivo: incapsulamento. L'array è un dettaglio di implementazione privato.

Seconda ragione: immutabilità. Le stringhe sono immutabili, ma gli array non sono mai. Quindi è possibile modificare il char array sottostante e la stringa verrebbe modificata, con grande sorpresa di qualsiasi sviluppatore che si affidi alla normale immutabilità.

+1

E inoltre, altri riferimenti alla stessa stringa nel pool di stringhe presentano anche la stessa stringa mutata, con conseguente maggiore confusione. – Pokechu22

+1

@ Pokechu22: ancora peggio, le politiche di sicurezza (autorizzazioni, origini codice, nomi utente) sono memorizzate come stringhe, quindi consentire di modificarle comprometterebbe l'intero modello di sicurezza. – Holger

3

Ecco come si può attraversare un String in qualche modo come un array char senza utilizzare toCharArray():

for (int i = 0; i < str.length(); i++) { 
    char c = str.charAt(i); 
} 
+1

Beh, non "il" che l'OP stava chiedendo ... se l'OP ha solo un metodo che accetta un 'char []' che non possono modificare, per esempio, questo non sta per aiuto a tutti. –

+0

E dove memorizzi questi caratteri generati? –

+1

"Ho una stringa e ho bisogno di attraversarlo come un array di caratteri" questa è la richiesta principale dell'OP, quello che propongo aiuto nel percorrere la stringa, se non è ciò che l'OP si aspetta che debba modificare la domanda –

3

Dato che ci si aspetta l'array, non c'è modo di ottenere un array senza creare un nuovo array.

Questo è il modo più pulito. Anche se crei la tua funzione e fai qualche trucco, finirai con la creazione di un nuovo array.

Vai con i tuoi codici attuali.