दिलचस्प पोस्ट
.NET फ्रेमवर्क के बिना चल रहा नेट आधारित अनुप्रयोग एक यूआरएल (रेगेक्स) के हिस्से प्राप्त करना Ggplot2 के साथ साइड-बाय-साइड प्लॉट्स वेब ब्राउज़र की कुकी की कुंजी का अधिकतम आकार क्या है? डाउनलोड करने के लिए जेएसपी एक्सेल स्प्रैडशीट (एक्सएलएस) पैदा कर रहा है AJAX डेटा के लिए json ऑब्जेक्ट या सरणी को जेसन में परिवर्तित करें क्या PARTIAL_STATE_SAVING को गलत पर सेट किया जाना चाहिए? मैं सभी घटकों में कुंजी प्रेस (जावा स्विंग के भीतर) के लिए कैसे सुन सकता हूँ? एंड्रॉइड पर किसी अन्य एप्लिकेशन से एप्लिकेशन लॉन्च करें कैसे / कब लागू करता है शैल जेनकींस में विफलता के रूप में एक बिल्ड को चिह्नित करता है? घातक त्रुटि: CALL_AND_RETRY_LAST आवंटन विफल – स्मृति से बाहर प्रक्रिया एक PHP वस्तु संपत्ति प्राप्त करें जो एक संख्या है मैं चर की एक चर संख्या कैसे बना सकता हूँ? कैसे जावास्क्रिप्ट में एक सरणी की लंबाई को इनिशियलाइज़ करने के लिए? मुझे किसका उपयोग करना चाहिए: "लिखें-होस्ट", "लिखना-आउटपुट", या " :: लिस्टलाइन"?

क्या कोई संदर्भ पता पाने का कोई तरीका है?

जावा में, संदर्भ का पता पाने का एक तरीका है, कहते हैं

String s = "hello" 

क्या मैं स्वयं का पता भी प्राप्त कर सकता हूं, क्या मैं उस ऑब्जेक्ट का पता प्राप्त कर सकता हूं जो संदर्भ संदर्भित करता है?

वेब के समाधान से एकत्रित समाधान "क्या कोई संदर्भ पता पाने का कोई तरीका है?"

आप असुरक्षित के साथ ऑब्जेक्ट इंडेक्स प्राप्त कर सकते हैं। JVM मेमोरी (32-बिट पते, 32-बिट इंडेक्स, ऑफसेट, 64-बिट एड्रेस के साथ 32-बिट इंडेक्स) का उपयोग कैसे करता है इस पर निर्भर करता है कि ऑब्जेक्ट इंडेक्स कितना उपयोगी है।

यहां एक प्रोग्राम है जो मानता है कि आपके पास 64-बिट जेवीएम में 32-बिट इंडेक्स है।

 import sun.misc.Unsafe; import java.lang.reflect.Field; import java.util.Arrays; import java.util.Collections; public class OrderOfObjectsAfterGCMain { static final Unsafe unsafe = getUnsafe(); static final boolean is64bit = true; // auto detect if possible. public static void main(String... args) { Double[] ascending = new Double[16]; for(int i=0;i<ascending.length;i++) ascending[i] = (double) i; Double[] descending = new Double[16]; for(int i=descending.length-1; i>=0; i--) descending[i] = (double) i; Double[] shuffled = new Double[16]; for(int i=0;i<shuffled.length;i++) shuffled[i] = (double) i; Collections.shuffle(Arrays.asList(shuffled)); System.out.println("Before GC"); printAddresses("ascending", ascending); printAddresses("descending", descending); printAddresses("shuffled", shuffled); System.gc(); System.out.println("\nAfter GC"); printAddresses("ascending", ascending); printAddresses("descending", descending); printAddresses("shuffled", shuffled); System.gc(); System.out.println("\nAfter GC 2"); printAddresses("ascending", ascending); printAddresses("descending", descending); printAddresses("shuffled", shuffled); } public static void printAddresses(String label, Object... objects) { System.out.print(label + ": 0x"); long last = 0; int offset = unsafe.arrayBaseOffset(objects.getClass()); int scale = unsafe.arrayIndexScale(objects.getClass()); switch (scale) { case 4: long factor = is64bit ? 8 : 1; final long i1 = (unsafe.getInt(objects, offset) & 0xFFFFFFFFL) * factor; System.out.print(Long.toHexString(i1)); last = i1; for (int i = 1; i < objects.length; i++) { final long i2 = (unsafe.getInt(objects, offset + i * 4) & 0xFFFFFFFFL) * factor; if (i2 > last) System.out.print(", +" + Long.toHexString(i2 - last)); else System.out.print(", -" + Long.toHexString( last - i2)); last = i2; } break; case 8: throw new AssertionError("Not supported"); } System.out.println(); } private static Unsafe getUnsafe() { try { Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafe.setAccessible(true); return (Unsafe) theUnsafe.get(null); } catch (Exception e) { throw new AssertionError(e); } } } 

Java 6 update 26 (64-बिट संपीड़ित ओप्स) और जावा 7 पर चल रहा है। नोट: पते और रिश्तेदार पतों हेक्स में हैं

 Before GC ascending: 0x782322b20, +18, +18, +18, +18, +18, +18, +18, +18, +18, +18, +18, +18, +18, +18, +18 descending: 0x782322e58, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18 shuffled: 0x782322ec0, +78, -30, +90, -c0, +18, +90, +a8, -30, -d8, +f0, -30, -90, +60, -48, +60 After GC ascending: 0x686811590, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18 descending: 0x686811410, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18 shuffled: 0x686811290, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18 

या कभी-कभी

 Before GC ascending: 0x782322b20, +18, +18, +18, +18, +18, +18, +18, +18, +18, +18, +18, +18, +18, +18, +18 descending: 0x782322e58, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18 shuffled: 0x782323028, -168, +150, -d8, -30, +60, +18, +30, +30, +18, -108, +30, -48, +78, +78, -30 After GC ascending: 0x6868143c8, +4db0, +7120, -bd90, +bda8, -bd90, +4d40, +18, +18, -12710, +18, +80, +18, +ffa8, +220, +6b40 descending: 0x68681d968, +18, +d0, +e0, -165d0, +a8, +fea8, +c110, -5230, -d658, +6bd0, +be10, +1b8, +75e0, -19f68, +19f80 shuffled: 0x686823938, -129d8, +129f0, -17860, +4e88, +19fe8, -1ee58, +18, +18, +bb00, +6a78, -d648, -4e18, +4e40, +133e0, -c770 

नहीं आप नहीं कर सकते। यहां तक ​​कि जावा नेटिव इंटरफ़ेस (जेएनआई) का उपयोग करके, आप केवल डेटा संरचना के लिए अपारदर्शी हैंडल प्राप्त कर सकते हैं, वास्तविक जेवीएम ऑब्जेक्ट के लिए एक सूचक नहीं।

आप ऐसा क्यों चाहते हैं? यह जरूरी नहीं कि आप किसी भी तरह के लिए इस्तेमाल कर सकते हैं, वैसे भी, यहां तक ​​कि मूल कोड से भी नहीं।

नहीं आप नहीं कर सकते। विशेष रूप से जावा के रूप में नहीं (और एएएएएआईएके करता है) ढेर में ऑब्जेक्ट्स को स्थानांतरित करते हैं यदि कचरा संग्रहण के दौरान स्मृति कॉम्पैक्टिंग की आवश्यकता होती है।

आपको यह भी क्यों चाहिए या इसकी ज़रूरत है?

हाँ, आप इसे असुरक्षित, अलथ्रू के साथ कर सकते हैं यह इतना सीधे नहीं है। एक वस्तु [] में वस्तु या उदाहरण संदर्भ डालें, यह ठीक है। लंबे [] के रूप में ठीक भी होना चाहिए

  @Test public void test1() throws Exception { Unsafe unsafe = Util.unsafe; int base = unsafe.arrayBaseOffset(int[].class); int scale = unsafe.arrayIndexScale(int[].class); int shift = 31 - Integer.numberOfLeadingZeros(scale); System.out.printf("base: %s, scale %s, shift: %s\n", base, scale, shift); base = unsafe.arrayBaseOffset(Object[].class); scale = unsafe.arrayIndexScale(Object[].class); shift = 31 - Integer.numberOfLeadingZeros(scale); System.out.printf("base: %s, scale %s, shift: %s\n", base, scale, shift); int[] ints = { 1, 2, 0 }; String string = "abc"; System.out.printf("string: id: %X, hash: %s\n", System.identityHashCode(string), string.hashCode()); unsafe.putObject(ints, offset(2, shift, base), string); System.out.printf("ints: %s, %X\n", Arrays.toString(ints), ints[2]); Object o = unsafe.getObject(ints, offset(2, shift, base)); System.out.printf("ints: %s\n", o); assertSame(string, o); Object[] oa = { 1, 2, string }; o = unsafe.getObject(oa, offset(2, shift, base)); assertSame(string, o); int id = unsafe.getInt(oa, offset(2, shift, base)); System.out.printf("id=%X\n", id); } public static long offset(int index, int shift, int base) { return ((long) index << shift) + base; } 

वास्तव में पता सूर्य से प्राप्त किया जा सकता है। Mesc.Unsafe लेकिन यह वास्तव में बहुत असुरक्षित है। जीसी अक्सर वस्तुओं को चालित करता है

जावा में संभव है कि कोई वस्तु का एक संदर्भ पता पाने के लिए, जैसे कि आपके स्ट्रिंग किसी वस्तु का संदर्भ पता उपयोगकर्ता में जावा में छिपा हुआ है।

सी में, आप पॉइंटर्स की अवधारणा के माध्यम से ऐसा कर सकते हैं जावा की एक समान अवधारणा है, निम्न स्तर पर, और यह संदर्भ पता है। संदर्भ सी पॉइंटर की तरह है, लेकिन यह स्पष्ट नहीं है। सी में, आप * माध्यम से पॉइंटर्स को संदर्भित करने का कार्य कर सकते हैं, लेकिन जावा में, यह संभव नहीं है।

मुझे सी भाषा बहुत पसंद नहीं है, क्योंकि मेरे अनुसार, संकेतक प्रबंधन करने के लिए एक आसान अवधारणा नहीं हैं। यह एक कारण है क्योंकि मुझे जावा पसंद है, क्योंकि प्रोग्रामर को ऑब्जेक्ट के सूचक के बारे में चिंता करने की जरूरत नहीं है।

जैसे @ जेर्न्जो कहते हैं, तो आप जांच सकते हैं, यदि कुछ संदर्भ समान हैं, तो इस तरह की वाक्यविन्यास के साथ:

 String s = "hello"; String g = s; System.out.println("Are the reference addresses similar? "+(s==g)); g = "goodbye"; System.out.println("Are the reference addresses similar? "+(s==g)); 

ध्यान दें कि == संदर्भ पते की समानता जांचता है। यदि आप तारों के मूल्य की समानता को देखना चाहते हैं, तो equals() विधि का उपयोग करें

मैं आपको इस SO प्रश्न को पढ़ने के लिए सुझाव देता हूं, यह विकिपीडिया पृष्ठ और यह पृष्ठ।