জাভাতে দুটি পূর্ণসংখ্যার সঠিকভাবে তুলনা কীভাবে?


215

আমি জানি যে আপনি যদি কোনও বক্সযুক্ত আদিম পূর্ণসংখ্যার সাথে ধ্রুবকের সাথে তুলনা করেন যেমন:

Integer a = 4;
if (a < 5)

a স্বয়ংক্রিয়ভাবে আনবক্সড হবে এবং তুলনা কাজ করবে।

যাইহোক, আপনি যখন দুটি বক্সযুক্ত তুলনা করছেন Integersএবং সমতা বা তার চেয়ে কম / তার চেয়ে কম তুলনা করতে চান তখন কী হয় ?

Integer a = 4;
Integer b = 5;

if (a == b)

উপরের কোডগুলি কি একই বস্তু কিনা তা খতিয়ে দেখার ফলাফল দেবে, না সে ক্ষেত্রে এটি স্বয়ংক্রিয়ভাবে আনবক্স করবে?

কি সম্পর্কে:

Integer a = 4;
Integer b = 5;

if (a < b)

?


16
আচ্ছা, আপনি চেষ্টা করার পরে কি ঘটেছে? আপনি কি পালন করেছেন?
বার্ট কায়ার্স

31
@ বার্ট কায়ারস: একটি স্পষ্ট পরীক্ষা কেবল অস্বীকার করতে পারে, প্রমাণ করতে পারে না যে আনবক্সিং ঘটে। যদি ফলটির ==পরিবর্তে equalsসঠিক ফলাফল ব্যবহার করা হয় তবে এটি কারণ বক্সযুক্ত নম্বরগুলি অভ্যন্তরীণ করা হচ্ছে বা অন্যথায় পুনরায় ব্যবহার করা হচ্ছে (সংকলক অপ্টিমাইজেশন হিসাবে, সম্ভবত)। এই প্রশ্নটি জিজ্ঞাসা করার কারণটি হ'ল অভ্যন্তরীণভাবে কী ঘটছে বলে মনে হচ্ছে তা নয়, যা ঘটছে তা খুঁজে বের করা। (কমপক্ষে, এজন্যই আমি এখানে আছি))
জিম পিভারস্কি

আপনার অ্যাকাউন্টে কি হয়েছে?

উত্তর:


301

না, == পূর্ণসংখ্যা, লং ইত্যাদির মধ্যে রেফারেন্স সমতার জন্য পরীক্ষা করবে - যেমন

Integer x = ...;
Integer y = ...;

System.out.println(x == y);

এই পরীক্ষা কিনা হবে xএবং yপড়ুন একই বস্তুর পরিবর্তে সমান বস্তুগুলির ।

সুতরাং

Integer x = new Integer(10);
Integer y = new Integer(10);

System.out.println(x == y);

মুদ্রণ করার জন্য নিশ্চিত করা হয় false। "ছোট" অটোবক্স মানগুলিকে অন্তর্ভুক্ত করার ফলে জটিল ফলাফল হতে পারে:

Integer x = 10;
Integer y = 10;

System.out.println(x == y);

এটি মুদ্রণ করবে true, বক্সিংয়ের নিয়মের কারণে ( জেএলএস বিভাগ 5.1.7 )। এটা এখনও রেফারেন্স সমতা এর ব্যবহার করা হচ্ছে, কিন্তু রেফারেন্স সত্যি সত্যি হয় সমান।

বাক্সযুক্ত মানটি যদি -128 এবং 127 সমেত (.3.10.1) এর মধ্যে টাইপ ইন্টের একটি পূর্ণসংখ্যার আক্ষরিক হয়, বা বুলিয়ান আক্ষরিক সত্য বা মিথ্যা (§3.10.3), বা '00 u0000' এবং এর মধ্যে একটি অক্ষর আক্ষরিক হয় '\ u007f' অন্তর্ভুক্ত (.3.10.4), তারপরে a এবং b এর কোনও দুটি বক্সিং রূপান্তরগুলির ফলাফল হোক। এটি সর্বদা ক্ষেত্রে যে a == খ।

ব্যক্তিগতভাবে আমি ব্যবহার করব:

if (x.intValue() == y.intValue())

অথবা

if (x.equals(y))

আপনি বলতে হিসেবে, একটি মোড়কের প্রকার (মধ্যে কোনো তুলনা জন্য Integer, Longইত্যাদি) এবং একটি সাংখ্যিক প্রকার ( int, longইত্যাদি) মোড়কের টাইপ মান unboxed এবং পরীক্ষা আদিম জড়িত মান প্রয়োগ করা হয়।

এটি বাইনারি সংখ্যার প্রচারের ( জেএলএস বিভাগ 5.6.2 ) অংশ হিসাবে ঘটে । এটি প্রয়োগ হয়েছে কিনা তা দেখতে প্রতিটি পৃথক অপারেটরের ডকুমেন্টেশন দেখুন Look উদাহরণস্বরূপ, এর জন্য ডক্স থেকে ==এবং !=( জেএলএস 15.21.1 ):

যদি কোনও সমতা অপারেটরের অপারেন্ডস উভয় সংখ্যার প্রকারের হয়, বা একটি সংখ্যার প্রকারের এবং অন্যটি রূপান্তরযোগ্য (§5.1.8) থেকে সংখ্যার প্রকারে হয় তবে বাইনারি সংখ্যার প্রচার অপারেন্ডগুলিতে (.65.6.2) সঞ্চালিত হয়।

এবং জন্য <, <=, >এবং >=( JLS 15.20.1 )

সংখ্যার তুলনা অপারেটরের প্রতিটি অপারেন্ডের প্রকারটি অবশ্যই এমন এক প্রকারের হতে হবে যা রূপান্তরযোগ্য (§5.1.8) আদিম সংখ্যার প্রকারে পরিণত হয়, বা একটি সংকলন-সময় ত্রুটি ঘটে। বাইনারি সংখ্যার প্রচার অপারেশনগুলিতে সঞ্চালিত হয় (.65.6.2)। অপারেন্ডদের প্রচারিত ধরণেরটি যদি আন্ত বা দীর্ঘ হয় তবে স্বাক্ষরিত পূর্ণসংখ্যার তুলনা সম্পাদন করা হয়; যদি এই প্রচারিত প্রকারটি ভাসমান বা দ্বিগুণ হয়, তবে ভাসমান-পয়েন্ট তুলনা করা হয়।

নোট টাইপ কোনও সংখ্যার প্রকার নয় এমন পরিস্থিতিতে কীভাবে এর কোনওটিকেই বিবেচনা করা হবে তা নোট করুন ।


2
এর x.compareTo(y) < 0পরিবর্তে কেন কেউ লিখতে চান এমন কোনও কারণ আছে x < y?
সর্বাধিক ন্যানসি

1
@ ম্যাক্সন্যান্যাসি: আমি অবিলম্বে এটি ভাবতে পারি না।
জন স্কিটি

2
জাভা ১..2.২ of+ হিসাবে পূর্ণসংখ্যার শ্রেণিতে সমান পরিমাণে একটি ওভারলোড রয়েছে, সুতরাং এটি .intValue () কল করার মতো দক্ষ হওয়া উচিত। এটি মানগুলিকে আদিম অন্তরের সাথে তুলনা করে।
অটলস্লাইড

যেমন @otterslide বলেছে, জাভা 8 এ আর প্রয়োজন হয় না। পূর্ণসংখ্যার সাথে পূর্ণসংখ্যার তুলনা মান অনুসারে ডিফল্ট হয়।
এক্সেল প্রিয়েটো

1
@ অ্যাক্সেল: ওভারলোড যুক্ত করা == অপারেটরের আচরণের পরিবর্তন করবে না, তাই না? আমি এখনই পরীক্ষার মতো অবস্থানে নেই, তবে যদি এটি পরিবর্তন হয়ে থাকে তবে আমি খুব অবাক হব।
জন স্কিটি

44

==তবুও বস্তুর সাম্য পরীক্ষা করবে। বোকা বানানো সহজ, তবে:

Integer a = 10;
Integer b = 10;

System.out.println(a == b); //prints true

Integer c = new Integer(10);
Integer d = new Integer(10);

System.out.println(c == d); //prints false

অসমতার সাথে আপনার উদাহরণগুলি কার্যকর হবে যেহেতু সেগুলি বস্তুগুলিতে সংজ্ঞায়িত করা হয়নি। যাইহোক, ==তুলনার সাথে, অবজেক্টের সাম্যতা এখনও পরীক্ষা করা হবে। এই ক্ষেত্রে, আপনি যখন বক্সযুক্ত আদিম থেকে বস্তুগুলি সূচনা করবেন তখন একই বস্তুটি ব্যবহৃত হবে (এ এবং বি উভয়ের জন্য)। প্রাথমিক বাক্স ক্লাসগুলি পরিবর্তনযোগ্য না হওয়ায় এটি একটি ঠিকঠাক অপ্টিমাইজেশন।


আমি অনুভব করেছি যে এটি বস্তুর সমতা পরীক্ষা করা হচ্ছে। আমি কিছু অদ্ভুত ফলাফল ছিল। আমি কি এটি .equals () দিয়ে প্রতিস্থাপন করব? এছাড়াও, আপনি কি অনুভব করছেন যে অসম্পূর্ণতাগুলি আমার মতো করে ছেড়ে দেওয়া উচিত বা এটি অন্যভাবে করা উচিত?

অটোবক্সিং সহ কিছু অ-সুস্পষ্ট প্রান্তের কেস রয়েছে। আমার আইডিই (Eclipse) সেটটি লাল রঙের বাক্সবিক্সিত হওয়াতে রঙিন করতে সেট করেছে, এটি আমাকে কয়েকবার বাগ থেকে বাঁচিয়েছে। আপনি যদি দুটি পূর্ণসংখ্যার সাথে তুলনা করে থাকেন তবে .equals ব্যবহার করুন, আপনি যদি নিজের অসমতাগুলিকে পরিষ্কার করতে চান তবে কাস্টটি স্পষ্টভাবে লিখুন: যদি ((int) c <(int) d) ...; আপনি এটিও করতে পারেন: c.compareTo (d) <0 // === c <d
অ্যাডাম লুইস

12
এবং আপনি যদি সংখ্যাটি আক্ষরিক হিসাবে পরিবর্তন করেন তবে 200উভয় পরীক্ষা মুদ্রণ করবে false
ড্যানিয়েল আরউইকার

2
... বেশিরভাগ জেভিএম বাস্তবায়নের ক্ষেত্রে, এটি। ভাষা অনুমান অনুসারে ফলাফল বাস্তবায়নের মধ্যে পৃথক হতে পারে।
ড্যানিয়েল আর্উইকার

4
আমি মনে করি এটি "রেফারেন্স সমতা" বলা ততটাই স্পষ্ট - এইভাবে আপনি কী বোঝাতে চেয়েছেন তা স্পষ্ট। আমি সাধারণত "অবজেক্টের সমতা" বোঝার অর্থ " equalsডাকা হওয়ার ফলাফল" বোঝাতে চাইতাম ।
জন স্কিটি

28

জাভা 1.7 যেহেতু আপনি অবজেক্টস.ওয়ালগুলি ব্যবহার করতে পারেন :

java.util.Objects.equals(oneInteger, anotherInteger);

যদি আর্গুমেন্ট একে অপরের সমান হয় এবং অন্যথায় মিথ্যা হয় তবে তা সত্য দেখায়। ফলস্বরূপ, উভয় যুক্তি যদি নাল হয় তবে সত্য ফিরে আসে এবং ঠিক যদি একটি যুক্তি নাল হয় তবে মিথ্যা ফিরিয়ে দেওয়া হয়। অন্যথায়, প্রথম আর্গুমেন্টের সমান পদ্ধতিটি ব্যবহার করে সাম্যতা নির্ধারণ করা হয়।


এটি নালগুলি পরিচালনা করে তাই এটি সহজ করে তোলে। ধন্যবাদ!
ড্যারেন পার্কার

10

== কোড লেখার সময় রেফারেন্সের সমতার জন্য পরীক্ষা করে:

Integer a = 1;
Integer b = 1;

জাভা জন্য একই অপরিবর্তনীয় পুনরায় ব্যবহার করার জন্য স্মার্ট যথেষ্ট aএবং b, তাই এই সত্য: a == b। কৌতূহলী, আমি যেখানে জাভা এইভাবে অনুকূলকরণ বন্ধ করে তা দেখানোর জন্য একটি ছোট্ট উদাহরণ লিখেছি:

public class BoxingLol {
    public static void main(String[] args) {
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            Integer a = i;
            Integer b = i;
            if (a != b) {
                System.out.println("Done: " + i);
                System.exit(0);
            }
        }
        System.out.println("Done, all values equal");
    }
}

যখন আমি এটি সংকলন করি এবং চালিত করি (আমার মেশিনে), আমি পাই:

Done: 128

1
হাতের তরবারির জন্য tl; dr -1; stackoverflow.com/questions/15052216/… স্ট্যাকওভারফ্লো / প্রশ্ন / 20897020/… স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ৩৩১১১3636 // ইন্টিজারস- ক্যাচিং- ইন জাভা ইত্যাদি আপনার উল্লেখ করা বিষয়টি বিস্তারিতভাবে ব্যাখ্যা করে; ফলাফলের উচ্চ স্থানীয় অঞ্চলের ঝুঁকি নিয়ে সিউডো-পরীক্ষা তৈরি করার চেয়ে ডকস (বা লিব উত্স) পড়া ভাল - আপনি কেবল ক্যাশের নীচের সীমানা সম্পর্কে সম্পূর্ণরূপে ভুলে গেছেন না (যেমন -128 ডিফল্টরূপে), কেবল তা নয় আপনার এক-এক-এক (সর্বোচ্চ 127 নয়, 128 নয়),

তবে কোনও মেশিনে একই ফল পাওয়ার সম্পূর্ণ গ্যারান্টি আপনার কাছে নেই - যেহেতু আপনি সহজেই নিজেকে ক্যাশের আকার বাড়াতে পারবেন , ওয়াইএমএমভি। এছাড়াও, ওপির প্রশ্ন ছিল কীভাবে দুটি পূর্ণসংখ্যার সঠিকভাবে তুলনা করা যায় - আপনি এটির কোনও উত্তর দেননি

আমি এখানে আপনার মতামত এবং উপলব্ধি শ্রদ্ধা। আমি মনে করি আমাদের কাছে সিএসের কাছে মৌলিকভাবে পৃথক পদ্ধতি রয়েছে।
Cory Kendall

1
এটি মতামত বা উপলব্ধি সম্পর্কে নয় - এটি সেই তথ্যগুলির সম্পর্কে , যা আপনি আন্তরিকভাবে মিস করেছেন। কোনও হার্ড ব্যাকিং ডেটা (ডকস, উত্স ইত্যাদি) ছাড়াই এবং ওপি-র প্রশ্নের উত্তর না দিয়ে কিছু না বলে সিউডো-টেস্টিং করা ভাল প্রশ্নোত্তর বা সিএস না বলে অভিহিত নয়। "বিভিন্ন অভিগমন" হিসেবে - সি এস সংজ্ঞা, একটি দ্বারা হয় বিজ্ঞান ; আপনি বিজ্ঞান যা করেছেন তা নয় ; এটি একটি বিভ্রান্তিকর ট্রিভিয়া (বা এটি একটি উদ্ভট মন্তব্য হবে , যদি সঠিকভাবে বলা হয়) - আপনি যদি এটি বিজ্ঞান হতে চান তবে আপনার উত্তরের মৌলিক ত্রুটিগুলি সংশোধন করুন বা সেগুলি বুদ্ধিমানের সাথে প্রত্যাখ্যান করুন 'কাজ করে।

অবশ্যই, আমি ত্রুটিগুলি সমাধান করার চেষ্টা করব। আমি নিম্ন সীমা সম্পর্কে ভুলে যাইনি, আমি এটি আকর্ষণীয় মনে করি না এবং এটি অন্তর্ভুক্ত না করা পছন্দ করি। আমি বিশ্বাস করি না যে আমি একটি ত্রুটি করেই বন্ধ করে দিয়েছি, আমি জাভাটি (যেটি আমার মেশিনে আমার অবস্থাতেই স্পষ্ট করে দিয়েছিলাম ) যেভাবে বলা হয়েছে এটির অনুকূলকরণ বন্ধ হয়েছিল, যা ছিল ১২৮-এ। এটির জন্য, আপনার ঠিক চেয়ে উত্তরটি 127 হত
কোরি কেন্ডল

8

tl; ডাঃ আমার অভিমত +মান সমতা পরীক্ষা করার সময় অপারেটরগুলির মধ্যে একটিতে আনবক্সিং ট্রিগার করতে একটি ইউনিারি ব্যবহার করা এবং অন্যথায় গণিত অপারেটরগুলি কেবল ব্যবহার করা। যুক্তি অনুসরণ করে:

এটি ইতিমধ্যে উল্লেখ করা হয়েছে যে এর ==জন্য তুলনা Integerহ'ল পরিচয় তুলনা, যা সাধারণত কোনও প্রোগ্রামার চান তা নয় এবং লক্ষ্যটি মূল্য তুলনা করা; তবুও, কোড কম্প্যাক্টনেস, নির্ভুলতা এবং গতি উভয় ক্ষেত্রে, কীভাবে সেই তুলনাটি সবচেয়ে দক্ষতার সাথে করা যায় সে সম্পর্কে আমি একটি সামান্য বিজ্ঞান করেছি ।

আমি সাধারন গুচ্ছ পদ্ধতি ব্যবহার করেছি:

public boolean method1() {
    Integer i1 = 7, i2 = 5;
    return i1.equals( i2 );
}

public boolean method2() {
    Integer i1 = 7, i2 = 5;
    return i1.intValue() == i2.intValue();
}

public boolean method3() {
    Integer i1 = 7, i2 = 5;
    return i1.intValue() == i2;
}

public boolean method4() {
    Integer i1 = 7, i2 = 5;
    return i1 == +i2;
}

public boolean method5() { // obviously not what we want..
    Integer i1 = 7, i2 = 5;
    return i1 == i2;
}

এবং সংকলন এবং সংক্ষেপণের পরে এই কোডটি পেয়েছে:

public boolean method1() {
    Integer var1 = Integer.valueOf( 7 );
    Integer var2 = Integer.valueOf( 5 );

    return var1.equals( var2 );
}

public boolean method2() {
    Integer var1 = Integer.valueOf( 7 );
    Integer var2 = Integer.valueOf( 5 );

    if ( var2.intValue() == var1.intValue() ) {
        return true;
    } else {
        return false;
    }
}

public boolean method3() {
    Integer var1 = Integer.valueOf( 7 );
    Integer var2 = Integer.valueOf( 5 );

    if ( var2.intValue() == var1.intValue() ) {
        return true;
    } else {
        return false;
    }
}

public boolean method4() {
    Integer var1 = Integer.valueOf( 7 );
    Integer var2 = Integer.valueOf( 5 );

    if ( var2.intValue() == var1.intValue() ) {
        return true;
    } else {
        return false;
    }
}

public boolean method5() {
    Integer var1 = Integer.valueOf( 7 );
    Integer var2 = Integer.valueOf( 5 );

    if ( var2 == var1 ) {
        return true;
    } else {
        return false;
    }
}

আপনি সহজেই দেখতে পাচ্ছেন, পদ্ধতি 1 কলগুলি Integer.equals()(স্পষ্টতই), পদ্ধতিগুলি 2-4 ফলাফল একই কোডের ফলে হ'ল মূল্যগুলি মুছে ফেলা হয় .intValue()এবং তারপরে তাদের সরাসরি তুলনা করে, এবং পদ্ধতি 5 কেবল একটি পরিচয়ের তুলনা চালিত করে, যা ভুল পথে রয়েছে being মানগুলির তুলনা করুন।

যেহেতু (যেমন ইতিমধ্যে জেএস দ্বারা উল্লিখিত) equals()একটি ওভারহেড অন্তর্ভুক্ত করে (এটি করতে হবে instanceofএবং একটি চেক না করা castালাই), টাইট লুপগুলিতে ব্যবহার করার সময়, পদ্ধতি 1 এর চেয়ে লক্ষণীয়ভাবে আরও ভাল পদ্ধতি কার্যকর হবে, যেহেতু হটস্পট নয় কাস্টসগুলি & অপ্টিমাইজ করার সম্ভাবনা রয়েছে instanceof

এটি অন্যান্য তুলনামূলক অপারেটরগুলির সাথে একেবারে অনুরূপ (যেমন </ >) - ব্যবহার করার সময় তারা আনবক্সিং ট্রিগার compareTo()করবে - তবে এইচএসএস কর্তৃক এই অপারেশনটি অত্যন্ত অপ্টিমাইজযোগ্য, যেহেতু intValue()কেবলমাত্র একটি গেটর পদ্ধতি (অপ্টিমাইজড আউটপ্রাইম প্রার্থী)।

আমার মতে, খুব কম ব্যবহৃত সংস্করণ 4 সবচেয়ে সংক্ষিপ্ত উপায় - প্রতিটি পাকা সি / জাভা বিকাশকারী জানে যে অ্যানারি প্লাস বেশিরভাগ ক্ষেত্রে int/ .intValue()- তে কাস্ট করার সমান হয় যখন কারও কারও কাছে এটি সামান্য ডাব্লুটিএফ মুহুর্ত হতে পারে (বেশিরভাগই যারা করেনি তাদের জীবদ্দশায় অবিচ্ছিন্ন প্লাস ব্যবহার করবেন না), এটি যুক্তিটি সুস্পষ্টভাবে এবং সবচেয়ে নিখুঁতভাবে দেখায় - এটি দেখায় যে আমরা intঅপারেন্ডগুলির একটির একটি মান চাই এবং অন্য মানটি আনবক্সেও চাপিয়ে দিতে পারি। এটি i1 == i2আদিম intমানের জন্য ব্যবহৃত নিয়মিত তুলনার সাথেও নিরপেক্ষভাবে সর্বাধিক অনুরূপ ।

আমার ভোট জন্য যায় i1 == +i2& i1 > i2জন্য শৈলী Integer, বস্তু উভয় কর্মক্ষমতা ও দৃঢ়তা কারণে। এটি টাইপ ডিক্লেয়ারেশন ব্যতীত অন্য কিছু পরিবর্তন না করে কোডটিকে আদিমদের কাছে পোর্টেবল করে তোলে। নামযুক্ত পদ্ধতিগুলি ব্যবহার করে মনে হয় প্রচুর সমালোচিত bigInt.add(10).multiply(-3)শৈলীর অনুরূপ আমার কাছে শব্দার্থক শব্দটি প্রবর্তন করার মতো ।


পদ্ধতি 4 এর + এর অর্থ কী আপনি ব্যাখ্যা করতে পারেন? আমি এটি গুগল করার চেষ্টা করেছি কিন্তু আমি কেবলমাত্র সেই চিহ্নের সাধারণ ব্যবহারগুলি (সংযোজন, উপসংহার) পেয়েছি।
অ্যালেক্স লি

1
@AlexLi এটা মানে আমি ঠিক কি লিখেছে - unary +(ইউনারী প্লাস), দেখতে যেমন stackoverflow.com/questions/2624410/...

8

কল করা হচ্ছে

if (a == b)

বেশিরভাগ সময় কাজ করবে তবে এটি সর্বদা কাজ করার গ্যারান্টিযুক্ত নয়, তাই এটি ব্যবহার করবেন না।

সমতা জন্য দুটি পূর্ণসংখ্যার শ্রেণীর তুলনা করার সবচেয়ে সঠিক উপায়, তাদের ধরে নেওয়া হয় যে তাদের 'এ' এবং 'বি' নাম দেওয়া হয়েছে:

if(a != null && a.equals(b)) {
  System.out.println("They are equal");
}

আপনি এই উপায়টিও ব্যবহার করতে পারেন যা কিছুটা দ্রুত।

   if(a != null && b != null && (a.intValue() == b.intValue())) {
      System.out.println("They are equal");
    } 

আমার মেশিনে 99 বিলিয়ন অপারেশনগুলি প্রথম পদ্ধতিটি ব্যবহার করে 47 সেকেন্ড এবং দ্বিতীয় পদ্ধতিটি ব্যবহার করে 46 সেকেন্ড নিয়েছিল। কোনও পার্থক্য দেখতে আপনার কয়েক বিলিয়ন মানের সাথে তুলনা করা দরকার।

মনে রাখবেন যে এটি একটি অবজেক্টের কারণে 'এ' নਾਲ হতে পারে। এইভাবে তুলনা করলে নাল পয়েন্টার ব্যতিক্রম ঘটবে না।

এর চেয়ে বেশি এবং কম তুলনা করার জন্য, ব্যবহার করুন

if (a != null && b!=null) {
    int compareValue = a.compareTo(b);
    if (compareValue > 0) {
        System.out.println("a is greater than b");
    } else if (compareValue < 0) {
        System.out.println("b is greater than a");
    } else {
            System.out.println("a and b are equal");
    }
} else {
    System.out.println("a or b is null, cannot compare");
}

1
if (a==b)শুধুমাত্র ছোট মানগুলির জন্য কাজ করে এবং বেশিরভাগ সময় কাজ করে না।
টনি

এটি জাভা-র ডিফল্ট পূর্ণসংখ্যা ক্যাশে হিসাবে 127 পর্যন্ত কাজ করে, যা নিশ্চিত করে যে 127 অবধি সমস্ত সংখ্যার একই রেফারেন্স মান রয়েছে। আপনি চাইলে 127 এরও বেশি উপরে ক্যাশে সেট করতে পারেন তবে নিরাপদ থাকার জন্য কেবল == ব্যবহার করবেন না।
অটর্স্লাইড

2

দুটি পূর্ণসংখ্যার জন্য তুলনা করার জন্য আমাদের সর্বদা সমান () পদ্ধতির দিকে যাওয়া উচিত the এটি প্রস্তাবিত অনুশীলন।

যদি আমরা JVM এর অভ্যন্তরীণ অপ্টিমাইজেশনের কারণে == ব্যবহার করে দুটি পূর্ণসংখ্যার তুলনা করি যা নির্দিষ্ট পূর্ণসংখ্যার মানগুলির জন্য (-128 থেকে 127 পর্যন্ত পূর্ণসংখ্যার) কাজ করবে।

উদাহরণগুলি দেখুন:

মামলা 1:

পূর্ণসংখ্যা a = 100; পূর্ণসংখ্যা খ = 100;

if (a == b) {
    System.out.println("a and b are equal");
} else {
   System.out.println("a and b are not equal");
}

উপরের ক্ষেত্রে জেভিএম ক্যাশেড পুল থেকে a এবং b এর মান ব্যবহার করে এবং পূর্ণসংখ্যার একই বস্তুর উদাহরণ (সুতরাং মেমরি ঠিকানা) ফেরত দেয় এবং আমরা উভয়ই সমান হয়ে যাই certain নির্দিষ্ট রেঞ্জের মানগুলির জন্য একটি অপ্টিমাইজেশন জেভিএম করে।

কেস 2: এই ক্ষেত্রে, a এবং b সমান নয় কারণ এটি -128 থেকে 127 এর পরিসীমা নিয়ে আসে না।

পূর্ণসংখ্যা a = 220; পূর্ণসংখ্যা খ = 220;

if (a == b) {
    System.out.println("a and b are equal");
} else {
   System.out.println("a and b are not equal");
}

সঠিক উপায়:

Integer a = 200;             
Integer b = 200;  
System.out.println("a == b? " + a.equals(b)); // true

আশা করি এটা কাজে লাগবে.


1

আমার ক্ষেত্রে আমাকে দুটি তুলনা করতে হয়েছিল Integer উভয়কে সমতার জন্য যেখানে উভয়ই হতে পারে null। অনুরূপ বিষয় অনুসন্ধান করা হয়েছে, এর জন্য মার্জিত কিছু খুঁজে পাওয়া যায় নি। একটি সাধারণ ইউটিলিটি ফাংশন নিয়ে এসেছিল।

public static boolean integersEqual(Integer i1, Integer i2) {
    if (i1 == null && i2 == null) {
        return true;
    }
    if (i1 == null && i2 != null) {
        return false;
    }
    if (i1 != null && i2 == null) {
        return false;
    }
    return i1.intValue() == i2.intValue();
}

//considering null is less than not-null
public static int integersCompare(Integer i1, Integer i2) {
    if (i1 == null && i2 == null) {
        return 0;
    }
    if (i1 == null && i2 != null) {
        return -1;
    }
    return i1.compareTo(i2);
}

-1

কারণ তুলনামূলক পদ্ধতিটি সঠিক অপারেটরের সাথে টাইপ ইন্ট (x == y) বা শ্রেণীর পূর্ণসংখ্যা (x.equals (y)) এর উপর ভিত্তি করে সম্পন্ন করতে হবে

public class Example {

    public static void main(String[] args) {
     int[] arr = {-32735, -32735, -32700, -32645, -32645, -32560, -32560};

        for(int j=1; j<arr.length-1; j++)
            if((arr[j-1]!=arr[j]) && (arr[j]!=arr[j+1])) 
                System.out.println("int>"+arr[j]);


    Integer[] I_arr = {-32735, -32735, -32700, -32645, -32645, -32560, -32560};

        for(int j=1; j<I_arr.length-1; j++)
            if((!I_arr[j-1].equals(I_arr[j])) && (!I_arr[j].equals(I_arr[j+1]))) 
                System.out.println("Interger>"+I_arr[j]);
    }
}

-2

এই পদ্ধতিটি নাল চেকের সাথে দুটি পূর্ণসংখ্যার তুলনা করে, পরীক্ষাগুলি দেখুন

public static boolean compare(Integer int1, Integer int2) {
    if(int1!=null) {
        return int1.equals(int2);
    } else {
        return int2==null;
    }
    //inline version:
    //return (int1!=null) ? int1.equals(int2) : int2==null;
}

//results:
System.out.println(compare(1,1));           //true
System.out.println(compare(0,1));           //false
System.out.println(compare(1,0));           //false
System.out.println(compare(null,0));        //false
System.out.println(compare(0,null));        //false
System.out.println(compare(null,null));     //true

4
এর জন্য, আমি মনে করি Objects.equals(x,y)আপনার নিজের ঘূর্ণায়মানের পরিবর্তে পদ্ধতিটি ব্যবহার করা আরও ভাল ।
রাইভ্যানেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.