تفاوت == و equals در مقایسه String در جاوا

وقتی با استفاده از == دو شئ از نوع String را مقایسه میکنیم، در حقیقت ما آدرس دو String در حافظه را مقایسه مینماییم تا به این نتیجه برسیم که آنها یک شی هستند یا دو شی متفاوت. لاکن وقتی از Equals در مقایسه دو String استفاده میکنیم در حقیقت مقدار Value دو String را مقایسه میکنیم.

متغیر s1 به شی ارجاع دارد که با مقدار Hello ایجاد شده است، همچنین شی جدیدی که s2 به آن اشاره دارد توسط s1 مقدار دهی اولیه شده است، پس مقدار دو متغیر s1  و s2 برابر می باشد، لاکن این دو متغیر به دو محل مختلف حافظه ارجاع داده شده اند و این به این معنی می باشد که دو متغیر s1و  s2 یک شی نمی باشند. پس در صورتی که آنها را با == مقایسه نماییم به دلیل اینکه به دو مکان متفاوت در حافظه ارجاع داده شده اند، مقدار false بازگشت داده می شود، اما در صورتی که آنها را با equals مقایسه نماییم به دلیل اینکه محتوای دو متغیر s1 و s2 با هم مقایسه میشود مقدار true  بازگشت داده می شود. اما s1=s3 برابر true می باشد. دلیل آن این است که آنها به شی یکسانی در String Pool اشاره میکند.در Java نسخه ۷ برای اینکه String ها در Cache قرار بگیرند نباید از new در ایجاد String استفاده نمود. همچنین در این نسخه از جاوا String ها در حافظه  Heap در String Pool ذخیره می شوند. به همین دلیل محدودیتی جهت سایز وجود ندارد.

در Java 6 تمامی String ها در حافظه PermGen که بخش ثابتی از حافظه Heap می باشد ذخیره می شود، این بخش وظیفه نگهداری اطلاعات String ها و تمامی کلاس های بارگذاری شده در حافظه را برعهده دارد.

مرجع: Top 50+ Core Java Interview Questions and Answers