/******************************************************************************
 * Obtain the reference of an object (copy or reference) 
 *   1. String objects
 *   2. String literals
 *   3. StringBuffer objects 
 ******************************************************************************/

public class stringRef3
{
    public static void main (String[] args) 
    {
        System.out.println("STRING VARIABLE OBJECTS:");
        System.out.println("------------------------");

        String s1 = "Hello World";                                       //new String
        String s2 = s1;                                                  //A reference. Not a copy 
        String s3 = new String(s1);                                      //A copy

        System.out.printf("String s1=%s \t\t is at reference: %x \n", s1, System.identityHashCode(s1) );
        System.out.printf("String sS=%s \t\t is at reference: %x \n", s2, System.identityHashCode(s2) );
        System.out.printf("String s3=%s \t\t is at reference: %x \n", s3, System.identityHashCode(s3) );
 
        System.out.println("> Making Change to String Variable s1..");
        s1 = "Goodbye World";

        System.out.printf("String s1=%s   \t is at reference: %x \n", s1, System.identityHashCode(s1) );
        System.out.printf("String s2=%s \t\t is at reference: %x \n", s2, System.identityHashCode(s2) );
        System.out.printf("String s3=%s \t\t is at reference: %x \n", s3, System.identityHashCode(s3) );
        System.out.println();


        //------------------------------------------------------------------------------------------        

        System.out.println("STRING LITERAL OBJECTS:");
        System.out.println("-----------------------");

        String ref1 = Integer.toHexString(System.identityHashCode("Hello World"));     	//get the reference of a literal string 
        String ref2 = String.format("%x", System.identityHashCode("Goodbye World"));	//a different way     
        String ref3 = xReference.getRef("Goodbye" + " " + "World");                     //yet another way (see xReference.java)     

        System.out.println("Literal  'Hello World'   \t is at reference: " + ref1);
        System.out.println("Literal  'Goodbye World' \t is at reference: " + ref2);
        System.out.println("a second 'Goodbye World' \t is at reference: " + ref3);
        System.out.println();


        //------------------------------------------------------------------------------------------        

        System.out.println("STRINGBUFFER VARIABLE OBJECTS:");
        System.out.println("------------------------------");

        StringBuffer sb1 = new StringBuffer("Hello World");               //new StringBuffer
        StringBuffer sb2 = sb1;                                           //A reference. Not a copy  
        StringBuffer sb3 = new StringBuffer(sb1);                         //A copy

        System.out.println("String sb1=" + sb1 + "\t\t is at reference: " + xReference.getRef(sb1) );
        System.out.println("String sb2=" + sb2 + "\t\t is at reference: " + xReference.getRef(sb2) );
        System.out.println("String sb3=" + sb3 + "\t\t is at reference: " + xReference.getRef(sb3) );

        System.out.println("> Making Change to StringBuffer sb1..");
        sb1.replace(0,5,"Goodbye");

        System.out.println("String sb1=" + sb1 + "  \t is at reference: " + xReference.getRef(sb1) );
        System.out.println("String sb2=" + sb2 + "  \t is at reference: " + xReference.getRef(sb2) );
        System.out.println("String sb3=" + sb3 + "\t\t is at reference: " + xReference.getRef(sb3) );
        System.out.println();	
    }
}