বক্সযুক্ত দীর্ঘ মান 127 এবং 128 এর সাথে তুলনা করা


110

আমি শর্ত ব্যবহার করে দুটি দীর্ঘ বস্তুর মান তুলনা করতে চাই if। যখন এই মানগুলি 128 এরও কম হয় , ifঅবস্থাটি সঠিকভাবে কাজ করে, তবে যখন সেগুলি 128 এর চেয়ে বড় বা সমান হয় , তুলনা ব্যর্থ হয়।

উদাহরণ:

Long num1 = 127;
Long num2 = 127;

if (num1 == num2) {
    // Works ok
}

উপরের কোডের সাথে তুলনাটি সঠিকভাবে কাজ করে তবে নীচের কোডে ব্যর্থ হয়:

Long num1 = 128;
Long num2 = 128;

if (num1 == num2) {
    // Does NOT work
}

লং ভেরিয়েবলের 127 এর চেয়ে বেশি মানের সাথে তুলনা করতে কেন সমস্যা হচ্ছে ? যদি ভেরিয়েবলের ডেটা টাইপগুলি দীর্ঘ আদিমগুলিতে পরিবর্তিত হয় , তবে তুলনাগুলি সকল ক্ষেত্রেই কাজ করে।

উত্তর:


212

টি এল; ডিআর

জাভা ক্যাশে থেকে পূর্ণসংখ্যা দৃষ্টান্ত boxed -128করতে 127। যেহেতু আপনি মানগুলির পরিবর্তে ==অবজেক্টের রেফারেন্সগুলি তুলনা করতে ব্যবহার করছেন তাই কেবল ক্যাশেড অবজেক্টগুলি মিলবে। হয় আনবক্সড আদিম মানগুলির সাথে কাজ করুন বা আপনার বস্তুর তুলনা করতে ব্যবহার করুন ।long.equals()Long

দীর্ঘ (পাং উদ্দেশ্যে) সংস্করণ

লং ভেরিয়েবলের 127 এর চেয়ে বেশি মানের সাথে তুলনা করতে সমস্যা কেন? উপরের ভেরিয়েবলের ডেটা ধরণ যদি আদিম (দীর্ঘ) হয় তবে কোডটি সমস্ত মানের জন্য কাজ করে।

জাভা পূর্ণ-অবধি -128 থেকে 127 অবধি অবধি নজরে রাখে । বলেছিল:

  • আপনি যদি এন লং ভেরিয়েবল মান 127( ক্যাশেড ) সেট করেন তবে একই বস্তুর উদাহরণটি সমস্ত রেফারেন্স দ্বারা নির্দেশিত হবে। (এন ভেরিয়েবল, 1 উদাহরণ)
  • আপনি যদি এন লং ভেরিয়েবলের মানটি সেট করেন 128( ক্যাশেড নয় ), আপনার কাছে প্রতিটি রেফারেন্স দ্বারা নির্দেশিত কোনও অবজেক্টের উদাহরণ থাকবে। (এন ভেরিয়েবল, এন দৃষ্টান্ত)

এ কারণেই:

Long val1 = 127L;
Long val2 = 127L;

System.out.println(val1 == val2);

Long val3 = 128L;
Long val4 = 128L;

System.out.println(val3 == val4);

ফলাফল:

সত্য
মিথ্যা

জন্য 127L মান, মেমরি (ক্যাশে) উভয় রেফারেন্স (val1 এবং val2) একই বস্তু উদাহরণস্বরূপ বিন্দু থেকে, এটা ফেরৎ true

অন্যদিকে, 128 মানের জন্য, যেহেতু এটি মেমরিতে ক্যাশে হওয়ার কোনও উদাহরণ নেই, তাই বাক্সযুক্ত মানগুলির জন্য কোনও নতুন অ্যাসাইনমেন্টের জন্য একটি নতুন তৈরি করা হয়, যার ফলস্বরূপ দুটি পৃথক দৃষ্টান্ত (ভ্যাল 3 এবং ভাল 4 দ্বারা নির্দেশিত) হয় এবং ফিরে falseআসে তাদের মধ্যে তুলনা।

এটি কেবলমাত্র তাই ঘটে কারণ আপনি অপারেটরের সাথে দুটি Long বস্তুর রেফারেন্স , longআদিম মানগুলি তুলনা করছেন না ==। যদি এটি এই ক্যাশে প্রক্রিয়াটির জন্য না হয়, তবে এই তুলনাগুলি সর্বদা ব্যর্থ হয়, সুতরাং এখানে আসল সমস্যাটি ==অপারেটরের সাথে বক্সযুক্ত মানগুলির তুলনা করা ।

এই ভেরিয়েবলগুলিকে আদিম longপ্রকারে পরিবর্তন করা এটিকে রোধ করবে, তবে আপনাকে যদি আপনার কোডগুলি Longঅবজেক্টগুলি ব্যবহার করে রাখার প্রয়োজন হয় তবে আপনি নিরাপদে নিম্নলিখিত পদ্ধতির সাথে এই তুলনাগুলি তৈরি করতে পারেন:

System.out.println(val3.equals(val4));                     // true
System.out.println(val3.longValue() == val4.longValue());  // true
System.out.println((long)val3 == (long)val4);              // true

(যথাযথ নাল চেকিং প্রয়োজনীয়, এমনকি ingsালাইয়ের জন্যও)

আইএমও , অবজেক্টের তুলনার সাথে ডিল করার সময় সর্বদা .equals () পদ্ধতিগুলি ধরে রাখা ভাল ধারণা ।

রেফারেন্স লিঙ্ক:


15

জাভা -128 থেকে 127 পর্যন্ত আদিম মানকে ক্যাশে করে । যখন আমরা দুটি লং অবজেক্টের সাথে জাভা অভ্যন্তরীণভাবে টাইপ করি তখন এটি আদিম মানতে কাস্ট করুন এবং এটি তুলনা করুন। তবে 127 এর উপরে লং অবজেক্ট টাইপ জাত পাবেন না। জাভা .valueOf () পদ্ধতি দ্বারা আউটপুটকে ক্যাশে করে ।

এই ক্যাচিং -128 থেকে 127 পর্যন্ত বাইট, শর্ট, লংয়ের জন্য কাজ করে Inte java.lang.Integer.IntegerCache.high) ব্যবহার করে ক্যাশে হওয়া উচিত।

 For example:
    If we set java.lang.Integer.IntegerCache.high=500;
    then values from -128 to 500 will get cached and 

    Integer a=498;
    Integer b=499;
    System.out.println(a==b)

    Output will be "true".

ফ্লোট এবং ডাবল অবজেক্ট কখনই ক্যাশে হয় না।

অক্ষর 0 থেকে 127 পর্যন্ত ক্যাশে পাবেন

আপনি দুটি বস্তুর তুলনা করছেন। সুতরাং == অপারেটর অবজেক্ট রেফারেন্সের সমতা পরীক্ষা করবে। এটি করার জন্য নিম্নলিখিত উপায় রয়েছে।

1) টাইপ করুন উভয় বস্তুকে আদিম মানগুলিতে ফেলে দিন এবং তুলনা করুন

    (long)val3 == (long)val4

2) অবজেক্টের মূল্য পড়ুন এবং তুলনা করুন

    val3.longValue() == val4.longValue()

3) বস্তুর তুলনায় সমান () পদ্ধতি ব্যবহার করুন।

    val3.equals(val4);  

14

num1এবং num2দীর্ঘ বস্তু হয়। আপনি equals()তাদের তুলনা ব্যবহার করা উচিত । ==তুলনা কখনও কখনও জেভিএম বাক্সে আদিম বাক্সগুলির কারণে কাজ করতে পারে তবে এটির উপর নির্ভর করে না।

if (num1.equals(num1))
{
 //code
}

1
এটি (যা আরও ভাল), বা এর ফেরতের মানটি তুলনা করুন .longValue()
জিউলিও ফ্রাঙ্কো

4

জাভাতে অ-আদিম (ওরফে অবজেক্টস) ==তুলনা তাদের মানগুলির পরিবর্তে তাদের রেফারেন্সের সাথে তুলনা করে। Longএকটি শ্রেণি এবং সুতরাং Longমানগুলি অবজেক্টস।

সমস্যাটি হ'ল জাভা ডেভেলপাররা চাইছিল লোকেরা Longযেমন longসামঞ্জস্যতা সরবরাহ করত সেগুলি ব্যবহার করত , যার ফলে অটোবক্সিংয়ের ধারণাটি আসে, যা মূলত বৈশিষ্ট্যটি ছিল that longমূল্যগুলি Long-অবজেক্টে এবং পরিবর্তে প্রয়োজন হিসাবে পরিবর্তিত হবে। অটোবক্সিংয়ের আচরণটি পুরো সময় সুনির্দিষ্টভাবে অনুমানযোগ্য না কারণ এটি পুরোপুরি নির্দিষ্ট করা হয়নি।

সুতরাং নিরাপদ থাকতে এবং পূর্বাভাসযোগ্য ফলাফলগুলি সর্বদা .equals()অবজেক্টগুলির তুলনা করতে ব্যবহার করে এবং এই ক্ষেত্রে অটোবক্সিংয়ের উপর নির্ভর করবেন না:

Long num1 = 127, num2 = 127;
if(num1.equals(num2)) { iWillBeExecutedAlways(); }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.