जावा में अग्रणी शून्य: प्रदर्शन माप के साथ शुरुआत से विशेषज्ञ तक
\n\nप्रत्येक Java-डेवलपर को देर-सबेर इस कार्य का सामना करना पड़ता है: "किसी संख्या में बाईं ओर शून्य कैसे जोड़ें?" यह एक सामान्य कार्य लगता है - संख्या 42 लें और इसे "000042" में बदलें। लेकिन जैसे ही आप गूगल करना शुरू करते हैं, आपको दर्जनों तरीके मिलते हैं: String.format, DecimalFormat, StringBuilder, मैन्युअल लूप और यहां तक कि String.repeat (Java 11+).
Stack Overflow पर प्रश्न "How can I pad an integer with zeros on the left?" ने हजारों बार देखा गया है। और यह कोई संयोग नहीं है। इस सरल क्रिया के पीछे दुविधाओं की एक पूरी श्रृंखला छिपी है: कौन सा तरीका तेज़ है? कौन सा अधिक पठनीय है? कौन सा उच्च-लोड वाले एप्लिकेशन में प्रदर्शन को नहीं मारेगा?
\n\nइस लेख में, हम केवल कोड नहीं दिखाएंगे। हम अपना स्वयं का लघु-अनुसंधान करेंगे, प्रत्येक दृष्टिकोण की गति को मापेंगे और स्पष्ट सिफारिशें देंगे। आप जानेंगे कि कब लालित्य के लिए माइक्रोसेकंड का त्याग किया जा सकता है, और कब "गंदा" लेकिन बिजली की तेज़ कोड लिखना बेहतर होता है।
\n\nयह क्यों महत्वपूर्ण है? प्रदर्शन का संदर्भ
\n\nमान लीजिए, आप ETL प्रक्रिया में लाखों स्ट्रिंग पहचानकर्ता बना रहे हैं, ऑर्डर नंबर उत्पन्न कर रहे हैं, या लॉग के लिए डेटा क्रमबद्ध कर रहे हैं। padding zeros पर प्रत्येक अतिरिक्त नैनोसेकंड संचालन की संख्या से गुणा हो जाता है। "सुंदर" String.format और मैन्युअल StringBuilder के बीच का अंतर सैकड़ों प्रतिशत हो सकता है।
लेकिन सब कुछ अनुकूलित करने में जल्दबाजी न करें। जैसा कि डोनाल्ड नुथ ने कहा: "समय से पहले अनुकूलन सभी बुराइयों की जड़ है।" पहले उपकरणों को समझें, फिर तय करें कि कौन सा चुनना है।
\n\nविधि 1: String.format() - पठनीयता का राजा
\n\nसबसे लोकप्रिय और सहज विकल्प। String.format() विधि %0Nd निर्दिष्टकर्ता का उपयोग करती है, जहाँ N अंतिम स्ट्रिंग की कुल लंबाई है।
int number = 42;\nString padded = String.format("%06d", number); // "000042"\nSystem.out.println(padded);\n\nलाभ स्पष्ट हैं: कोड सामान्य पाठ की तरह पढ़ा जाता है, सीमा मामलों के बारे में सोचने की आवश्यकता नहीं है। नुकसान - प्रदर्शन। String.format आंतरिक रूप से एक Formatter बनाता है और प्रत्येक कॉल पर प्रारूप स्ट्रिंग को पार्स करता है। एक बार के संचालन के लिए - आदर्श, 10 मिलियन पुनरावृत्तियों के लूप के लिए - संदिग्ध।
विधि 2: DecimalFormat - मुद्रा प्रारूपों की विरासत
\n\nपैकेज java.text से क्लास DecimalFormat मूल रूप से मुद्राओं और प्रतिशतों को प्रारूपित करने के लिए बनाया गया था, लेकिन यह leading zeros के साथ भी अच्छी तरह से काम करता है।
import java.text.DecimalFormat;\n\nDecimalFormat df = new DecimalFormat("000000");\nString padded = df.format(42); // "000042"\n\nमुख्य बारीकी: DecimalFormat थ्रेड-सुरक्षित नहीं है। यदि आप इसे मल्टी-थ्रेडेड वातावरण में उपयोग करते हैं, तो आपको या तो सिंक्रोनाइज़ करना होगा या प्रत्येक कॉल पर एक नया इंस्टेंस बनाना होगा (जो प्रदर्शन को मारता है)।
विधि 3: StringBuilder + मैन्युअल गणना - हार्डकोर
\n\nउन लोगों के लिए जो गति के लिए कुछ अतिरिक्त पंक्तियाँ लिखने से नहीं डरते। हम आवश्यक लंबाई का एक कैरेक्टर ऐरे बनाते हैं, इसे शून्य से भरते हैं, और फिर संख्या के अंकों को अंत से कॉपी करते हैं।
\n\npublic static String padLeftZeros(int number, int totalLength) {\n char[] result = new char[totalLength];\n for (int i = 0; i < totalLength; i++) {\n result[i] = '0';\n }\n int index = totalLength - 1;\n while (number > 0 && index >= 0) {\n result[index--] = (char) ('0' + (number % 10));\n number /= 10;\n }\n return new String(result);\n}\n\n// उपयोग:\nString padded = padLeftZeros(42, 6); // "000042"\n\nयह विधि String.format की तुलना में कई गुना तेज़ काम करती है, लेकिन सावधानी की आवश्यकता है: ऋणात्मक संख्याओं को संभालना होगा (हम सरलता के लिए उन पर विचार नहीं कर रहे हैं) और वह स्थिति जब संख्या निर्दिष्ट लंबाई से अधिक लंबी हो।