java - जावा 11 में स्ट्रिंग ट्रिम() और स्ट्रिप() विधियों के बीच अंतर




string trim (2)

यहां एक इकाई-परीक्षण है जो जावा 11 का उपयोग करके, @MikhailKholodkov द्वारा उत्तर दिखाता है।

(ध्यान दें कि \u2000 \u0020 से ऊपर है और trim() द्वारा \u2000 नहीं माना जाता है trim() )

public class StringTestCase {
    @Test
    public void testSame() {
        String s = "\t abc \n";

        assertEquals("abc", s.trim());
        assertEquals("abc", s.strip());
    }

    @Test
    public void testDifferent() {
        Character c = '\u2000';
        String s = c + "abc" + c;

        assertTrue(Character.isWhitespace(c));
        assertEquals(s, s.trim());
        assertEquals("abc", s.strip());
    }
}

अन्य परिवर्तनों के अलावा, JDK 11 java.lang.String वर्ग के लिए 6 नए तरीके पेश करता है:

  • repeat(int) - स्ट्रिंग को दोहराता है जितनी बार int पैरामीटर द्वारा प्रदान किया गया है
  • lines() - एक स्प्लिटेटर का उपयोग करने के लिए स्रोत स्ट्रिंग से लाइनें प्रदान करने में आलस करता है
  • isBlank() - इंगित करता है कि स्ट्रिंग खाली है या केवल सफेद स्थान वर्ण हैं
  • stripLeading() - शुरुआत से सफेद स्थान को हटाता है
  • stripTrailing() - सफेद स्थान को अंत से हटाता है
  • strip() - सफ़ेद स्थान को हटाता है, शुरुआत और स्ट्रिंग के अंत दोनों से

विशेष रूप से, strip() trim() समान दिखती है trim() इस लेख strip*() अनुसार strip*() विधियाँ इस प्रकार तैयार की गई हैं:

String.strip (), String.stripLeading (), और String.stripTrailing () विधियाँ सफेद स्थान को ट्रिम करती हैं [जैसा कि Character.isWhiteSpace () द्वारा निर्धारित किया गया है) लक्षित स्ट्रिंग के आगे, पीछे, या दोनों आगे और पीछे।

String.trim() JavaDoc स्टेट्स:

/**
  * Returns a string whose value is this string, with any leading and trailing
  * whitespace removed.
  * ...
  */

जो ऊपर बोली के लगभग समान है।

Java 11 के बाद से String.trim() और String.strip() बीच वास्तव में क्या अंतर है?


संक्षेप में: strip() trim() का "यूनिकोड-अवगत" विकास है trim()

CSR: JDK-8200378

संकट

स्ट्रिंग :: ट्रिम जावा के शुरुआती दिनों से अस्तित्व में है जब यूनिकोड उस मानक के लिए पूरी तरह से विकसित नहीं हुआ था जिसका हम आज व्यापक रूप से उपयोग करते हैं।

स्ट्रिंग :: ट्रिम द्वारा उपयोग किए जाने वाले स्थान की परिभाषा अंतरिक्ष कोड बिंदु (\ u0020) से कम या बराबर कोई कोड बिंदु है, जिसे आमतौर पर एएससीआईआई या आईएसओ नियंत्रण वर्ण कहा जाता है।

यूनिकोड-जागरूक ट्रिमिंग रूटीन को चरित्र :: isWhitespace (int) का उपयोग करना चाहिए।

इसके अतिरिक्त, डेवलपर्स विशेष रूप से इंडेंटेशन व्हाइट स्पेस को हटाने या विशेष रूप से सफेद स्थान को हटाने में सक्षम नहीं हैं।

उपाय

ट्रिमिंग विधियों का परिचय दें जो यूनिकोड श्वेत स्थान के बारे में जानते हैं और केवल या केवल अनुगामी के अतिरिक्त नियंत्रण प्रदान करते हैं।

इन नए तरीकों की एक सामान्य विशेषता यह है कि वे पुराने तरीकों जैसे कि String.trim() तुलना में " String.trim() " की एक अलग (नई) परिभाषा का उपयोग करते हैं। बग JDK-8200373

स्ट्रिंग के लिए वर्तमान JavaDoc :: ट्रिम यह स्पष्ट नहीं करता है कि कोड में "स्पेस" की कौन सी परिभाषा का उपयोग किया जा रहा है। निकट भविष्य में आने वाली अतिरिक्त ट्रिमिंग विधियों के साथ जो अंतरिक्ष की एक अलग परिभाषा का उपयोग करते हैं, स्पष्टीकरण आवश्यक है। स्ट्रिंग :: ट्रिम स्पेस की परिभाषा का उपयोग किसी भी कोड पॉइंट के रूप में करता है जो स्पेस कैरेक्टर कोडपॉइंट (\ u0020) से कम या बराबर है। नए ट्रिमिंग मेथड (सफेद) स्पेस की परिभाषा का उपयोग किसी भी कोडपॉइंट के रूप में करेंगे जो पास होने पर सही लौटता है। चरित्र :: .Whitespace विधेय।

विधि isWhitespace(char) 1.1 के साथ Character isWhitespace(char) जोड़ा गया था, लेकिन विधि isWhitespace(int) 1.5 तक Character वर्ग में विधि isWhitespace(int) को पेश नहीं किया गया था। सप्लीमेंट्री कैरेक्टर को सपोर्ट करने के लिए बाद वाली विधि (टाइप int एक पैरामीटर को स्वीकार करने वाला) जोड़ा गया। Character वर्ग के लिए Javadoc टिप्पणियाँ अनुपूरक वर्णों को परिभाषित करती हैं (आमतौर पर इंट-बेस्ड "कोड पॉइंट" बनाम BMP वर्णों के साथ) (आमतौर पर एकल वर्ण के साथ मॉडलिंग की गई):

U + 0000 से U + FFFF के पात्रों के सेट को कभी-कभी मूल बहुभाषी विमान (बीएमपी) के रूप में जाना जाता है। जिन वर्णों के कोड बिंदु U + FFFF से अधिक हैं, उन्हें पूरक वर्ण कहा जाता है। जावा प्लेटफ़ॉर्म चार्ट में और सरणियों और स्ट्रिंगबफ़र कक्षाओं में UTF-16 प्रतिनिधित्व का उपयोग करता है। इस प्रतिनिधित्व में, पूरक वर्णों को चार मूल्यों की एक जोड़ी के रूप में दर्शाया गया है ... एक चर मूल्य, इसलिए, सरोगेट कोड बिंदुओं या यूटीएफ -16 एन्कोडिंग की कोड इकाइयों सहित बुनियादी बहुभाषी विमान (बीएमपी) कोड बिंदुओं का प्रतिनिधित्व करता है। एक int मान सभी यूनिकोड कोड बिंदुओं का प्रतिनिधित्व करता है, जिसमें पूरक कोड बिंदु शामिल हैं। ... वे विधियाँ जो केवल एक मान को स्वीकार करती हैं, पूरक वर्णों का समर्थन नहीं कर सकती हैं। ... वे विधियाँ जो एक मान को स्वीकार करती हैं वे सभी यूनिकोड वर्णों का समर्थन करती हैं, जिसमें पूरक वर्ण भी शामिल हैं।

OpenJDK Changeset

trim() और strip() बीच बेंचमार्क तुलना strip() - क्यों String.strip () String.trim की तुलना में 5 गुना तेज है () रिक्त स्ट्रिंग के लिए जावा 11 में






java-11