जावा संदर्भ हमेशा किसी वस्तु की ओर इशारा करता है। ऑब्जेक्ट में एक हेडर होता है जो अन्य चीजों के बीच कंक्रीट प्रकार की पहचान करता है (ताकि जातियां विफल हो सकती हैं ClassCastException)। सरणियों के लिए, ऑब्जेक्ट की शुरुआत में लंबाई भी शामिल है, डेटा फिर मेमोरी में तुरंत बाद में आता है (तकनीकी रूप से एक कार्यान्वयन वह क्या करना चाहता है करने के लिए स्वतंत्र है, लेकिन यह और कुछ भी करने के लिए बेतरतीब होगा)। तो, आप ऐसा नहीं कर सकते हैं जो एक संदर्भ है जो एक सरणी में कहीं इंगित करता है।
C संकेत में कहीं भी और कुछ भी इंगित करते हैं, और आप किसी सरणी के बीच में इंगित कर सकते हैं। लेकिन आप सुरक्षित रूप से यह पता नहीं लगा सकते हैं कि सरणी कितनी लंबी है। डी में पॉइंटर में मेमोरी ब्लॉक और लंबाई में एक ऑफसेट होता है (या समतुल्य रूप से एक पॉइंटर अंत तक, मुझे याद नहीं है कि कार्यान्वयन वास्तव में क्या करता है)। यह डी को स्लाइस एरे की अनुमति देता है। C ++ में आपके पास प्रारंभ और अंत की ओर इशारा करते हुए दो पुनरावृत्तियाँ होंगी, लेकिन C ++ कुछ अजीब है।
तो वापस जावा में जा रहे हैं, नहीं, तुम नहीं कर सकते। जैसा कि उल्लेख किया गया है, एनआईओ ByteBufferआपको एक सरणी लपेटने और फिर इसे स्लाइस करने की अनुमति देता है, लेकिन एक अजीब इंटरफ़ेस देता है। आप निश्चित रूप से कॉपी कर सकते हैं, जो आपके विचार से शायद बहुत तेज है। आप अपने खुद के समान Stringअमूर्तता का परिचय दे सकते हैं जो आपको एक सरणी को स्लाइस करने की अनुमति देता है (वर्तमान सूर्य कार्यान्वयन Stringमें एक char[]संदर्भ प्लस एक स्टार्ट ऑफसेट और लंबाई, उच्च प्रदर्शन कार्यान्वयन बस है char[])। byte[]निम्न स्तर है, लेकिन आपके द्वारा डाला गया कोई भी वर्ग-आधारित अमूर्त वाक्यविन्यास का एक भयानक गड़बड़ करने वाला है, जब तक कि JDK7 (शायद)।