/******************************************************************************
 * Copying an array
 * 1 - Using the Arrays.copyOf() method
 * 2 - Using the System.arraycopy() method
 ******************************************************************************/
import java.util.*;                 //import utility class

public class arrayCopy
{
    public static void main (String[] args) 
    {   
        //Below is NOT a copy. It is simply a reference to the original array ----------------

        String[ ] stuff1 = {"Sam", "Steve", "Bill", "john", "Andy", "????"};    

        System.out.println("\n Printing the original stuff1 array:");
        System.out.println(Arrays.toString(stuff1));        

        String[ ] stuff2;                                   //creating a new array 
    
        stuff2 = stuff1;                                    //this is NOT a copy - it simply a reference

        stuff1[5] = "Michael";

        System.out.println("\n Printing the original stuff1 array after the change");
        System.out.println(Arrays.toString(stuff1));        
                
        System.out.println("\n Printing the stuff2 array - it is a reference to the original");
        System.out.println(Arrays.toString(stuff2));        

        System.out.println("-----------------------------------------------------------");      


        //Below is a COPY, It is a separate array - using Arrays.copyOf() ----------------------------
    
        String[ ] stuff3 = {"Sam", "Steve", "Bill", "john", "Andy", "????"};    

        System.out.println("\n Printing the original stuff3 array:");
        System.out.println(Arrays.toString(stuff3));        

        String[ ] stuff4;                                   //creating a new array reference
    
        stuff4 = Arrays.copyOf(stuff3, stuff3.length+10);   //this is a copy, also a bigger array

        stuff3[5] = "Michael";
    
        System.out.println("\n Printing the original stuff3 array after the change");
        System.out.println(Arrays.toString(stuff3));        
            
        System.out.println("\n Printing the stuff4 array - no change to the array");
        System.out.println(Arrays.toString(stuff4));        

        System.out.println("-----------------------------------------------------------");      


        //Below is a COPY, It is a separate array - using System.arraycopy() ---------------------------
    
        String[ ] stuff5 = {"Sam", "Steve", "Bill", "john", "Andy", "????"};    

        System.out.println("\n Printing the original stuff5 array:");
        System.out.println(Arrays.toString(stuff5));        

        String[ ] stuff6 = new String[stuff5.length+10];        //creating a new bigger array 
                                                                //with the same size as stuff +10
    
        System.arraycopy(stuff5, 0, stuff6, 0, stuff5.length);  //this is a copy

        stuff5[5] = "Michael";
    
        System.out.println("\n Printing the original stuff5 array after the change");
        System.out.println(Arrays.toString(stuff5));        
            
        System.out.println("\n Printing the stuff6 array - no change to the array");
        System.out.println(Arrays.toString(stuff6));        

        System.out.println("-----------------------------------------------------------");      
    }
}