// Checking out Java's String pool
// String pool used for constant expressions computed at compile time
import java.util.Scanner;
public class Str
{
   public static void main(String[] args)
   {
      Scanner scan = new Scanner(System.in);
      String r = "first";
      String s = "first";
      System.out.println("r == s: " + (r == s));  // True
      // Share a reference: Strings computed at compile time

      String a = "first!!";
      String b = "first" + "!!";
      System.out.println("a == b: " + (a == b));  // True
      // Share a reference: Strings computed at compile time

      System.out.println("\"fir\" + \"st\" == b: " + ("fir" + "st!!" == b));  // True

      String c = r + "!!";
      System.out.println("b == c: " + (b == c));  // False
      System.out.println("b .equals c: " + (b .equals (c)));  // True
      // Don't share a reference: Strings not computed at compile time

      final String d = "first";
      String e = d + "!!";
      System.out.println("b == e: " + (b == e));  // True
      // Share a reference: Strings computed at compile time

      System.out.println( "Enter: ");
      String in = scan.nextLine();
      String f = d + in;
      System.out.println("a == f: " + (a == f));  // False
      System.out.println("a .equals f: " + (a .equals (f)));  // True
      // Don't share a reference: Strings not computed at compile time
   }
}