यह क्या है: [Ljava.lang.Object ?;


110

मुझे यह तब मिलता है जब मैं toStringएक फ़ंक्शन कॉल से प्राप्त एक वस्तु पर कॉल करता हूं। मुझे पता है कि इस स्ट्रिंग में ऑब्जेक्ट का प्रकार एन्कोडेड है, लेकिन मुझे नहीं पता कि इसे कैसे पढ़ना है।

इस प्रकार के एन्कोडिंग को क्या कहा जाता है?

जवाबों:


211

[Ljava.lang.Object;का नाम है Object[].class, java.lang.Classसरणी के वर्ग का प्रतिनिधित्व करने के लिए Object

नामकरण योजना में प्रलेखित है Class.getName():

यदि यह वर्ग ऑब्जेक्ट एक संदर्भ प्रकार का प्रतिनिधित्व करता है जो कि एक सरणी प्रकार नहीं है, तो जावा भाषा विनिर्देश ( .113.1 ) द्वारा निर्दिष्ट वर्ग का द्विआधारी नाम वापस आ जाता है ।

यदि यह वर्ग ऑब्जेक्ट एक आदिम प्रकार का प्रतिनिधित्व करता है या void, तो लौटाया गया नाम आदिम प्रकार के अनुरूप जावा भाषा का कीवर्ड है या void

यदि यह क्लास ऑब्जेक्ट सरणियों के एक वर्ग का प्रतिनिधित्व करता है, तो नाम का आंतरिक रूप '['एरेस्ट नेस्टिंग की गहराई का प्रतिनिधित्व करने वाले एक या अधिक वर्णों से पहले के तत्व प्रकार के नाम से बना होता है । तत्व प्रकार के नामों की एन्कोडिंग इस प्रकार है:

Element Type        Encoding
boolean             Z
byte                B
char                C
double              D
float               F
int                 I
long                J
short               S 
class or interface  Lclassname;

तुम्हारा उस सूची में अंतिम है। यहाँ कुछ उदाहरण हैं:

// xxxxx varies
System.out.println(new int[0][0][7]); // [[[I@xxxxx
System.out.println(new String[4][2]); // [[Ljava.lang.String;@xxxxx
System.out.println(new boolean[256]); // [Z@xxxxx

इस प्रारूप में toString()सरणियों पर विधि क्यों लौटती Stringहै इसका कारण यह है कि सरणियाँ @Overrideउस विधि से विरासत में नहीं मिली हैं Object, जो निम्नानुसार निर्दिष्ट है:

toStringवर्ग के लिए विधिObject @ एक स्ट्रिंग वर्ग जो की वस्तु एक उदाहरण, पर हस्ताक्षर चरित्र `है के नाम से मिलकर ', और वस्तु की हैश कोड की अहस्ताक्षरित हेक्साडेसिमल प्रतिनिधित्व देता है। दूसरे शब्दों में, यह विधि एक मान के बराबर स्ट्रिंग लौटाती है:

getClass().getName() + '@' + Integer.toHexString(hashCode())

नोट : आपtoString()उपरोक्त विनिर्देशन का पालन करने के लिए किसी भी मनमानी वस्तुपर भरोसा नहीं कर सकते, क्योंकि वे@Overrideकुछ और वापस करने के लिएकर सकते हैं (और आमतौर पर)। एक मनमानी वस्तु के प्रकार का निरीक्षण करने का अधिक विश्वसनीय तरीका उसgetClass()परआह्वानकरना है (एकfinalविधिजिसेविरासत में मिली हैObject) और फिरलौटी हुईवस्तुको दर्शाती हैClass । आदर्श रूप से, हालांकि, एपीआई को ऐसे डिज़ाइन किया जाना चाहिए था कि प्रतिबिंब आवश्यक नहीं है ( प्रभावी जावा 2 संस्करण देखें, आइटम 53: प्रतिबिंब के लिए इंटरफेस को प्राथमिकता दें )।


toStringसरणियों के लिए अधिक "उपयोगी" पर

java.util.ArraystoStringआदिम सरणियों के लिए अतिभार प्रदान करता है और Object[]। ऐसा भी है deepToStringकि आप नेस्टेड सरणियों के लिए उपयोग करना चाह सकते हैं।

यहाँ कुछ उदाहरण हैं:

int[] nums = { 1, 2, 3 };

System.out.println(nums);
// [I@xxxxx

System.out.println(Arrays.toString(nums));
// [1, 2, 3]

int[][] table = {
        { 1, },
        { 2, 3, },
        { 4, 5, 6, },
};

System.out.println(Arrays.toString(table));
// [[I@xxxxx, [I@yyyyy, [I@zzzzz]

System.out.println(Arrays.deepToString(table));
// [[1], [2, 3], [4, 5, 6]]

वहाँ भी Arrays.equalsऔर Arrays.deepEqualsहै कि उनके तत्वों, कई अन्य सरणी से संबंधित उपयोगिता तरीकों में से एक द्वारा सरणी समानता तुलना करते हैं।

संबंधित सवाल

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