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)
শৈলীর অনুরূপ আমার কাছে শব্দার্থক শব্দটি প্রবর্তন করার মতো ।