Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [JAVA] Dubbio Array

  1. #1
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071

    [JAVA] Dubbio Array

    A quanto ho capito quando scrivo "int[] numeriFortunati = numeriPrimi" (dove numeriPrimi è un vettore) dovrei copiare il contenuto di numeriPrimi dentro NumeriFortunati eppure facendo partire il programma qui giù sembra che si comporti come in c cioè che fa puntare l'indirizzo di numeriFortunati allo stesso indirizzo di numeriPrimi....

    codice:
    public class CopiaArray{
    	public static void main(String[] args){
    		int[] numeriPrimi = {2, 3, 5, 7, 11, 13};
    		int[] numeriFortunati = numeriPrimi;	//Stessa locazione di memoria come in c	
    		
    		numeriFortunati[2] = 12;
    
    		for(int i = 0; i < numeriFortunati.length; i++)
    			System.out.print(numeriFortunati[i] + " ");
    
    		numeriFortunati = new int[6]; 		//così non modifico anche numeriPrimi perchè do un nuovo indirizzo di memoria
    		for(int i = 0; i < 6; i++)
    			numeriFortunati[i] = 1000 + i + 1;
    
    		System.out.println();
    
    		System.arraycopy(numeriPrimi, 2, numeriFortunati, 2, 4); //da quale elemento effettuare la copia, da quale indice deve partire a copiare
    								        //in quale array copiare, da quale indice iniziare a sovrascrivere, quanti elementi sovrascrivere
    									//Attenzione a non uscire fuori dall'array
    		for(int i = 0; i < numeriFortunati.length; i++)
    			System.out.print(numeriFortunati[i]+ " ");
    
    	}
    }

    Avete chiarimenti da darmi??? grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Dubbio Array

    Originariamente inviato da Il Pazzo
    A quanto ho capito quando scrivo "int[] numeriFortunati = numeriPrimi" (dove numeriPrimi è un vettore) dovrei copiare il contenuto di numeriPrimi dentro NumeriFortunati eppure facendo partire il programma qui giù sembra che si comporti come in c cioè che fa puntare l'indirizzo di numeriFortunati allo stesso indirizzo di numeriPrimi....
    Quello che viene assegnato è il reference all'array!!

    Se vuoi fare un "deep copy" fai:
    codice:
    int[] a = { 1, 2, 3 };
    int[] b = a.clone ();
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: [JAVA] Dubbio Array

    Originariamente inviato da andbin
    Se vuoi fare un "deep copy" fai:
    Faccio una piccola precisazione (che subito non ho fatto per la fretta) prima che qualcuno pensi male: in generale clone() su un array genera una "shallow copy" mentre nel solo caso di array ad 1 dimensione di tipi primitivi la copia è completa.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    scusa ma non so quale sia la differenza tra "shallow copy" e "deep copy"... è la prima volta che sento nominare queste 2 cose...

    per quanto riguarda il reference... dunque... è più o meno come il puntatore del c???

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Il Pazzo
    scusa ma non so quale sia la differenza tra "shallow copy" e "deep copy"... è la prima volta che sento nominare queste 2 cose...
    Leggi qui

    Originariamente inviato da Il Pazzo
    per quanto riguarda il reference... dunque... è più o meno come il puntatore del c???
    Più o meno .... in Java non ci sono i puntatori, ci sono i reference. Una variabile di tipo reference fa appunto riferimento ad un oggetto (anche ad un array, che è pure lui un oggetto).
    Quanto sia grande una variabile reference e cosa contenga non è importante per il programmatore ed è noto solo alla JVM.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    ok grazie... ma per quanto riguarda i reference... più o meno mi paredi aver capito si comportino come i puntatori del c... no? cioè a cosa si può paragonare in c il reference?

    Mi pare di aver capito dal link che mi hai dato che lo "shallow copy" sia la "copia" tipica del c... cioè... intendo dire che in realtà non fa una copia reale ma semplicemente fa puntare allo stesso indirizzo di memoria i due vettori...
    Dunque Vettore1 = vettore2 in java si comporta come in c.....
    è corretto?


    per quanto riguarda il clone().... se lo uso in un array ad 1 dimensione fa la deep copy.... in array multidimensionali fa lo shallow copy...
    giusto?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Il Pazzo
    ok grazie... ma per quanto riguarda i reference... più o meno mi paredi aver capito si comportino come i puntatori del c... no? cioè a cosa si può paragonare in c il reference?

    Mi pare di aver capito dal link che mi hai dato che lo "shallow copy" sia la "copia" tipica del c... cioè... intendo dire che in realtà non fa una copia reale ma semplicemente fa puntare allo stesso indirizzo di memoria i due vettori...
    Dunque Vettore1 = vettore2 in java si comporta come in c.....
    è corretto?
    Se vuoi vederla così, sì. Ma devi guardare la cosa da un punto di vista più generico. Una variabile puntatore (come si dice in C/C++) o un "reference" di Java è una variabile concettualmente come tutte le altre: ha una sua locazione, una sua dimensione, un suo valore. L'unico fatto è che questo valore ha un significato particolare (e quindi trattato in modo particolare) perché è un "qualcosa" che "fa riferimento" ad un'altra variabile/oggetto.

    Quindi quando assegni una variabile di tipo puntatore/reference ad un'altra variabile dello stesso tipo, quello che copi è solo il suo valore, cioè quei pochi bit che sono contenuti nella variabile. Ed è quindi chiaro che poi entrambe le variabili facciano riferimento alla "stessa cosa".

    Originariamente inviato da Il Pazzo
    per quanto riguarda il clone().... se lo uso in un array ad 1 dimensione fa la deep copy.... in array multidimensionali fa lo shallow copy...
    giusto?
    Esatto, perché duplica solo la prima dimensione. Prova questo codice:
    codice:
    int[][] a2 = { { 1, 2, 3 }, { 4, 5, 6 } };
    int[][] b2 = a2.clone ();
    
    System.out.println (a2 == b2);         // false: la prima dimensione e` "separata"
    System.out.println (a2[0] == b2[0]);   // true: la seconda dimensione non e` separata!!
    
    b2[0][0] = 100;                  // Scrivo su b2
    System.out.println (a2[0][0]);   // ma lo vedo su a2!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    ti ringrazio... gentilissimo e chiarissimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.