String - Yash-777/LearnJava GitHub Wiki

String

The String class represents character strings. All string literals in Java programs, such as "abc", are implemented as instances of this class.

public String intern()

A pool of strings, initially empty, is maintained privately by the class String.

When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.

String ReverseObject, memory address, {equals (==)}
public class ReverseObject {
  public static void main(String[] args) {
    // String is immutable Object, once created we cannot change the object
    //The SCP is an area inside the heap memory. It contains the unique strings. 
    //In order to put the strings in the string pool, one needs to call the intern().
    String s1_scp = "Yash";
    System.out.println("SCP intern():"+s1_scp.intern());
    String s2_scp = "Yash";
    System.out.println("SCP intern():"+s2_scp.intern());
    
    String s3_h = new String("Yash");
    String s4_h = new String("Yash");
    
    System.out.println("Memory Address & Content :"+ (s1_scp == s2_scp));
    System.out.println("Memory Address & Content :"+ (s3_h   == s4_h));
    
    System.out.println("Content :"+ s1_scp.equals(s2_scp) );
    System.out.println("Content :"+ s3_h.equals(s4_h));
    
    String str = "Yashwanth";
    stringReverse(str, false);
    stringReverse(str, true);
    
    int num = 1234;
    reverseNumberString(num);
    reverseNumber(num);
    
    StringBuffer buff = new StringBuffer(str);
    System.out.println("String Buffer : "+ buff.reverse());
    
    // Use List interface to reverse string.
    char[] ch = str.toCharArray();
    List<Character> reverse = new LinkedList<>();
    for (int i = ch.length - 1; i >= 0; i--) {
      reverse.add(ch[i]);
    }
    System.out.println("Reverse of a String with LIST : "+ reverse);
  }
  
  public static String stringReverse(String str, boolean isDistinct) {
    char[] ch = str.toCharArray();
    String reverse = "";
    for (int i = ch.length - 1; i >= 0; i--) {
      if ( isDistinct && !(reverse.indexOf(ch[i]) > -1) ) // Remove duplicates
        reverse += ch[i];
      if (!isDistinct) reverse += ch[i];
    }
    System.out.println("Reverse of a String: "+ reverse +", DISTINCT:"+isDistinct);
    return reverse;
  }

  public static int reverseNumberString(int num) {
    String str = new Integer(num).toString();
    char[] ch = str.toCharArray();
    String reverse = "";
    for (int i = ch.length - 1; i >= 0; i--) {
        reverse += ch[i];
    }
    System.out.println("Reverse of a String Number : "+ reverse);
    return Integer.parseInt(reverse);
  }

  public static int reverseNumber(int num) {
    int temp = num;
    int rev = 0;
    int sum = 0; // sumOfDigits
    while (temp > 0 ) {
      rev = (rev * 10) + temp % 10;
      sum += temp % 10;
      temp = temp / 10;
    }
    System.out.println("Reverse of a Number : "+ rev);
    System.out.println("Sum of Digits of a Number : "+ sum);
    
    if(rev == num) {
      System.out.println("Polyndrome Number : [121 = 121]");
    }
    return rev;
  }
}
String[Aa], Hash[2112], System Hash[366712642]
String[BB], Hash[2112], System Hash[1829164700]

ASCII Codes Table ascii.cl

ASCII (Decimal) Hex ASCII Character
65 41 A
66 42 B
97 61 a
98 62 b

String Trim special chars Unicode's 1.1, general_punctuation, invisible-characters-unwanted

String s1 = "My Sample Space Data", s2 = "My Sample Space Data";
System.out.format("S1: %s\n", java.util.Arrays.toString(s1.getBytes()));
System.out.format("S2: %s\n", java.util.Arrays.toString(s2.getBytes()));
Trim example with Unicodes chars
public class StringUtil {
  public static void main(String[] args) {
    //String text = "  Hello World!  \uFEFF\u200B\u00A0 "; // Example string with various spaces
    String text = "    Hello   World! -  "+getUnicodeSpaces(); // \u2060-\u237D-\uFEFF
    
    // Print the original and trimmed text
    System.out.println("Original text: \"" + text + "\"");
    System.out.println("Original text: \"" + text.trim() + "\""); // Space, TabSpace
    System.out.println("Trimmed text: \"" + trimSpaces(text) + "\"");
    System.out.println("Trimmed text: \"" + trimAdvanced(text, getUnicodeSpaces()) + "\"");
    
  }
  
  //@Data - Only supported on the class, @Setter - On Class/Fields
  @AllArgsConstructor @NoArgsConstructor @Getter
  enum Unicodes {
    WHITESPACE("\u0020", ".", "SP - WhiteSpace"),
    
    // # FORMAT chars
    ENSP ("\u2002", "ENSP", "EN SPACE"),
    EMSP ("\u2003", "EMSP", "EM SPACE"),
    EMSP3("\u2004", "3/EMSP", "THREE-PER-EM SPACE"),
    EMSP4("\u2005", "4/EMSP", "FOUR-PER-EM SPACE"),
    EMSP6("\u2006", "6/EMSP", "SIX-PER-EM SPACE"),
    FSP  ("\u2007", "FSP", "FIGURE SPACE"),
    PSP  ("\u2008", "PSP", "PUNCTUATION SPACE"),
    THSP ("\u2009", "THSP", "THIN SPACE"),
    
    HSP  ("\u200A", "HSP", "HAIR SPACE"),
    ZWSP ("\u200B", "ZWSP", "ZERO WIDTH SPACE"),
    ZWNJ ("\u200C", "ZWNJ", "ZERO WIDTH NON-JOINER"),
    ZWJ  ("\u200D", "ZWJ", "ZERO WIDTH JOINER"),
    LRM  ("\u200E", "LRM", "LEFT-TO-RIGHT MARK"),
    RLM  ("\u200F", "RLM", "RIGHT-TO-LEFT MARK"),
    
    LS  ("\u2028", "LS", "LINE SEPARATOR"),
    PS  ("\u2029", "PS", "PARAGRAPH SEPARATOR"),
    LRE ("\u202A", "LRE", "LEFT-TO-RIGHT EMBEDDING"),
    RLE ("\u202B", "RLE", "RIGHT-TO-LEFT EMBEDDING"),
    PDF ("\u202C", "PDF", "POP DIRECTIONAL FORMATTING"),
    LRO ("\u202D", "LRO", "LEFT-TO-RIGHT OVERRIDE"),
    RLO ("\u202E", "RLO", "RIGHT-TO-LEFT EMBEDDING"),
    NNBSP("\u202F", "NNBSP", "ZERO WIDTH SPACE"),
    
    MMSP("\u205F", "MMSP", "MEDIUM MATHEMATICAL SPACE"),
    WJ  ("\u2060", "WJ",   "WORD JOINER"),
    ZWNBSP("\uFEFF", "ZWNBSP", "ZERO WIDTH NO-BREAK SPACE"),
    
    // # INVISIBLE chars
    FA  ("\u2061", "(FA)",   "Function application"),
    IT  ("\u2062", "(IT)",   "invisible times"),
    IS  ("\u2063", "(IS)",   "invisible separator"),
    IP  ("\u2064", "(IP)",   "invisible plus"),
    
    // # DEPRECATED chars
    ISS  ("\u206A", "ISS",   "INHIBIT SYMMETRIC SWAPPING"),
    ASS  ("\u206B", "ASS",   "ACTIVATE SYMMETRIC SWAPPING"),
    IAFS ("\u206C", "IAFS",   "INHIBIT ARABIC FORM SHAPING"),
    AAFS ("\u206D", "AAFS",   "ACTIVATE ARABIC FORM SHAPING"),
    NADS ("\u206E", "NADS",   "NATIONAL DIGIT SHAPES"),
    NODS ("\u206F", "NODS",   "NOMINAL DIGIT SHAPES"),
    
    NBSP ("\u00A0", "NBSP", "NO-BREAK SPACE (&nbsp;)"),
    
    BACKSPACE1("\u0008", "BKSP", "BACKSPACE"),
    BACKSPACE("\u2408", "BS", "SYMBOL FOR BACKSPACE (␈)"),
    SPACE("\u2420", "SP", "SYMBOL FOR SPACE (␠)"),
    
    IDSP("\u3000", "IDSP", "IDEOGRAPHIC SPACE"),
    
    IHSPACE("\u303F", "ZWSP", "IDEOGRAPHIC HALF FILL SPACE"),
    TAB("  ", "TAB", "TAB SPACE"),
    ;
    
    private String CODE, NAME, DESCRIPTION;
  }
  
  public static String getUnicodeSpaces() {
    // Get the size of the enum
    //System.out.println("Size of enum: " + Unicodes.values().length);
    
    // Append all CODE values to a string
    StringBuilder codesStringBuilder = new StringBuilder();
    for (Unicodes unicode : Unicodes.values()) {
      codesStringBuilder.append(unicode.getCODE());
    }
    String allCodes = codesStringBuilder.toString();
    //System.out.println("All codes: " + allCodes);
    return allCodes;
  }
  
  // Define a regular expression to match all kinds of spaces
  public static String trimSpaces(String text) {
    //String spaceTrimRegexLeading = "^["+ Pattern.quote(getUnicodeSpaces()) +"]+"; // 
    // Match leading and trailing spaces
    String spaceTrimRegex = "^[" + Pattern.quote(getUnicodeSpaces()) + "]+|[" + Pattern.quote(getUnicodeSpaces()) + "]+$";
    return text.replaceAll(spaceTrimRegex, "");
  }
  public static String trimAdvanced(String value, String skipString) {
    Objects.requireNonNull(value);
    
    int strLength = value.length();
    if (strLength == 0) return value;
    
    int len = value.length();
    int st = 0;
    char[] val = value.toCharArray();
    
    // Trim leading characters specified in skipString
    while ((st < len) && (skipString.indexOf(val[st]) >= 0)) {
      st++;
    }
    
    // Trim trailing characters specified in skipString
    while ((st < len) && (skipString.indexOf(val[len - 1]) >= 0)) {
      len--;
    }
    
    // Return trimmed substring
    return (st > len) ? "" : ((st > 0) || (len < strLength)) ? value.substring(st, len) : value;
  }
}
String PayLoad Validation
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20240303</version>
</dependency>

PayLoad

{
  "employees": {
    "employee": {
        "id": "1",
        "firstName": "Tom",
        "postalCode": [
          10
          ],
        "address": {
          "pin": "123"
        },
        
        "lastName": "Cruise"
      }
  }
}
import org.apache.commons.lang3.StringUtils;

public class StringPayload {

  public static String payLoadInSingleLine(String payload) {
    // Convert payLoad string to byte array
    byte[] bytes = payload.getBytes(StandardCharsets.UTF_8);
    // Create ByteArrayInputStream from byte array
    ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
    // Create InputStreamReader from ByteArrayInputStream
    InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
    // Now you can use the reader for further processing
    String requestBody = new BufferedReader(reader).lines().reduce(String::concat).get();
    return requestBody;
  }
  public static void main(String[] args) {
    String payload = "";

    String requestBody = payLoadInSingleLine(payload);
    System.out.println(requestBody.length() +" - requestBody :"+requestBody);
    
    // Replace multiple spaces with a single space using regular expression
    String result = requestBody.replaceAll("\\s+", " ");
    System.out.println(result.length() +" - Replace multiple spaces :"+result);
    
    System.out.println("isValidJson(jsonStr): " + isValidPayload(result));
    System.out.println("getJsonString(jsonStr): " + getJsonString(result));
    System.out.println("validateAndConvertJsonToMap(jsonStr): " + validateAndConvertJsonToMap(result));
  }

  public static Map<String, Object> validateAndConvertJsonToMap(String json) { // readValue
    try {
      if(json != null)
        return new com.fasterxml.jackson.databind.ObjectMapper()
            .readValue(json, 
            new com.fasterxml.jackson.core.type.TypeReference<java.util.HashMap<String, Object>>() {});
    } catch (Exception e) {
      System.err.println("Invalid JSON: " + e.getMessage());
    }
    return null; // Return null if the JSON is invalid
  }
  
  public static boolean isValidPayload(String payload) { // readTree
    ObjectMapper objectMapper = new com.fasterxml.jackson.databind.ObjectMapper();
    objectMapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    try {
      objectMapper.readTree(payload);
      return true; // Valid JSON
    } catch (com.fasterxml.jackson.core.JsonProcessingException e) {
      System.out.println("--- JsonProcessingException:"+ e.getLocalizedMessage());
      return Boolean.FALSE; // Invalid JSON
    }
  }
  private static String getJsonString(String payload) {
    System.out.println("Parse the JSON string to either JSONObject or JSONArray");
    Object json;
    try {
      json = new org.json.JSONObject( payload );
    } catch (org.json.JSONException e) {
      try {
        System.out.println("===== JSON-Object::"+ e.getLocalizedMessage());
        json = new org.json.JSONArray( payload );
      } catch (org.json.JSONException ex) {
        System.out.println("===== JSON-Array::"+ ex.getLocalizedMessage());
        //throw new IllegalArgumentException("Invalid JSON format");
        System.err.println("=== Invalid JSON Ex:"+ payload);
        return payload;
      }
    }
    return json.toString();
  }
}
function isValidJson(jsonString) {
    try {
        JSON.parse(jsonString);
        return { isValid: true, errorMessage: null }; // JSON is valid
    } catch (error) {
        return { isValid: false, errorMessage: error.message }; // JSON is invalid
    }
}

const payload = ``;

const validationResult = isValidJson(payload);
console.log("Is valid JSON:", validationResult.isValid);
if (!validationResult.isValid) {
    console.log("Error message:", validationResult.errorMessage);
}

intern() « Before saving in String Constant Pool(SCP) it invokes intern() method to check object availability with same content in pool using equals method. If String-copy is available in the Pool then returns the reference. Otherwise, String object is added to the pool and returns the reference.
hash() « String @override hash() of Object class to generate same hash code for sequence of characters.
equals and == « == operator is to check the hash code where as equals() method is to check the content of a String.
immutable «


What's the difference between length and length()

int[] myArray = new int[10];
String myString = "hello world!";
List<int> myList = new ArrayList<int>();

myArray.length    //gives the length of the array
myString.length() //gives the length of the string
myList.size()     //gives the length of the list

String reverse program.

public static String reverseStr(String str) {
    //String str = "Yashwanth"; //https://stackoverflow.com/a/59166517/5081877
    String collect = IntStream.range(0, str.length())
            .boxed().sorted(Collections.reverseOrder())
            .map(i -> { 
                System.out.println(i);
                return String.valueOf(str.charAt(i)); 
                })
            .distinct().collect(Collectors.joining("")); //htnawsY
            //.collect(Collectors.joining("")); //htnawhsaY
            //.collect(Collectors.joining(".")); //h.t.n.a.w.h.s.a.Y
    System.out.println("Reverse Str:"+collect);
    return collect;
}

⚠️ **GitHub.com Fallback** ⚠️