// String.java -- examples of some of the methods of java.lang.String
// Java API
//      https://docs.oracle.com/en/java/javase/25/docs/api/index.html
// Java API > "module" base
//      https://docs.oracle.com/en/java/javase/25/docs/api/java.base/module-summary.html
// Java API > base > package java.lang
//      https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/package-summary.html
// Java API > base > class java.lang.String
//      https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html

// Java 25.  implicit class / compact main
// Java 25.  formatting is cleanly separated from I/O
// Java 25.  string templates/interperlation removed since Java 23

void main () {

   final String str1 = "abc";
   final String str2 = new String();
   final String str3 = new String (str1);
   final String str4 = str1;
   final char data[] = {'a', 'b', 'c'};
   final String str5 = new String (data);
   final String str6 = str1.concat (str3);
   final String str7 = str1 + str3;
   final String str8;

   IO.println ("str1 = %s%n".formatted(str1));  // "abc"
   IO.println ("str2 = %s%n".formatted(str2));  // ""
   IO.println ("str3 = %s%n".formatted(str3));  // "abc"
   IO.println ("str4 = %s%n".formatted(str4));  // "abc"
   IO.println ("str5 = %s%n".formatted(str5));  // "abc"
   IO.println ("str6 = %s%n".formatted(str6));  // "abcabc"
   IO.println ("str7 = %s%n".formatted(str7));  // "abcabc"

   IO.println ("Length of str1 = %d%n".formatted(str1.length()));  // 3
   IO.println ("Length of str2 = %d%n".formatted(str2.length()));  // 0
   IO.println ("Length of str6 = %d%n".formatted(str6.length()));  // 6

   if (str1 == str4) {
      IO.println ("str1 and str4 refer to the same object.");
   }
   if (str1 != str3) {
      IO.println ("str1 and str3 do not refer to the same object.");
   }
   if (str1.equals(str5)) {
      IO.println ("str1 and str3 contain the same characters.");
   }

   final int r1 = str1.compareTo ("abc and more");// negative (str1 shorter)
   final int r2 = str1.compareTo ("azc");         // negative ('b' < 'z')
   final int r3 = str1.compareTo ("abc");         // zero means equal
   final int r4 = str1.compareTo ("aac");         // positive ('b' > 'a')
   final int r5 = str1.compareTo ("ab");          // positive (str1 longer)

   final boolean r6 = str1.equalsIgnoreCase ("AbC"); // true
   final boolean r7 = str7.endsWith   ("bc");        // true
   final boolean r8 = str7.startsWith ("ab");        // true

   final String str9="\t \rThis is the string inside.\n \r";
   IO.println ("Trim  '%s'%n".formatted(str9.trim()));
   IO.println ("Strip '%s'%n".formatted(str9.strip()));

   // System.out.println (STR."A string in upper case: \{str7.toUpperCase()}")
   IO.println ("A string in upper case: " + str7.toUpperCase());
   IO.println ("A string in upper case: ".concat(str7.toUpperCase()));
   IO.println (String.format("A string in upper case: %s", str7.toUpperCase()));
   IO.println ("A string in upper case: %s".formatted(str7.toUpperCase()));

   IO.println ("A string in lower case: %s".formatted("ABCAbC".toLowerCase()));
}