জাভাতে ভেরিয়েবলের মেমরি ঠিকানা


139

নীচের ছবিটি একবার দেখুন। আমরা যখন newকীওয়ার্ড সহ জাভাতে কোনও বস্তু তৈরি করি তখন আমরা ওএস থেকে একটি মেমরি ঠিকানা পাই।

আমরা যখন লিখি out.println(objName)আমরা আউটপুট হিসাবে একটি "বিশেষ" স্ট্রিং দেখতে পাই। আমার প্রশ্নগুলি হ'ল:

  1. এই আউটপুটটি কি?
  2. এটি যদি মেমরি ঠিকানা হয় যা ওএস আমাদের দেওয়া হয়েছে:

    ক) আমি কীভাবে এই স্ট্রিংটিকে বাইনারি রূপান্তর করতে পারি?

    খ) আমি কীভাবে একটি পূর্ণসংখ্যের ভেরিয়েবলের ঠিকানা পেতে পারি?

বিকল্প পাঠ


5
আমি ভোট দিচ্ছি না কারণ প্রশ্নটি যথেষ্ট পরিষ্কার, কেবল একটি পরামর্শ যা আপনার এটি পাঠ্যে করা উচিত ছিল যাতে লোকেরা এটি অনুসন্ধান করতে পারে
phunehehe

2
Sun.misc.Unsafe ব্যবহার করে জাভা কোনও জিনিসের ঠিকানা পাওয়া সম্ভব। প্রোগ্রাম লিস্টিংয়ের
জোসেফ

নির্দেশিত মান হ'ল হেক্সাডেসিমাল উপস্থাপনা হ'ল হ্যাডকোডের এ 1 এবং এ 2
নবীন

উত্তর:


166

এটি শ্রেণীর নাম এবং ' সিস্টেমের ' নামটি হ্যাশকোড () '@' অক্ষর দ্বারা পৃথক। সনাক্তকরণের হ্যাশ কোডটি যা প্রয়োগ করে তা বাস্তবায়ন-নির্দিষ্ট। এটি প্রায়শই বস্তুর প্রাথমিক মেমরি ঠিকানা হয় তবে সময়ের সাথে সাথে ভিএম দ্বারা বস্তুটি মেমরিতে স্থানান্তরিত হতে পারে। সুতরাং (সংক্ষেপে) আপনি এটি কিছুতেই ভরসা করতে পারবেন না।

জাভের মধ্যে ভেরিয়েবলের মেমোরি ঠিকানাগুলি পাওয়া অর্থহীন, যেহেতু জেভিএম বস্তুগুলি বাস্তবায়িত করতে এবং এটি যথাযথ বলে মনে হচ্ছে এগুলি সরিয়ে নেওয়ার স্বাধীনতা রয়েছে (আপনার জিনিসগুলি আবর্জনা সংগ্রহের সময় ঘুরে আসতে পারে) ইত্যাদি)

Integer.toBinaryString () আপনাকে বাইনারি আকারে একটি পূর্ণসংখ্যা দেবে।


33
আর একটি আকর্ষণীয় বিষয় হ'ল পরিচয় হ্যাশ কোডগুলি অনন্য হওয়ার গ্যারান্টিযুক্ত নয়। উদাহরণস্বরূপ 64৪-বিট জেভিএম-তে 2 ^ 32 পরিচয়ের হ্যাশ কোড রয়েছে তবে 2 ^ 64 মেমরি ঠিকানা রয়েছে
অ্যালেক্স জেসমিন

11
আসলে, পরিচয় হ্যাশ কোডটি পরিবর্তন করতে পারে না , অন্যথায় হ্যাশকোড () এর চুক্তি লঙ্ঘন করা হবে।
ম্যাট ম্যাকহেনরি

1
লগগুলি নির্ধারণের জন্য আমি লগিং / ডিবাগিংয়ের জন্য এটি ব্যবহার করছি যখন বস্তুগুলি সমতুল্য পরিবর্তে একই বস্তুটির দিকে নির্দেশ করছে। এই উদ্দেশ্যগুলির জন্য identityHashcodeঅর্থ অর্থহীন নয়, এটি কেবল নির্বোধ নয়। :)
টানা স্লেজগাড়ির

@ ব্রায়ান অ্যাগনিউ: আমি জানতে চাই -> দুটি বস্তুর কেন একই হ্যাশকোড রয়েছে? আমি বিভ্রান্ত হয়ে পড়েছি কারণ আমি সি বা সি ++ শিখেছি প্রতিটি ভেরিয়েবল বা অবজেক্টের মেমরির আলাদা অবস্থান রয়েছে। তারপরে জাভাতে কীভাবে একই হ্যাশকোড দিয়ে দুটি বস্তু সনাক্ত বা আলাদা করতে পারে।
বেদ প্রকাশ

1
@ ওয়েডপ্রকাশ অবজেক্ট হ্যাশকোড বস্তুগুলিকে হ্যাশ সংগ্রহে সংরক্ষণ করতে দেয়। আপনি যদি দুটি ভিন্ন বস্তুর পার্থক্য করতে চান তবে আপনি কেবল রেফারেন্সের সমতাটি ব্যবহার করতে পারেন
ব্রায়ান অগ্নিউ

36

এটি ব্যবহার করে সম্ভব sun.misc.Unsafe: @ পিটার লরির এই দুর্দান্ত উত্তরটি দেখুন -> কোনও রেফারেন্স ঠিকানা পাওয়ার কোনও উপায় আছে কি?

মুদ্রণ ঠিকানাগুলির জন্য এর কোড ব্যবহার করে ():

    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();
}

আমি এই পরীক্ষাটি সেট আপ করেছি:

    //hashcode
    System.out.println("Hashcode :       "+myObject.hashCode());
    System.out.println("Hashcode :       "+System.identityHashCode(myObject));
    System.out.println("Hashcode (HEX) : "+Integer.toHexString(myObject.hashCode()));

    //toString
    System.out.println("toString :       "+String.valueOf(myObject));

    printAddresses("Address", myObject);

এখানে ফলাফল:

Hashcode :       125665513
Hashcode :       125665513
Hashcode (HEX) : 77d80e9
toString :       java.lang.Object@77d80e9
Address: 0x7aae62270

উপসংহার:

  • হ্যাশকোড! = ঠিকানা
  • টুস্ট্রিং = ক্লাস @ এইচএক্স (হ্যাশকোড)

13

এটি অবজেক্টের "টু স্ট্রিং ()" প্রয়োগের আউটপুট। যদি আপনার শ্রেণি স্ট্রিং () তে ওভাররাইড করে তবে এটি সম্পূর্ণ আলাদা কিছু মুদ্রণ করবে।


6

এটি মেমরি ঠিকানা নয় এটি ক্লাসেরাম @ হ্যাশকোড

কোথায়

শ্রেণীর নাম = সম্পূর্ণ যোগ্য নাম বা পরম নাম (অর্থাত প্যাকেজের নাম শ্রেণীর নাম অনুসারে)

হ্যাশকোড = হেক্সাডেসিমাল ফর্ম্যাট (সিস্টেম.ডিনিটিটিহ্যাশকোড (অবজেক্ট) বাজেজ.হ্যাশকোড () আপনাকে দশমিক ফর্ম্যাটে হ্যাশকোড দেবে))


4

সুনীল যেমন বলেছিল, এটি মেমরির ঠিকানা নয় his এটি কেবল হ্যাশকোড

একই @ সামগ্রী পেতে, আপনি এটি করতে পারেন:

যদি সেই শ্রেণিতে হ্যাশকোড ওভাররাইড না করা হয়:

"@" + Integer.toHexString(obj.hashCode())

যদি হ্যাশকোড ওভাররাইড হয় তবে আপনি মূল মানটি এতে পাবেন:

"@" + Integer.toHexString(System.identityHashCode(obj)) 

এটি প্রায়শই মেমরি ঠিকানার সাথে বিভ্রান্ত হয় কারণ আপনি যদি হ্যাশকোড () টি ওভাররাইড না করেন তবে মেমরি ঠিকানাটি হ্যাশ গণনা করতে ব্যবহৃত হয়।


1

আপনি যা পাচ্ছেন তা হ'ল অবজেক্ট শ্রেণির টোস্ট্রিং () পদ্ধতির ফলাফল বা আরও স্পষ্টভাবে, পরিচয় হ্যাশকোড () উজয় 95 হিসাবে চিহ্নিত করেছেন।

"যখন আমরা নতুন কীওয়ার্ড সহ জাভাতে কোনও বস্তু তৈরি করি, তখন আমরা ওএস থেকে একটি মেমরি ঠিকানা পাই।"

এটি বোঝা গুরুত্বপূর্ণ যে আপনি জাভাতে যা কিছু করেন তা জাভা ভার্চুয়াল মেশিন দ্বারা পরিচালিত হয়। এটি জেভিএমই এই তথ্য দিচ্ছে। হোস্ট অপারেটিং সিস্টেমের র‌্যামে আসলে কী ঘটে থাকে তা সম্পূর্ণ জেআরই বাস্তবায়নের উপর নির্ভর করে।



0

জাভাতে যখন আপনি কোনও শ্রেণীর মতো কোনও বস্তু তৈরি করছেন Person p = new Person();, pআসলে একটি মেমরির অবস্থানের ঠিকানা যা কোনও ধরণের দিকে নির্দেশ করে Person

মুদ্রণের জন্য স্টেটমনেট ব্যবহার করার সময় pআপনি একটি ঠিকানা দেখতে পাবেন। newকী শব্দ একটি নতুন মেমরি অবস্থানকে সব উদাহরণস্বরূপ ভেরিয়েবল ও পদ্ধতি যা অন্তর্ভুক্ত করা হয় ধারণকারী তোলে class Personএবং pমেমরি অবস্থান নির্দেশ রেফারেন্স পরিবর্তনশীল।


আপনার ছবিতে a1 এবং a2 দুটি ভিন্ন মেমরি ঠিকানা addresses এটি দুটি আলাদা মান পাওয়ার পিছনে কারণ।
পান্ডুকা বুড়িসিংহে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.