ورود

View Full Version : سوال: نگاهی دوباره و جالب به تساوی



قله بلند
یک شنبه 13 دی 1388, 22:25 عصر
با سلام
مطلب جالبی را خواندم که طی آن با چالشی در این زمینه رو به رو شدم. برای فهمیدن کامل مطلب اظهار نظری نمی کنم و پاسخ آن را از اساتید این بخش تقاضا می کنم.
1- وقتی می گوییم متغیری از نوع عدد صحیح داریم و می نویسیم
int i;دقیقاً منظورمان چیست؟
2- وقتی می نویسیم که دو عدد صحیح با هم برابرند یعنی:
int x=10,y=10;
if(x==y){}منظورمان از تساوی، تساوی دو شیء است، دو متغیر است؟
3-منظور از برنامه زیر چیست؟
public class B
{
public static void main(String args[])
{
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1==n2);//Result is false
System.out.println(n1!=n2);//Result is true
}
} 4-منظور از این برنامه چیست؟
public class B
{
public static void main(String args[])
{
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1.equals(n2));//Result is true
}
} 5-و این برنامه؟
class Value
{
int i;
}
public class B
{
public static void main(String args[])
{
Value n1 = new Value();
Value n2 = new Value();
n1.i=n2.i=100;
System.out.println(n1.equals(n2));//Result is false
}
} منظور من از طرح این سوال ها، یافتن درک درست و صحیح است که نگاه سطحی را از بین می برد.

tdkhakpur
دوشنبه 14 دی 1388, 22:00 عصر
همه این مطالب شما یک پاسخ دارد و اون این هست که شرط تساوی بررسی محتوای حافظه هست خب وقتی شما چه از نوع اشیا و چه از نوع متغیر ها تعریف کنید فرقی به حال شرط ندارد شرط تساوی فقط محتوانی حافظه گرفته شده از دو طرف را بایت به بایت مقایسه میکند و وقتی این دو حافظه در یک بایت با هم تفاوت داشته باشند شرط شما false یا صفر خواهد بود در غیر این صورت true یا همان نتیجه یک را بر گشت خواهد داد.

jlover
پنج شنبه 08 بهمن 1388, 00:07 صبح
این بحث رو راجع به رشته ها به طور کامل در چند صفحه ای از کتاب « جاوا،جاوا،جاوا » در خصوص تفاوت همانی بودن و برابر بودن برای اشیا ( انواع ارجاع ) و نوع رشته که تا حدودی مثل انواع ابتدایی باهاش رفتار میشه،اطلاع داشتم ، ولی درباره مثلا Integer نمیدونستم(حتما در خصوص کلاسهای پوشان دیگه مثل Byte or Character or etc صدق میکنه در کتاب the java lang spec هم در همون بخشهای ابتدایی که تا اینجا خوندم نکات خیلی خوبی در خصوص String ها روشن میکنه در همین رابطه...
اما نتیجه ای که بنده گرفتم به طور خلاصه و به زبون ساده با دخل و تصرف در این منابع :
دو شی با هم برابرند ، اگر و تنها اگر نام هر دو ارجاعی باشد به یک شیء ( منظور از شی اینجا متغیرهای تعریف شده برای ارجاع به یک کلاس هستند ) و در همه ی موارد به غیر از رشته ها - و الن فهمیدم - به علاوه ی کلاسهای پوشان ، کارکرد عبارت تساوی و متد()equals یکی هست.
به این نمونه ها توجه کنید :

Button b1 = new Button();
Button b2 = new Button()
Button b3=b1;

کلید درک این مساله در توجه به عملگر new هست که در واقع یک موجودیت جدید ساخته و فضایی در حافظه بهش تخصیص میده و آدرس اون رو در متغیر( b1,b2 )نگه میداره
اما وقتی خط سوم رو دز نظر میگیرید،شیء جدیدی در واقع ساخته نشده و b3 تنها ارجاع دیگریست به شیئی که در خط اول ساخته شده .
بنابراین :


b1==b2 returns false as b1.equals(b2)
b1==b3 returns true as b1.equals(b3)

اما درباره رشته ها و کلاسهای پوشان(Integer که شما بهش اشره کردید مثلا ) موضوع کمی فرق میکنه :

String s1 = new String("str");
String s2 = new String("str" ;
String s3 = s1 ;

در این نوع،برای بررسی برابری فقط مقدار ذخیره شده در متغیر ارزیابی میشه،چه بسا دو سیء متمایز هم باشند !


s1.equals(s2) returns true while s1 == s2 returns false
also s1==s3 returns true


یه چیزی که باید توجه بفرمایین اینه که در مورد اول شما با دو متغیر از نوع ابتدایی رو به رو هستید،در مثال دوم دو نوع ارجاع با تبصره ای که توضیح داده شد در مثال رشته که عنوان کردم ، و در مورد سوم با متغیر از نوع ارجاعی روبه رو هستید مثل مثال اولیه که بنده آوردم(یعنی مفهوم همانی و برابری یکسانه )