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


104

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

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

विशेष रूप से, strip()बहुत समान दिखता है trim()इस लेख के अनुसार इस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.
  * ...
  */

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

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

जवाबों:


106

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

CSR: JDK-8200378

संकट

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

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

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

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

उपाय

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

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

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

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

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

OpenJDK चेंजसेट


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


6
दिलचस्प है कि प्रतीक '\ u0000' को पट्टी से हटाया नहीं गया है, लेकिन ट्रिम द्वारा हटा दिया गया है।
CHEM_Eugene

32

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

(ध्यान दें कि \u2000ऊपर \u0020और व्हाट्सएप द्वारा नहीं माना जाता है 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());
    }
}

0

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

ट्रिम () सभी प्रमुख और अनुगामी चरित्र को निकालता है, जिसका ASCII मान 32 ('U + 0020' या स्पेस) से कम या बराबर है

यूनिकोड मानकों के अनुसार विभिन्न अंतरिक्ष वर्ण हैं जिनमें ASCII मूल्य 32 से अधिक है ('U + 0020')। Ex: 8193 (U + 2001)।

इन अंतरिक्ष वर्णों की पहचान करने के लिए, कैरेक्टर क्लास में जावा 1.5 से नया तरीका व्हाट्सएप (इंट) जोड़ा गया। यह विधि अंतरिक्ष वर्णों की पहचान करने के लिए यूनिकोड का उपयोग करती है। आप यहां यूनिकोड अंतरिक्ष वर्णों के बारे में अधिक पढ़ सकते हैं ।

नई विधि पट्टी, जो जावा 11 में जोड़ी गई है, इस कैरेक्टर का उपयोग करती है। व्हाइट स्पेस वर्णों की विस्तृत श्रृंखला को कवर करने और उन्हें हटाने के लिए विधि

उदाहरण

public class StringTrimVsStripTest {
    public static void main(String[] args) {
        String string = '\u2001'+"String    with    space"+ '\u2001';
        System.out.println("Before: \"" + string+"\"");
        System.out.println("After trim: \"" + string.trim()+"\"");
        System.out.println("After strip: \"" + string.strip()+"\"");
   }
}

उत्पादन

Before: "  String    with    space  "
After trim: " String    with    space "
After strip: "String    with    space"

नोट: यदि आप विंडोज़ मशीन पर चल रहे हैं, तो आप सीमित यूनिकोड सेट के कारण समान आउटपुट नहीं देख सकते हैं। आप इस कोड के परीक्षण के लिए कुछ ऑनलाइन संकलक आज़मा सकते हैं।

संदर्भ: ट्रिम और स्ट्रिप विधि जावा के बीच अंतर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.