09. స్ట్రింగ్స్ డీప్ డైవ్ — String Constant Pool (SCP) & ఇమ్మ్యుటబిలిటీ (Strings & SCP)

☕ Java (Java 21+ LTS) 🟢 Lesson 09 of 25 📂 Part 02: Control Flow & Strings (Page 4 of 5) ⏱️ 24 min read
📌 Covered in this lesson: Public Library Sharing Analogy · String Immutability Architecture · String Constant Pool (SCP) Internals · Literal vs new String() · == vs .equals() · intern() Method · Key String Manipulation Methods · 5 Interactive Quizzes

ప్రపంచంలో ఏ సాఫ్ట్‌వేర్ అప్లికేషన్‌ను తీసుకున్నా 70% కంటే ఎక్కువ మెమరీని ఆక్రమించేది అక్షరాలు మరియు పదాలే (Text Data). యూజర్ పేర్లు, ఈమెయిల్స్, డేటాబేస్ కనెక్షన్ స్ట్రింగ్స్, మరియు JSON రెస్పాన్స్‌లు అన్నీ స్ట్రింగ్స్ రూపంలోనే ఉంటాయి. ఈ భారీ టెక్స్ట్ డేటాను అత్యంత సమర్థవంతంగా మరియు సురక్షితంగా నిల్వ చేయడానికి జావా సృష్టించిన అద్భుతమే String Constant Pool (SCP) మరియు Immutability ఆర్కిటెక్చర్.

లైబ్రరీ బుక్ షేరింగ్ & రాతి శాసనం అనాలజీ (The Public Library & Stone Inscription Analogy):
1. String Immutability (రాతిపై చెక్కిన శాసనం - Immutable by Design): ఒకసారి రాతిపై అక్షరాలు చెక్కిన తర్వాత వాటిని రబ్బరుతో తుడవడం అసాధ్యం. అలాగే జావాలో ఒకసారి String s = "హైదరాబాద్"; అని క్రియేట్ చేశాక దానిని ఎవరూ మార్చలేరు. మీరు మార్చాలని ప్రయత్నిస్తే (s + " నగరం"), పాత స్ట్రింగ్ మారదు; మెమరీలో సరికొత్తగా మరొక శాసనం పుడుతుంది!
2. String Constant Pool (పబ్లిక్ లైబ్రరీ బుక్ షేరింగ్): ఒక కళాశాలలో 1000 మంది విద్యార్థులు ఒకే పుస్తకాన్ని అడిగినప్పుడు, లైబ్రరీ ప్రతి ఒక్కరికీ కొత్త పుస్తకం కొనకుండా అందరికీ ఒకే పుస్తకాన్ని చదవడానికి ఇచ్చినట్లే — మీరు ప్రోగ్రామ్‌లో 100 చోట్ల "Active" అని రాస్తే, హీప్ మెమరీలోని SCP పూల్‌లో ఒకే ఒక్క ఆబ్జెక్ట్ పుట్టి 100 మందికీ అదే రిఫరెన్స్ లభిస్తుంది (భారీ మెమరీ ఆదా!).
3. == vs .equals() (ఆధార్ కార్డు అడ్రస్ vs ముఖ కవళికలు):
  • ==: రెండు రిఫరెన్స్‌లు మెమరీలో ఒకే చిరునామాలో ఉన్నాయా అని చూస్తుంది (Address Identity).
  • .equals(): లోపల ఉన్న అక్షరాలు అక్షరాలా సరిపోలాయా అని చూస్తుంది (Content Equality).

ఈ తొమ్మిదవ పాఠంలో స్ట్రింగ్ కాన్‌స్టాంట్ పూల్ అంతర్గత మెకానిక్స్, స్ట్రింగ్ సెక్యూరిటీ రహస్యం, మరియు సెక్యూర్ పాస్‌వర్డ్ క్రెడెన్షియల్ ఇంజిన్ కాప్‌స్టోన్ ప్రాజెక్ట్‌ను సమగ్రంగా నేర్చుకుందాం!

1 జావాలో String ఒక క్లాస్ (Class vs Primitive)

చాలామంది బిగినర్లు int లాగానే String కూడా ఒక ప్రిమిటివ్ డేటా టైప్ అనుకుంటారు. కానీ జావాలో String అనేది java.lang ప్యాకేజీలో ఉండే ఒక పూర్తిస్థాయి రిఫరెన్స్ క్లాస్ (public final class String):

🔬 The Internal Structure of java.lang.String:

జావా 9 నుండి మెమరీని ఆదా చేయడానికి Compact Strings (JEP 254) ఫీచర్‌ను ప్రవేశపెట్టారు. గతంలో ప్రతి అక్షరానికి 2 బైట్లు (char[] — UTF-16) ఖర్చయ్యేది. ప్రస్తుతం జావా స్ట్రింగ్ అంతర్గతంగా ఒక byte[] value అరే మరియు ఒక coder ఫ్లాగ్‌ను కలిగి ఉంటుంది:
• LATIN1 (1 Byte per char): ఇంగ్లీష్ మరియు సాధారణ ASCII అక్షరాలకు కేవలం 1 బైట్ మాత్రమే తీసుకుంటుంది (50% మెమరీ ఆదా!).
• UTF-16 (2 Bytes per char): తెలుగు, హిందీ లేదా ఎమోజీలు ఉన్నప్పుడు మాత్రమే 2 బైట్లు కేటాయిస్తుంది.
• స్ట్రింగ్ క్లాస్ final కాబట్టి ఎవరూ దీనిని ఇన్హెరిట్ చేసుకుని దాని స్వభావాన్ని మార్చలేరు.

♻️ G1 GC String Deduplication (-XX:+UseStringDeduplication):

జావా 8u20 మరియు ఆధునిక జావా 21 లోని G1 గార్బేజ్ కలెక్టర్ ఒక అద్భుతమైన ఫీచర్‌ను అందిస్తుంది. హీప్ మెమరీలో వేర్వేరు String ఆబ్జెక్టులు ఒకే విధమైన కంటెంట్‌ను కలిగి ఉంటే, బ్యాక్‌గ్రౌండ్‌లో వాటి అంతర్గత byte[] అరేను ఒకే మెమరీ లొకేషన్‌కు షేర్ చేయిస్తుంది. దీని ద్వారా ఎంటర్‌ప్రైజ్ అప్లికేషన్లలో 10% నుండి 25% వరకు RAM మెమరీ ఆదా అవుతుంది!

2 String Constant Pool (SCP) మెమరీ ఆర్కిటెక్చర్

జావా రన్‌టైమ్ హీప్ మెమరీ లోపల ఒక ప్రత్యేకమైన రిజర్వ్‌డ్ ప్రదేశాన్ని నిర్వహిస్తుంది; దీనినే String Constant Pool (SCP) అంటారు. స్ట్రింగ్ లిటరల్ ద్వారా ఆబ్జెక్ట్ క్రియేట్ చేసినప్పుడు JVM కింది విధంగా వ్యవహరిస్తుంది:

⚡ SCP Lookup Workflow:

1. String s1 = "Java"; అని రాసినప్పుడు, JVM ముందుగా SCP లో "Java" అనే అక్షరాలతో ఆబ్జెక్ట్ ఉందో లేదో వెతుకుతుంది.
2. లేకపోతే, SCP లో కొత్త ఆబ్జెక్ట్‌ను సృష్టించి దాని మెమరీ రిఫరెన్స్‌ను s1 కి ఇస్తుంది.
3. తర్వాతి లైన్‌లో String s2 = "Java"; అని రాస్తే, SCP లో ఇప్పటికే "Java" ఉంది కాబట్టి, కొత్త ఆబ్జెక్ట్‌ను సృష్టించదు! పాత ఆబ్జెక్ట్ అడ్రస్‌నే s2 కి కూడా ఇస్తుంది. ఫలితంగా s1 == s2 నిజం (true) అవుతుంది!

3 Literal vs new String() ఆబ్జెక్ట్ సృష్టి తేడాలు

స్ట్రింగ్ సృష్టించే రెండు మార్గాల మధ్య గల కీలకమైన అంతర్గత తేడాలు:

ఫీచర్ String Literal (String s = "Hello";) new String("Hello");
ఆబ్జెక్ట్‌ల సంఖ్య కేవలం 1 ఆబ్జెక్ట్ మాత్రమే (SCP లో లేకపోతే). 2 ఆబ్జెక్ట్‌లు పుడతాయి (ఒకటి సాధారణ Heap లో, మరొకటి SCP లో).
మెమరీ లొకేషన్ నేరుగా String Constant Pool లో ఉంటుంది. రిఫరెన్స్ సాధారణ హీప్‌లో ఉన్న ఆబ్జెక్ట్‌ను పాయింట్ చేస్తుంది.
మెమరీ ఆదా అత్యుత్తమ మెమరీ ఆప్టిమైజేషన్. అనవసరమైన డూప్లికేట్ ఆబ్జెక్ట్ మెమరీ వేస్ట్.
పరిశ్రమ సిఫార్సు 100% స్ట్రింగ్ లిటరల్స్ మాత్రమే వాడాలి! ఎప్పుడూ వాడకూడదు (Anti-pattern).

4 String Immutability: భద్రత & కారణాలు

జావా రూపకర్త జేమ్స్ గోస్లింగ్ స్ట్రింగ్ క్లాస్‌ను ఎందుకు మార్చలేనిదిగా (Immutable) తీర్చిదిద్దారు? దీని వెనుక 3 ప్రధాన సాంకేతిక కారణాలు ఉన్నాయి:

🛡️ Why String is Immutable in Java?

1. String Constant Pool సాధ్యం కావడానికి: 100 వేరియబుల్స్ ఒకే SCP ఆబ్జెక్ట్‌ను షేర్ చేసుకుంటున్నప్పుడు, ఒకరు దానిని మారిస్తే మిగిలిన 99 మంది డేటా పాడైపోతుంది. ఇమ్మ్యుటబిలిటీ వల్ల ఆ భయం ఉండదు.
2. సెక్యూరిటీ (Security & Network): బ్యాంకింగ్ పాస్‌వర్డ్‌లు, డేటాబేస్ యూజర్‌నేమ్స్, మరియు నెట్‌వర్క్ IP అడ్రస్‌లు స్ట్రింగ్స్‌లోనే ఉంటాయి. ఇమ్మ్యుటబుల్ కావడం వల్ల హ్యాకర్లు రన్‌టైమ్‌లో వీటిని హైజాక్ చేయలేరు.
3. థ్రెడ్ సేఫ్టీ (Thread-Safety): మల్టీ-థ్రెడింగ్ ఎన్విరాన్‌మెంట్‌లో ఏకకాలంలో వందలాది థ్రెడ్లు ఒకే స్ట్రింగ్‌ను రీడ్ చేసినా ఎలాంటి సింక్రనైజేషన్ లాక్స్ లేకుండా 100% సురక్షితంగా ఉంటాయి.
4. క్లాస్‌లోడర్ భద్రత (ClassLoader Isolation): JVM లోకి లోడ్ అయ్యే క్లాస్ పేర్లు (ఉదా: java.lang.System) స్ట్రింగ్స్ రూపంలోనే ఉంటాయి. ఇవి మ్యూటబుల్ అయితే హ్యాకర్లు రన్‌టైమ్‌లో సిస్టమ్ క్లాసులను తమ మాల్వేర్‌తో మార్చే ప్రమాదం ఉండేది.
5. హ్యాష్‌కోడ్ క్యాషింగ్ (HashCode Caching): స్ట్రింగ్ మారదు కాబట్టి దాని hashCode() ను మొదటిసారి మాత్రమే లెక్కించి ఆటోమేటిక్‌గా క్యాష్ చేస్తుంది. దీనివల్ల HashMap మరియు HashSet లలో స్ట్రింగ్ కీలు మెరుపు వేగంతో పనిచేస్తాయి.

5 == vs .equals() లోతైన పరిశీలన

జావా ఇంటర్వ్యూలలో 100% అడిగే అత్యంత ముఖ్యమైన ప్రశ్న:

పోలిక == ఆపరేటర్ .equals() మెథడ్
ఏమి పరీక్షిస్తుంది? మెమరీ రిఫరెన్స్ (Address Identity) — రెండు వేరియబుల్స్ ఒకే మెమరీ లొకేషన్‌ను పాయింట్ చేస్తున్నాయా లేదా? అక్షరాల కంటెంట్ (Value Equality) — లోపల ఉన్న అక్షరాలు అక్షరాలా సరిపోలాయా లేదా?
ఎప్పుడు true వస్తుంది? రెండు వేరియబుల్స్ ఒకే SCP ఆబ్జెక్ట్‌ను రిఫర్ చేసినప్పుడు. ఆబ్జెక్ట్‌లు ఎక్కడ ఉన్నా లోపలి టెక్స్ట్ ఒక్కటే అయితే true వస్తుంది.
String s1 = "Java";
String s2 = new String("Java");

System.out.println(s1 == s2); // false (వేర్వేరు మెమరీ అడ్రస్‌లు!)
System.out.println(s1.equals(s2)); // true (రెంటిలోనూ 'Java' అనే కంటెంట్ ఉంది)

6 String.intern() మెథడ్ పనితీరు

new String() ద్వారా సాధారణ హీప్‌లో సృష్టించబడిన ఆబ్జెక్ట్‌ను బలవంతంగా SCP లోకి తరలించడానికి intern() మెథడ్ ఉపయోగపడుతుంది:

⚡ The intern() Guarantee & Memory Savings:

String s3 = s2.intern(); అని పిలిచినప్పుడు, JVM ఆ కంటెంట్ SCP లో ఉందో లేదో చూసి, SCP లో ఉన్న ప్రామాణిక పూల్ రిఫరెన్స్‌ను రిటర్న్ చేస్తుంది. అందువల్ల s1 == s2.intern() ఎల్లప్పుడూ true అవుతుంది!

ఎప్పుడు వాడాలి? ఒక ఫైల్ లేదా నెట్‌వర్క్ నుండి లక్షల కొద్దీ డూప్లికేట్ స్ట్రింగ్స్ (ఉదాహరణకు "INDIA", "ACTIVE", "PENDING") చదువుతున్నప్పుడు, ప్రతి ఆబ్జెక్ట్‌పై .intern() కాల్ చేయడం ద్వారా డూప్లికేట్ హీప్ ఆబ్జెక్టులను గార్బేజ్ కలెక్టర్‌కు వదిలేసి, కేవలం ఒకే పూల్డ్ కాపీని మెమరీలో ఉంచవచ్చు.

7 టాప్ 10 అత్యంత కీలకమైన స్ట్రింగ్ మెథడ్స్ & Modern Java APIs

రోజువారీ సాఫ్ట్‌వేర్ ఇంజనీరింగ్‌లో అత్యధికంగా ఉపయోగించే స్ట్రింగ్ మెథడ్స్ మరియు జావా 11/15 లో వచ్చిన ఆధునిక పద్ధతులు:

మెథడ్ వివరణ ఎగ్జాంపుల్
length() స్ట్రింగ్‌లోని మొత్తం అక్షరాల సంఖ్యను ఇస్తుంది. "Java".length() → 4
charAt(int index) నిర్దిష్ట ఇండెక్స్ వద్ద ఉన్న అక్షరాన్ని ఇస్తుంది (0-based). "Code".charAt(0) → 'C'
substring(begin, end) ఒక ముక్కను కట్ చేసి సరికొత్త సబ్‌స్ట్రింగ్‌ను ఇస్తుంది. "Hyderabad".substring(0, 5) → "Hyder"
contains(CharSequence) ఒక నిర్దిష్ట పదం లోపల ఉందో లేదో చూస్తుంది. "amazon.in".contains("amazon") → true
toUpperCase() / toLowerCase() కేస్ మార్పిడి చేస్తుంది. "java".toUpperCase() → "JAVA"
trim() / strip() ముందు, వెనుక ఉన్న అనవసర ఖాళీలను తొలగిస్తుంది (strip() యూనికోడ్ స్పేస్‌లనూ తొలగిస్తుంది). " admin ".strip() → "admin"
replace(old, new) అక్షరాలను లేదా పదాలను మారుస్తుంది. "hello".replace('l', 'p') → "heppo"
startsWith() / endsWith() మొదలు మరియు ముగింపును పరీక్షిస్తుంది. "invoice.pdf".endsWith(".pdf") → true
split(regex) నిర్దిష్ట గుర్తు (ఉదా: కామా, స్పేస్) ఆధారంగా ముక్కలు చేసి String[] అరే ఇస్తుంది. "a,b,c".split(",") → ["a", "b", "c"]
repeat(count) పదాన్ని నిర్దిష్ట సార్లు రిపీట్ చేస్తుంది (Java 11+). "=".repeat(5) → "====="

⚡ String.format() vs String.formatted() (Modern Java 15+):

గతంలో టెక్స్ట్‌ను ఫార్మాట్ చేయడానికి String.format("User: %s, Age: %d", name, age) అని రాసేవారు. జావా 15 నుండి నేరుగా స్ట్రింగ్ మీదే "User: %s, Age: %d".formatted(name, age) అని చాలా క్లీన్‌గా పిలుచుకోవచ్చు!

8 స్ట్రింగ్ కాన్‌క్యాటనేషన్ ట్రాప్ & గార్బేజ్

ఒక లూప్ లోపల String s = ""; for(...) s += i; అని రాస్తే, ప్రతి లూప్ రౌండ్‌లోనూ ఒక కొత్త స్ట్రింగ్ ఆబ్జెక్ట్ పుట్టి మెమరీ నిండిపోతుంది! 10,000 ఇటరేషన్లు తిరిగితే 10,000 వేస్ట్ ఆబ్జెక్టులు హీప్ మెమరీని క్రాష్ చేస్తాయి.

⚡ Solution Preview: Mutable Strings:

స్ట్రింగ్స్‌ను మాటిమాటికీ మార్చాల్సి వచ్చినప్పుడు సాధారణ String వాడకూడదు; దీనికి బదులుగా తర్వాతి పాఠంలో మనం నేర్చుకోబోయే StringBuilder ను మాత్రమే ఉపయోగించాలి!

9 కోడ్ డెమో 1: SCP మెమరీ ప్రూఫ్ (== vs .equals() & intern())

స్ట్రింగ్ కాన్‌స్టాంట్ పూల్, సాధారణ హీప్ ఆబ్జెక్ట్, మరియు intern() మెథడ్ ప్రవర్తనను శాస్త్రీయంగా ధృవీకరించే లైవ్ ప్రోగ్రామ్:

StringPoolMemoryProof.java
public class StringPoolMemoryProof {
    public static void main(String[] args) {
        System.out.println("==================================================");
        System.out.println("     STRING CONSTANT POOL (SCP) MEMORY AUDIT      ");
        System.out.println("==================================================");

        // String Literals - Stored in SCP
        String literal1 = "Hyderabad";
        String literal2 = "Hyderabad";

        // Created using 'new' operator - Stored in standard Heap
        String heapString1 = new String("Hyderabad");
        String heapString2 = new String("Hyderabad");

        // Identity comparison via == (Memory Address)
        System.out.println("[SCP Literal == Literal]  : " + (literal1 == literal2) + " (Same SCP Object)");
        System.out.println("[SCP Literal == Heap Obj] : " + (literal1 == heapString1) + " (Different Locations!)");
        System.out.println("[Heap Obj == Heap Obj]    : " + (heapString1 == heapString2) + " (Two Distinct Objects)");

        // Content comparison via .equals()
        System.out.println("--------------------------------------------------");
        System.out.println("[literal1.equals(heapString1)] : " + literal1.equals(heapString1) + " (Content Matched)");

        // Invoking intern() to retrieve SCP pooled reference
        String internedString = heapString1.intern();
        System.out.println("[literal1 == heapString1.intern()] : " + (literal1 == internedString) + " (Pooled via intern!)");
        System.out.println("==================================================");
    }
}
💻 Console Output (StringPoolMemoryProof)
==================================================
     STRING CONSTANT POOL (SCP) MEMORY AUDIT      
==================================================
[SCP Literal == Literal]  : true (Same SCP Object)
[SCP Literal == Heap Obj] : false (Different Locations!)
[Heap Obj == Heap Obj]    : false (Two Distinct Objects)
--------------------------------------------------
[literal1.equals(heapString1)] : true (Content Matched)
[literal1 == heapString1.intern()] : true (Pooled via intern!)
==================================================

10 కోడ్ డెమో 2: స్ట్రింగ్ మానిప్యులేషన్ & పాలిండ్రోమ్ వెరిఫైయర్

ముఖ్యమైన స్ట్రింగ్ మెథడ్స్ (charAt, substring, toLowerCase) ఉపయోగించి ఒక పదం పాలిండ్రోమ్ (ముందు నుంచీ వెనుక నుంచీ ఒకేలా ఉండే పదం) అవునో కాదో కనుగొనే ప్రోగ్రామ్:

PalindromeStringAnalyzer.java
public class PalindromeStringAnalyzer {
    public static void main(String[] args) {
        String testWord = "Madam";
        String normalized = testWord.trim().toLowerCase();

        int left = 0;
        int right = normalized.length() - 1;
        boolean isPalindrome = true;

        while (left < right) {
            if (normalized.charAt(left) != normalized.charAt(right)) {
                isPalindrome = false;
                break;
            }
            left++;
            right--;
        }

        System.out.println("--------------------------------------------------");
        System.out.println("         STRING PALINDROME VERIFIER ENGINE        ");
        System.out.println("--------------------------------------------------");
        System.out.println("Input String   : " + testWord);
        System.out.println("Normalized Text: " + normalized);
        System.out.println("Word Length    : " + testWord.length());
        System.out.println("Is Palindrome? : " + (isPalindrome ? "YES (100% Symmetrical)" : "NO"));
        System.out.println("--------------------------------------------------");
    }
}
💻 Console Output (PalindromeStringAnalyzer)
--------------------------------------------------
         STRING PALINDROME VERIFIER ENGINE        
--------------------------------------------------
Input String   : Madam
Normalized Text: madam
Word Length    : 5
Is Palindrome? : YES (100% Symmetrical)
--------------------------------------------------

11 కోడ్ డెమో 3: Secure User Credential & Password Strength Validator Engine (Capstone Mini Project)

ఒక పూర్తిస్థాయి యూజర్ రిజిస్ట్రేషన్ సెక్యూరిటీ ఇంజిన్: పాస్‌వర్డ్ పొడవు, అప్పర్‌కేస్, లోయర్‌కేస్, అంకెలు, మరియు ప్రత్యేక చిహ్నాలను స్ట్రింగ్ మెథడ్స్ ద్వారా విశ్లేషించి బలం (Strength Score) ను లెక్కించే కాప్‌స్టోన్ ప్రాజెక్ట్:

SecurityCredentialValidatorEngine.java
public class SecurityCredentialValidatorEngine {
    public static void main(String[] args) {
        String username = "kiran_kumar";
        String password = "P@ssw0rd2026#Enterprise";

        System.out.println("==================================================");
        System.out.println("       IDENTITY & PASSWORD STRENGTH VALIDATOR      ");
        System.out.println("==================================================");

        boolean hasUpper = false;
        boolean hasLower = false;
        boolean hasDigit = false;
        boolean hasSpecial = false;
        String specialChars = "!@#$%^&*()-_+=<>?";

        for (int i = 0; i < password.length(); i++) {
            char ch = password.charAt(i);
            if (Character.isUpperCase(ch)) hasUpper = true;
            else if (Character.isLowerCase(ch)) hasLower = true;
            else if (Character.isDigit(ch)) hasDigit = true;
            else if (specialChars.contains(String.valueOf(ch))) hasSpecial = true;
        }

        int strengthScore = 0;
        if (password.length() >= 12) strengthScore += 25;
        if (hasUpper) strengthScore += 25;
        if (hasLower && hasDigit) strengthScore += 25;
        if (hasSpecial) strengthScore += 25;

        String strengthRating = switch (strengthScore) {
            case 100 -> "VERY STRONG (Military Grade Encryption Ready)";
            case 75  -> "STRONG (Exceeds Standard Enterprise Cutoff)";
            case 50  -> "MODERATE (Vulnerable to Dictionary Attacks)";
            default  -> "WEAK (Immediate Reset Mandated)";
        };

        System.out.println("Account User : " + username);
        System.out.println("Password Len : " + password.length() + " chars");
        System.out.printf("Upper: %b | Lower: %b | Digit: %b | Special: %b%n", 
                          hasUpper, hasLower, hasDigit, hasSpecial);
        System.out.println("--------------------------------------------------");
        System.out.printf("Strength Score: %d / 100%n", strengthScore);
        System.out.println("Security Audit: " + strengthRating);
        System.out.println("==================================================");
    }
}
💻 Console Output (SecurityCredentialValidatorEngine)
=================================================="
       IDENTITY & PASSWORD STRENGTH VALIDATOR      
==================================================
Account User : kiran_kumar
Password Len : 24 chars
Upper: true | Lower: true | Digit: true | Special: true
--------------------------------------------------
Strength Score: 100 / 100
Security Audit: VERY STRONG (Military Grade Encryption Ready)
==================================================

12 టాప్ 6 కామన్ స్ట్రింగ్ మిస్టేక్స్ & 5 క్విజ్‌లు

స్ట్రింగ్స్ వాడేటప్పుడు డెవలపర్లు ఎదుర్కొనే 6 ప్రధాన తప్పులు:

లోపం తప్పు కోడ్ సరిదిద్దిన సరైన విధానం
కంటెంట్ సమానత్వానికి == వాడటం if (name == "Admin") (హీప్ ఆబ్జెక్ట్ అయితే ఫెయిల్ అవుతుంది) ఎల్లప్పుడూ if ("Admin".equals(name)) వాడాలి (Null-safe).
ఇమ్మ్యుటబిలిటీని మర్చిపోయి అసైన్ చేయకపోవడం String s = "hi"; s.toUpperCase(); // s మారదు! తిరిగి అసైన్ చేయాలి: s = s.toUpperCase();
లూప్ లోపల స్ట్రింగ్ కాన్‌క్యాటనేషన్ (+) String s = ""; for(...) s += i; (భారీ మెమరీ లీక్) లూప్‌లలో StringBuilder.append() వాడాలి.
నల్ చెక్ లేకుండా మెథడ్స్ కాల్ చేయడం str.length() (str == null అయితే NPE వస్తుంది) ముందే గార్డ్ క్లాజ్ వాడాలి: if (str != null && !str.isEmpty())
స్ట్రింగ్ ఇండెక్స్ పరిధి దాటడం str.charAt(str.length()) (StringIndexOutOfBoundsException) చివరి అక్షరం ఇండెక్స్ length() - 1 అవుతుంది.
అనవసరంగా new String() వాడటం String s = new String("hello"); (డూప్లికేట్ ఆబ్జెక్ట్) కేవలం లిటరల్ వాడాలి: String s = "hello";

🧠 మీ అవగాహనను పరీక్షించుకోండి (5 Interactive Quizzes):

ప్రశ్న 1: జావాలో String Constant Pool (SCP) ఎక్కడ ఉంటుంది?

సమాధానం: జావా 7 నుండి SCP అనేది నేరుగా ప్రధాన Heap Memory లో భాగమై ఉంటుంది (గతంలో జావా 6 లో PermGen లో ఉండేది).

ప్రశ్న 2: 'String s = new String("Hello");' రాస్తే మొత్తం ఎన్ని ఆబ్జెక్ట్‌లు పుడతాయి?

సమాధానం: మొత్తం రెండు (2) ఆబ్జెక్ట్‌లు పుడతాయి: ఒకటి సాధారణ హీప్‌లో, రెండవది String Constant Pool (SCP) లో (ఒకవేళ పూల్‌లో ఇప్పటికే లేకపోతే).

ప్రశ్న 3: 's1 == s2' మరియు 's1.equals(s2)' మధ్య తేడా ఏమిటి?

సమాధానం: == రెండు రిఫరెన్స్‌లు ఒకే మెమరీ అడ్రస్‌ను సూచిస్తున్నాయా లేదా అని చూస్తుంది; .equals() రెండు స్ట్రింగ్స్‌లోని అక్షరాల కంటెంట్ సమానమా లేదా అని తనిఖీ చేస్తుంది.

ప్రశ్న 4: intern() మెథడ్ యొక్క ముఖ్య ఉపయోగం ఏమిటి?

సమాధానం: హీప్ మెమరీలోని స్ట్రింగ్ ఆబ్జెక్ట్ నుండి SCP (String Constant Pool) లోని కానానికల్ పూల్డ్ రిఫరెన్స్‌ను పొందడానికి intern() వాడతారు.

ప్రశ్న 5: స్ట్రింగ్ ఇమ్మ్యుటబిలిటీ (మార్పులేని తత్వం) ఎందుకు అవసరం?

సమాధానం: సెక్యూరిటీ (పాస్‌వర్డ్స్ & నెట్‌వర్క్ భద్రత), SCP మెమరీ షేరింగ్ సాధ్యం కావడం, మరియు మల్టీ-థ్రెడింగ్ సింక్రనైజేషన్ లేకుండా 100% థ్రెడ్-సేఫ్టీ ఉండడం కోసం.

← మునుపటి పాఠం: 08. Loops Mastery తర్వాతి పాఠం: 10. StringBuilder & StringBuffer →