|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
[java] array/vettore
Sento alcuni programmatori parlare di array e vettori come entità differenti quando per me sono la medesima cosa,voi come la pensate e come utilizzate i 2 termini.
Per me parlare di array o vettore indica questo: Object [] variabile; |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Ma nel campo dell'informatica il significato è lo stesso: un tipo di dato che rappresenta un insieme di dati dello stesso tipo. http://it.wikipedia.org/wiki/Array
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
infatti io li ho sempre utilizzati indifferentementi.Un altro dubbio sui vettori.
se per fare la copia di array di tipi primitivi si fa qualcosa del genere: int[] v1 = new int[5]; v1[0] = 10; v1[1] = 12; v1[2] = 14; v1[3] = 16; v1[4] = 18; int[] v2 = new int[5]; int i = 0; while(i < v1.lengt) { v2[i] = v1[i]; } in modo che i 2 array non condividano memoria,come si agisce quando si tratta di oggetti e facendo v2[i]=v1[i] si crea cmq un secondo riferimento allo stesso oggetto.Ipotzzando che sia una stringa..se la modifica il vettore V2..la modifica si ripercuote anche su v1..per cui equivale a fare un' assegnazione..cioè nn vi è piu diferenza tra l' assegnazione e la deferenziazione. |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Se ti interessa fare una "deep copy" (clonazione profonda), allora devi fare tu un clone() dei singoli oggetti (che naturalmente devono essere clonabili). Nel caso di String, però non è clonabile (non implementa Cloneable) ma in genere non è un problema e non ha molto senso clonare una stringa. Infatti una stringa è un oggetto immutabile.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
fa questo Object[] v2=......... while(........) v2[i]=v1[i]; cosa che però potrei ad esempio evitare con un costruttore per copia v2[i]=new MiaClasse(v1[i]); corretto? La stringa come mai è immutabile? se io faccio String s="ciao"; s=s+"ciao" equivale se ho ben capito a fare s=new String("ciaociao"); |
|
![]() |
![]() |
![]() |
#6 | |||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Perché una volta che hai costruito un oggetto String, non esiste alcun metodo per alterarne il contenuto. Tutti i metodi della classe String (es. trim(), concat(), ecc....) restituiscono un nuovo oggetto che contiene appunto le modifiche ma non modificano l'oggetto String su cui è stato invocato il metodo! Quote:
No, non è la stessa cosa. La operazione di concatenazione s+"ciao" crea un nuovo oggetto il cui reference viene semplicemente assegnato alla variabile 's'. Che sostituisce il vecchio reference che puntava a "ciao".
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|||
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
Io sn stato sempre abituato a ragionare appunto per costruttore per copia e a non utilizzare mai cloneable.Penso cmq il risultato finale sia identico no? Non ho ben capito il discorso della concatenazione e la differenza con gli altri metodi,non viene cmq creato un nuovo oggetto ed assegnato alla variabile: cosa cambia tra String s="ciao"; s="ciao pippo"; s+="pippo"; |
|
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Ma non sarebbe un comportamente generico/generale. Solo il programmatore che ispeziona il sorgente o legge la documentazione può poi capire: "oh guarda ... c'è un costruttore apposito per fare una copia dell'oggetto!". In Java si implementa la interfaccia Cloneable e il metodo clone(). Quote:
Quindi fare: String s = "ciao"; e fare String s = new String ("ciao"); non è proprio esattamente la stessa cosa (anche se il risultato è lo stesso). Nel primo caso c'è solo una stringa literal assegnata ad s (1 oggetto). Nel secondo caso hai una stringa literal e a runtime viene creato un secondo oggetto (il cui reference è diverso da quello della stringa literal) che contiene la stessa sequenza di caratteri della stringa literal (2 oggetti) Passiamo alla concatenazione. String s = "ciao"; s = s + " pippo"; la concatenazione NON modifica la stringa originalmente referenziata da s ma crea un nuovo oggetto che è il risultato della concatenazione e lo assegna poi ad s. È una cosa diversa dal fare: String s = "ciao pippo"; perché nel primo caso hai 2 stringhe literal e a runtime viene creato un terzo oggetto che contiene la concatenazione.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#9 | ||
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
Quote:
quindi diciamo new String("ciao"); costringe java a tenere 2 oggetti in memoria senza che il garbace possa intervenire? Grossolanamente avviene una cosa del genere class MiaStringa{ String s; public MiaString(String st){s=st;}} ma allora dopo tutti questo discorso cosa serve il costruttore String(String); computazionalmente seppur in termini ridotti è meglio utilizzare sempre String s="qualcosa"; ? |
||
![]() |
![]() |
![]() |
#10 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Integer i = new Integer (12); i = new Integer (20); L'oggetto Integer che vale 12 non viene più referenziato, perché nella seconda riga ho assegnato ad i un nuovo reference. L'oggetto Integer che contiene il numero 12 può quindi essere preso in considerazione dal garbage collector. Non, non è così. Non è solo una copia di un reference! La classe String internamente ha un char[] che contiene i caratteri. Nel caso di costruzione partendo da un stringa, vengono copiati proprio tutti i caratteri. Il nuovo oggetto String creato e lo String passato al costruttore non hanno nulla in comune, se non la stessa sequenza di caratteri.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
come mai mantiene in memoria anche la literal se potrebbe in realtà farne una copia profonda e liberarsene,liberando anche risorsa.
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Se fai: String a = "ciao"; .... String b = "ciao"; I due reference sono esattamente uguali. Il compilatore si accorge che sono stringhe literal uguali e nel constant pool ne mette una sola. http://java.sun.com/docs/books/jls/t...al.html#3.10.5 http://java.sun.com/docs/books/jvms/...doc.html#22973
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:13.