परिचय: जादू जो आकस्मिक नहीं है
\n\nयदि आप कभी किसी अजीब बग के समाधान की तलाश में Stack Overflow पर अटके हैं, तो आपने निश्चित रूप से वह प्रश्न देखा होगा जिसने हजारों व्यूज़ और जोरदार चर्चाएँ अर्जित की हैं: "Why does this code using random strings print 'hello world'?"। यह एक पहेली की तरह लगता है, है ना? यादृच्छिक रूप से उत्पन्न स्ट्रिंग्स एक सार्थक अभिवादन में कैसे बदल सकती हैं?
\n\nइस लेख में, हम न केवल इस SEO-घटना (हाँ, यह शैक्षिक सामग्री के खोज इंजन प्रचार के लिए एक उत्कृष्ट मामला है) को सुलझाएंगे, बल्कि इसे Java पर एक पूर्ण पाठ में बदल देंगे। आप जानेंगे कि स्ट्रिंग पूल कैसे काम करते हैं, क्यों hashCode() कभी-कभी आश्चर्यचकित करता है, और 2025 में आपके कोड को पूर्वानुमानित और कुशल बनाने के लिए कौन से सर्वोत्तम अभ्यास अपनाने चाहिए।
तैयार हैं? चलिए शुरू करते हैं!
\n\n1. वही कोड: क्या हो रहा है?
\n\nआइए उस क्लासिक उदाहरण को याद करें जिसने Stack Overflow को हिलाकर रख दिया था। कल्पना करें कि आपके पास एक विधि है जो यादृच्छिक स्ट्रिंग्स उत्पन्न करती है और उनकी समानता की जाँच करती है:
\n\npublic class RandomStringTest {\n public static void main(String[] args) {\n String[] randomStrings = new String[1000];\n for (int i = 0; i < 1000; i++) {\n randomStrings[i] = generateRandomString();\n }\n \n for (String s : randomStrings) {\n if (s.equals("hello world")) {\n System.out.println("Found: " + s);\n }\n }\n }\n \n public static String generateRandomString() {\n // कुछ अजीब तर्क\n return new StringBuilder()\n .append((char) (Math.random() * 256))\n .append((char) (Math.random() * 256))\n // ... कई वर्ण\n .toString();\n }\n}\n\n\nपहली नज़र में, "hello world" प्राप्त करने की संभावना (1/256)^11 है - यह लगभग शून्य है। लेकिन कोड "hello world" प्रिंट करता है! कैसे? यादृच्छिकता का यहाँ कोई योगदान नहीं है। रहस्य स्ट्रिंग पूल (String pool) और Java में हैशिंग की विशेषताओं में छिपा है।
\n\n2. रहस्योद्घाटन: String Pool और hashCode
\n\nJava में, स्ट्रिंग्स अपरिवर्तनीय ऑब्जेक्ट हैं। जब आप लिटरल ("hello world") के माध्यम से एक स्ट्रिंग बनाते हैं, तो यह String pool में जाती है - मेमोरी का एक विशेष क्षेत्र। यदि कोई अन्य स्ट्रिंग उसी मान को संदर्भित करती है, तो JVM एक नया ऑब्जेक्ट नहीं बनाता, बल्कि मौजूदा ऑब्जेक्ट का संदर्भ लौटाता है।
लेकिन हमारे उदाहरण में, स्ट्रिंग्स यादृच्छिक रूप से उत्पन्न होती हैं। वे फिर भी समान कैसे हो जाती हैं? उत्तर: ओवरराइडेड hashCode()। Java के कुछ संस्करणों (विशेष रूप से 8 से पहले) में, स्ट्रिंग हैशिंग एल्गोरिदम पूर्वानुमानित था और यदि स्ट्रिंग्स की लंबाई और वर्ण संरचना समान थी, तो टकराव हो सकता था। हालाँकि, असली जादू तब होता है जब String pool इंटर्निंग का उपयोग करता है।
\n\nजब आप s.equals("hello world") कॉल करते हैं, तो JVM तुलना को अनुकूलित कर सकता है यदि दोनों स्ट्रिंग्स पूल में हैं। लेकिन हमारे मामले में, स्ट्रिंग्स अलग हैं... या नहीं? वास्तव में, यदि आप मूल प्रश्न में generateRandomString() के कार्यान्वयन को देखें, तो वहाँ एक चाल थी: विधि एक स्ट्रिंग लौटाती थी जो जनरेशन तर्क में त्रुटि के कारण हमेशा "hello world" थी।
यहाँ ऐसी "यादृच्छिकता" का एक उदाहरण है:
\n\npublic static String generateRandomString() {\n Random random = new Random(42); // फिक्स्ड seed\n byte[] bytes = new byte[11];\n random.nextBytes(bytes);\n return new String(bytes);\n}\n\n\nयदि seed फिक्स्ड है, तो "यादृच्छिक" अनुक्रम हमेशा समान होता है। और यदि seed को इस तरह चुना गया है कि वह "hello world" उत्पन्न करे? यही पहेली का उत्तर है! कोड यादृच्छिक नहीं है - यह नियतात्मक है।
\n\n