আমার কি স্ট্রিং.আইএসপিটি () বা "" .সম্পূর্ণ (স্ট্রিং) ব্যবহার করা উচিত?


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
আপনি একটি সহায়ক পদ্ধতি ইউটিলি.স্ট্রিং.হাসভ্যালু (স্ট্রিং) তৈরি করতে পারেন যা সমস্ত ক্ষেত্রে পরিচালনা করার জন্য শূন্যতা, শূন্যতা এবং হোয়াইটস্পেসের জন্য পরীক্ষা করে।
ক্লাউডাঙ্গার

5
@ কলিনড সম্ভবত কোনও সমস্যা নয় - জে 2 এসই 5.0 কিছু সময়ের আগে তার পরিষেবা জীবনের সমাপ্তি শেষ করেছে।
টম হাটিন -

1
আরেকটি বিষয় বিবেচনা করতে হবে "" সমাপ্তি () অবজেক্টটিকে একটি আর্গুমেন্ট হিসাবে গ্রহণ করে, সুতরাং স্ট্রিং থেকে আরও ভাল বা আরও খারাপের জন্য যুক্তির ধরণটি স্ট্রিং থেকে অন্য কোনওটিতে পরিবর্তিত হলে আপনি সংকলক ত্রুটি পাবেন না।
পল জ্যাকসন

উত্তর:


251

এর প্রধান উপকারিতা "".equals(s)হ'ল আপনার নাল চেকের দরকার নেই ( equalsএর যুক্তিটি পরীক্ষা করে দেখুন এবং falseএটি শূন্য হলে ফিরে আসবে ), যা আপনি মনে করেন না যে এটি যত্নশীল নয়। যদি আপনি sনাল হয়ে যাওয়ার বিষয়ে উদ্বিগ্ন না হন (বা অন্যথায় এটি পরীক্ষা করছেন), আমি অবশ্যই ব্যবহার করব s.isEmpty(); এটি আপনি যা যাচাই করছেন ঠিক তা দেখায়, sখালি খালি কিনা তা আপনার যত্নশীল equ


29
ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ. এখন আমি জানি কেন স্ট্রিংয়েক্যালস ("") এর তুলনায় "" (সমাপ্তি) পছন্দ করবেন! আমি সবসময় ভাবছিলাম যে অন্যরা কেন এটি প্রায়শই ব্যবহার করে তবে নালিকাগুলি বিবেচনায় নেয় না। দুর্দান্ত :-)
পিটার ওয়াইপ্পারম্যান

10
উপরোক্ত উদাহরণগুলিতে নাল চেকটি এখনও দরকার যেমন আমরা ধরে নিই যে শর্তটি নাল মানের জন্য সত্য হওয়া উচিত। s == নাল || "" .সম্পাদনা (গুলি)
মেকোরপেলা

5
@ মাস্টার.অরোরা না, যদি getValue()শূন্য ফিরে আসে, আপনি যখন toString()ডাকা হত তখন একটি নালপয়েন্টার এক্সসেপশন পেয়ে যাবেন
ataulm

12
@ রেনিপিট কোনও জাদু জড়িত বলে এটি পছন্দ করেন না। যদি sনাল হয়, আপনি এটিতে পদ্ধতিগুলি কল করতে পারবেন না - এটি নাল। ""কখনই equals()
নালু

5
কর্মক্ষমতা সম্পর্কে একটি নোট: isEmpty()একটি প্রাইভেট অ্যারের অভ্যন্তরীণ দৈর্ঘ্য যাচাই করে যেখানে equals(Object anObject)আরও অনেক কিছু ঘটে (যেমন চেক করা instanceof)। পারফরম্যান্স বুদ্ধিমান, isEmpty()সাধারণত দ্রুত হয়।
টুরিং 85

82

String.equals("")এটি কেবলমাত্র একটি isEmpty()কল চেয়ে কিছুটা ধীর । স্ট্রিংগুলি কনস্ট্রাক্টরটিতে আরম্ভকৃত একটি গণনা ভেরিয়েবল সঞ্চয় করে, যেহেতু স্ট্রিংগুলি পরিবর্তনযোগ্য নয়।

isEmpty() গণনা ভেরিয়েবলকে 0 এর সাথে তুলনা করে, যখন সমান প্রকারগুলি, স্ট্রিংয়ের দৈর্ঘ্যটি পরীক্ষা করে এবং তারপরে মাপের সাথে মেলে তুলনা করার জন্য স্ট্রিংটির উপরে পুনরাবৃত্তি করে।

সুতরাং আপনার প্রশ্নের উত্তর দিতে, isEmpty()আসলে অনেক কম করবে! এবং এটি একটি ভাল জিনিস।


3
আমি মনে করি এই ক্ষেত্রে পার্থক্য প্রযোজ্য নয়; তুলনার জন্য স্ট্রিংগুলির উপরে কখনও পুনরাবৃত্তি হবে না, কারণ আকারগুলি মেলে না (স্ট্রিংটি খালি না হলে এবং তারপরে পুনরাবৃত্তি করার কোনও অক্ষর নেই)
মাইকেল মরোজেক

2
সত্য তবে সমান সমেত আপনাকে প্রথমে একটি রেফারেন্স চেক জোগাড় করতে হবে তা দেখতে তারা একই বস্তু কিনা, তারপরে উদাহরণস্বরূপ, তারপরে স্ট্রিংয়ের জন্য একটি কাস্ট, দৈর্ঘ্যের চেক এবং শেষ পর্যন্ত পুনরাবৃত্তি। উভয় স্ট্রিং যদি খালি থাকে তবে এটি কেবল একটি সাধারণ রেফারেন্স চেক হবে।
ডেভিড ইয়ং

স্ট্রিং ক্লাসে সোর্স কোডটি java2s.com/ ওপেন
ডেভিড ইয়ং

1
@ ডেভিডের মৃত লিঙ্ক; এখানে একটি লাইভ ওয়ান ডক্জার.এইচটিএমএল
ম্যাট বল

17

উল্লিখিত অন্যান্য সমস্যাগুলির পাশাপাশি আপনি যে বিষয়টি বিবেচনা করতে চাইতে পারেন তা হ'ল এটি isEmpty()১.6 সালে প্রবর্তিত হয়েছিল, তাই আপনি যদি এটি ব্যবহার করেন তবে আপনি জাভা 1.5 বা নীচে কোড চালাতে পারবেন না।


4
এটি অবশ্যই আমার জন্য উদ্বেগের বিষয় নয়।
ম্যাট বল

1
এছাড়াও, এই উত্তরটি এখন 6 বছর আগে। আমি আশা করব যে জাভা 1.5 এর মতো প্রাচীন কিছু আর ব্যবহার করতে হবে না।
মিশা নাসলেদভ

1
আসলে জাভা সংস্করণ আপগ্রেড করার সময় অনেকগুলি জিনিস ভাঙতে পারে। এটি একটি বড় সার্ভারে চলে এমন একটি ব্যাক-এন্ড অ্যাপ্লিকেশনটির জন্য কম সমালোচিত তবে ক্লায়েন্ট অ্যাপ্লিকেশনগুলির ক্ষেত্রে এটি গুরুত্বপূর্ণ নয়। গ্রাফিক্যাল লাইব্রেরি এবং আবর্জনা সংগ্রহের কৌশলগুলি বড় এবং ছোটখাটো জাভা আপগ্রেড দ্বারা প্রায়শই প্রভাবিত হয়। সর্বোপরি, ক্লায়েন্ট সফ্টওয়্যার বিভিন্ন অপারেটিং সিস্টেমে এবং কখনও কখনও সীমিত মেমরির সাথে চলতে পারে যার অর্থ আপনার কাছে প্রায়শই সমস্ত কিছু পরীক্ষা করার জন্য বাজেট / সংস্থান থাকবে না। - হ্যাঁ, আমার এমন গ্রাহকরা রয়েছে যা 2017 এ এখনও জাভা 5 এর সাথে লেগে রয়েছে
bvdb


2

এটা আসলে কোন ব্যাপার না। "".equals(str)আমার মতে আরও স্পষ্ট।

isEmpty()প্রত্যাবর্তন count == 0;


47
আমি বলতে চাই এর str.isEmpty()চেয়ে অনেক বেশি পরিষ্কার "".equals(str)। আপনি যা যাচাই করছেন তা এটি পড়ে। মতামতের বিষয়টি যদিও আমার ধারণা।
কলিনড

7
আমি মনে করি কিছু লোক এনপিই এড়ানোর জন্য "" সমীকরণ (স্ট্র) থেকে পছন্দ করে। আমি ব্যক্তিগতভাবে এটি পছন্দ করি না কারণ আমি বরং স্ট্রিংটি প্রথমে নালাগুলির জন্য পরীক্ষা করতে চাই।
কুলবিয়ান্স

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 () ব্যবহার করে .equals ("") এর অর্ধেক সময় লেগেছিল।


এটি কোনও বৈধ মাইক্রোব্যাঙ্কমার্ক নয়। আমি ক্যালিপার বা অনুরূপ উদ্দেশ্যে-নির্মিত-নির্মিত বেঞ্চমার্কিং সরঞ্জামটি দৃ strongly ়ভাবে সুপারিশ করব । stackoverflow.com/q/504103/139010
ম্যাট বল

বখশিশের জন্য ধন্যবাদ! আমি যখন কিছু ফ্রি সময় পাই তখন আমি কিছু মাইক্রো বেঞ্চমার্কিং নিয়ে পরীক্ষা করব এবং আমার উত্তর আপডেট করব।
কনপার্ট 3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.