JShell Java 9 का इंटरैक्टिव REPL टूल है जो String ऑपरेशंस का त्वरित परीक्षण करने के लिए आदर्श है। String क्लास java.lang पैकेज का हिस्सा है और टेक्स्ट प्रोसेसिंग के लिए कई बिल्ट-इन मेथड्स प्रदान करती है।
1. String यूटिलिटी मेथड्स
सामान्य टेक्स्ट प्रोसेसिंग के लिए बिल्ट-इन मेथड्स।
खोज और सूचकांक
jshell> String str = "JShell is a new feature in Java9"
str ==> "JShell is a new feature in Java9"
jshell> str.indexOf("new")
$4 ==> 12
jshell> str.charAt(7)
$5 ==> 'i'
jshell> str.indexOf('i')
$6 ==> 7
jshell> str.lastIndexOf('i')
$7 ==> 24
jshell> str.contains("feature")
$8 ==> true
प्रारंभ/अंत जांच
jshell> str.startsWith("JShell")
$9 ==> true
jshell> str.startsWith("Java9")
$10 ==> false
jshell> str.endsWith("Java9")
$11 ==> true
jshell> str.endsWith("a9")
$12 ==> true
jshell> str.endsWith("a9java")
$13 ==> false
तुलना
jshell> String str1 = "value"
str1 ==> "value"
jshell> str1.equals("value")
$15 ==> true
jshell> str1.equals("VALUE")
$16 ==> false
jshell> str1.equalsIgnoreCase("VALUE")
$17 ==> true
अन्य उपयोगी मेथड्स
jshell> " hello ".trim()
$1 ==> "hello"
jshell> "HELLO".toLowerCase()
$2 ==> "hello"
jshell> "hello".toUpperCase()
$3 ==> "HELLO"
jshell> "a,b,c".split(",")
$4 ==> String[3] { "a", "b", "c" }
jshell> "hello".replace('l', 'L')
$5 ==> "heLLo"
jshell> String.format("Name: %s, Age: %d", "Alice", 30)
$6 ==> "Name: Alice, Age: 30"
jshell> "abc".repeat(3) // Java 11+
$7 ==> "abcabcabc"
jshell> " hi ".strip() // Java 11+, यूनिकोड-अवेयर
$8 ==> "hi"
2. String इम्मुटेबिलिटी (अपरिवर्तनीयता)
मुख्य अवधारणा: String ऑब्जेक्ट्स अपरिवर्तनीय हैं - निर्माण के बाद उनका मान नहीं बदला जा सकता। कोई भी "संशोधन" ऑपरेशन एक नया String ऑब्जेक्ट बनाता है।
concat() उदाहरण
jshell> String str = "Tutorialspoint"
str ==> "Tutorialspoint"
jshell> str.concat(" is e-learning app")
$3 ==> "Tutorialspoint is e-learning app"
jshell> str // मूल अपरिवर्तित!
str ==> "Tutorialspoint"
jshell> // नए मान को कैप्चर करना होगा
jshell> String str1 = str.concat(".")
str1 ==> "Tutorialspoint."
jshell> str1
str1 ==> "Tutorialspoint."
jshell> // पुनः असाइन करके मूल चर अपडेट करें
jshell> String str = str.concat(" is e-learning app")
str ==> "Tutorialspoint is e-learning app"
jshell> str
str ==> "Tutorialspoint is e-learning app"
अन्य इम्मुटेबल ऑपरेशंस
jshell> String s = "Tutorialspoint is e-learning app."
s ==> "Tutorialspoint is e-learning app."
jshell> s.toUpperCase()
$10 ==> "TUTORIALSPOINT IS E-LEARNING APP."
jshell> s.toLowerCase()
$11 ==> "tutorialspoint is e-learning app."
jshell> s // अभी भी मूल!
s ==> "Tutorialspoint is e-learning app."
jshell> // चेनिंग - प्रत्येक कॉल नया String बनाता है
jshell> s.trim().toUpperCase().replace(" ", "_")
$12 ==> "TUTORIALSPOINT_IS_E-LEARNING_APP."
इम्मुटेबिलिटी के निहितार्थ
प्रदर्शन विचार
// खराब: लूप में String कन्कैटनेशन (O(n²) ऑब्जेक्ट्स बनाता है)
String result = "";
for (int i = 0; i < 1000; i++) {
result += i; // प्रत्येक इटरेशन में नया String!
}
// अच्छा: StringBuilder का उपयोग करें (परिवर्तनीय)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i);
}
String result = sb.toString(); // एक String बनाता है
// Java 8+ StringJoiner
String joined = String.join(",", "a", "b", "c"); // "a,b,c"
सुरक्षा लाभ
- थ्रेड-सुरक्षित: अपरिवर्तनीय ऑब्जेक्ट्स स्वाभाविक रूप से थ्रेड-सुरक्षित हैं
- हैशकोड कैशिंग: हैशकोड एक बार गणना किया जाता है, कैश किया जाता है
- स्ट्रिंग पूलिंग: समान लिटरल्स समान ऑब्जेक्ट साझा करते हैं
- सुरक्षा: फ़ाइल पथ, SQL क्वेरी, नेटवर्क पते संशोधित नहीं किए जा सकते
स्ट्रिंग पूल डेमो
jshell> String a = "hello"
a ==> "hello"
jshell> String b = "hello"
b ==> "hello"
jshell> a == b // समान पूल्ड ऑब्जेक्ट!
$3 ==> true
jshell> String c = new String("hello")
c ==> "hello"
jshell> a == c // अलग ऑब्जेक्ट!
$5 ==> false
jshell> a.equals(c) // लेकिन सामग्री समान
$6 ==> true
jshell> c.intern() == a // पूल में डालें
$7 ==> true
आधुनिक String API (Java 11+)
jshell> "hello".isBlank() // Java 11: खाली या व्हाइटस्पेस
$1 ==> false
jshell> " \t\n ".isBlank()
$2 ==> true
jshell> "hello".lines() // Java 11: लाइन्स की स्ट्रीम
$3 ==> java.util.stream.Stream...
jshell> "hello".strip() // Java 11: यूनिकोड-अवेयर ट्रिम
$4 ==> "hello"
jshell> "hello".stripLeading()
$5 ==> "hello"
jshell> "hello".stripTrailing()
$6 ==> "hello"
सर्वोत्तम अभ्यास
- तुलना के लिए == के बजाय .equals() का उपयोग करें
- लूप/कन्कैटनेशन के लिए StringBuilder/StringJoiner का उपयोग करें
- नल-सुरक्षित तुलना:
"literal".equals(variable)NPE से बचाता है - इम्मुटेबिलिटी याद रखें: परिवर्तनकारी मेथड्स के परिणाम असाइन करें
- पूलिंग: लिटरल्स स्वचालित रूप से पूल्ड होते हैं;
intern()का उपयोग विरल रूप से करें