क्या मुझे string.isEmpty () या "" .equals (स्ट्रिंग) का उपयोग करना चाहिए?


171

शीर्षक मूल रूप से यह सब कहता है। मैं आमतौर पर इस के साथ परीक्षण string == nullकर रहा हूं, इसलिए मैं वास्तव में अशक्त-सुरक्षित परीक्षण के बारे में चिंतित नहीं हूं। मुझे कौन सा उपयोग करना चाहिए?

String s = /* whatever */;
...
if (s == null || "".equals(s))
{
    // handle some edge case here
}

या

if (s == null || s.isEmpty())
{
    // handle some edge case here
}

उस नोट पर - के अलावा isEmpty()भी कुछ करता है return this.equals("");या नहीं return this.length() == 0;?


26
ध्यान रखें कि isEmpty()जावा 6+ ही है।
कॉलिनड

1
आप एक सहायक विधि Util.String.hasValue (स्ट्रिंग s) बना सकते हैं, जो सभी मामलों को संभालने के लिए अशक्त, खालीपन और व्हाट्सएप की जांच करता है।
क्लाउड

5
@ColinD शायद कोई समस्या नहीं है - J2SE 5.0 ने कुछ समय पहले अपनी सेवा की समाप्ति की अवधि पूरी की।
टॉम हॉकिन -

1
विचार करने के लिए एक और बात "" है। असमानता () एक तर्क के रूप में वस्तु लेती है, इसलिए आपको एक कंपाइलर त्रुटि नहीं मिलेगी यदि तर्क टाइपिंग से कुछ और, बेहतर या बदतर के लिए बदलता है।
पॉल जैक्सन

जवाबों:


251

इसका मुख्य लाभ यह है "".equals(s)कि आपको अशक्त जांच की आवश्यकता नहीं है ( equalsयह अपने तर्क की जाँच करेगा और falseयदि यह अशक्त है तो वापस लौटेगा ), जिसकी आपको परवाह नहीं है। यदि आप sअशक्त होने के बारे में चिंतित नहीं हैं (या अन्यथा इसके लिए जांच कर रहे हैं), तो मैं निश्चित रूप से उपयोग करूंगा s.isEmpty(); यह दिखाता है कि आप क्या जाँच कर रहे हैं, आपको परवाह है कि sखाली है या नहीं , यह खाली स्ट्रिंग के बराबर है या नहीं


29
विवरण के लिए आपका धन्यवाद। अब मैं जानता हूं कि क्यों ""। मैं हमेशा सोचता रहता था कि दूसरे लोग ऐसा क्यों इस्तेमाल करते हैं, लेकिन इस बात को ध्यान में नहीं रखा। महान :-)
पीटर विप्रमैन

10
IMHO के अशक्त चेक की अभी भी उपरोक्त उदाहरणों में आवश्यकता है क्योंकि हम मानते हैं कि हालत शून्य मान के लिए सही होनी चाहिए। s == नल || "।। असमान (ओं)
mkorpela

5
@ Master.Aurora नहीं, अगर getValue()अशक्त लौटा , तो आपको NullPointerException मिल जाएगी जब toString()बुलाया गया था
ataulm

12
@ रेनीपेट ऐसा नहीं है कि इसमें कोई जादू शामिल हो। यदि sयह अशक्त है, तो आप इस पर तरीके नहीं कह सकते - यह अशक्त है। ""कभी भी अशक्त नहीं होगा, इसलिए आप इस पर सुरक्षित तरीके से कॉल कर सकते हैं, और equals()उस मामले को संभाल सकते हैं जहां इसका तर्क अशक्त है
माइकल Mrozek

5
प्रदर्शन पर एक नोट: isEmpty()एक निजी सरणी की आंतरिक लंबाई की जांच करता है जबकि equals(Object anObject)बहुत अधिक (उदाहरण के लिए instanceof) जाँच करता है । सुगंध-वार, isEmpty()आम तौर पर तेज होता है।
ट्यूरिंग 85

82

String.equals("")वास्तव में सिर्फ एक isEmpty()कॉल की तुलना में थोड़ा धीमा है । स्ट्रिंग्स एक गणना चर को कंस्ट्रक्टर में आरम्भ कर देता है, क्योंकि स्ट्रिंग्स अपरिवर्तनीय हैं।

isEmpty() काउंट वैरिएबल की तुलना 0 से करता है, जबकि बराबर टाइप्स, स्ट्रिंग लेंथ की जांच करेगा, और फिर साइज मैच होने पर तुलना के लिए स्ट्रिंग पर इट्रेट करेगा।

तो आपके सवाल का जवाब देने के लिए, isEmpty()वास्तव में बहुत कम करेंगे! और यह एक अच्छी बात है।


3
मुझे लगता है कि इस मामले में अंतर लागू नहीं होता है; तुलना के लिए तार पर कभी भी एक पुनरावृत्ति नहीं होगी, क्योंकि आकार मेल नहीं खाएंगे (जब तक कि स्ट्रिंग वास्तव में खाली नहीं होती है, और फिर इसे पुनरावृत्त करने के लिए कोई वर्ण नहीं है)
माइकल Mrozek

2
सच है, लेकिन बराबरी के साथ आप पहले एक संदर्भ जांच को देखने के लिए देखते हैं कि क्या वे एक ही वस्तु हैं, फिर एक उदाहरण, फिर एक कलाकार को स्ट्रिंग, एक लंबाई की जांच, और फिर अंत में पुनरावृत्ति। यदि दोनों स्ट्रिंग्स खाली थे तो यह केवल एक साधारण संदर्भ जांच होगी।
डेविड यंग

स्ट्रिंग वर्ग के लिए स्रोत कोड java2s.com/Open-Source/Java-Document/6.0-JDK-Core/lang/java/…
डेविड यंग

1
@ डेविड मृत लिंक; यहाँ एक लाइव एक docjar.com/html/api/java/lang/String.java.html#1011
मैट बॉल

17

आप जिन अन्य मुद्दों का उल्लेख करना चाहते हैं, उनके अलावा एक चीज पर विचार करना चाह सकते हैं, जिसे isEmpty()1.6 में पेश किया गया था, इसलिए यदि आप इसका उपयोग करते हैं तो आप जावा 1.5 या उससे नीचे के कोड को चलाने में सक्षम नहीं होंगे।


4
यह निश्चित रूप से मेरे लिए चिंता की बात नहीं है।
मैट बॉल

1
साथ ही यह जवाब अब 6 साल पहले का है। मुझे उम्मीद है कि जावा 1.5 की तरह अब किसी को भी प्राचीन का उपयोग नहीं करना होगा।
मिशा नसलेडोव

1
वास्तव में कई चीजें हैं जो जावा संस्करण को अपग्रेड करते समय टूट सकती हैं। यह एक बैक-एंड एप्लिकेशन के लिए कम महत्वपूर्ण है जो एक बड़े सर्वर पर चलता है, लेकिन यह क्लाइंट एप्लिकेशन के लिए महत्वपूर्ण है। ग्राफिकल लाइब्रेरीज़ और गारबेज कलेक्शन स्ट्रेटजी अक्सर प्रमुख और मामूली जावा अपग्रेड से प्रभावित होती हैं। उसके ऊपर, क्लाइंट सॉफ़्टवेयर विभिन्न ऑपरेटिंग सिस्टम पर और कभी-कभी सीमित मेमोरी के साथ चल सकता है, जिसका अर्थ है कि आपके पास अक्सर सब कुछ परखने के लिए बजट / संसाधन नहीं होंगे। - हां, मेरे पास ऐसे ग्राहक हैं जो अभी भी 2017 में जावा 5 से चिपके हुए हैं।
bvdb

15

आप Apache Commons उपयोग कर सकते हैं StringUtils isEmpty () या isNotEmpty ()।


1
@ 2019 और इसके लिए हमें अभी भी एक 3 पार्टी लाइब्रेरी की आवश्यकता है: आह:
एडम

2

यह वास्तव में कोई फर्क नहीं पड़ता। "".equals(str)मेरी राय में अधिक स्पष्ट है।

isEmpty()रिटर्न count == 0;


47
मैं कहूंगा कि str.isEmpty()की तुलना में बहुत अधिक स्पष्ट है "".equals(str)। यह पढ़ता है कि आप क्या जाँच रहे हैं। राय का मामला हालांकि, मुझे लगता है।
कॉलिनड

7
मुझे लगता है कि कुछ लोग NPE से बचने के लिए "" .equals (str) करना पसंद करते हैं। मुझे व्यक्तिगत रूप से यह पसंद नहीं है क्योंकि मैं पहले स्ट्रिंग को शून्य नहीं होने के लिए जांच करूंगा।
कूलबीन्स

2

मैंने एक परीक्षक वर्ग लिखा है जो प्रदर्शन का परीक्षण कर सकता है:

public class Tester
{
    public static void main(String[] args)
    {
        String text = "";

        int loopCount = 10000000;
        long startTime, endTime, duration1, duration2;

        startTime = System.nanoTime();
        for (int i = 0; i < loopCount; i++) {
            text.equals("");
        }
        endTime = System.nanoTime();
        duration1 = endTime - startTime;
        System.out.println(".equals(\"\") duration " +": \t" + duration1);

        startTime = System.nanoTime();
        for (int i = 0; i < loopCount; i++) {
            text.isEmpty();
        }
        endTime = System.nanoTime();
        duration2 = endTime - startTime;
        System.out.println(".isEmpty() duration "+": \t\t" + duration2);

        System.out.println("isEmpty() to equals(\"\") ratio: " + ((float)duration2 / (float)duration1));
    }
}

मैंने पाया कि .isEmpty () का उपयोग करते हुए असमानों ("") का लगभग आधा समय लगा।


यह एक वैध माइक्रोबेनमार्क नहीं है। मैं कैलिपर या इसी तरह के उद्देश्य से निर्मित बेंचमार्किंग टूल का उपयोग करने की जोरदार सिफारिश करूंगा । stackoverflow.com/q/504103/139010
मैट बॉल

पारितोषिक के लिए धन्यवाद! जब मुझे कुछ खाली समय मिलेगा तो मैं कुछ माइक्रो बेंचमार्किंग के साथ प्रयोग करूंगा और अपने उत्तर को अपडेट करूंगा।
conapart3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.