logo

מחרוזת בלתי ניתנת לשינוי ב-Java

מחרוזת היא סוג בלתי נמנע של משתנה בעת כתיבת כל תוכנית יישום. הפניות למחרוזות משמשות לאחסון תכונות שונות כמו שם משתמש, סיסמה וכו'. ב-Java, אובייקטי מחרוזת אינם ניתנים לשינוי . ללא שינוי פירושו פשוט בלתי ניתן לשינוי או בלתי ניתן לשינוי.

לאחר יצירת אובייקט מחרוזת לא ניתן לשנות את הנתונים או המצב שלו, אך נוצר אובייקט מחרוזת חדש.

בואו ננסה להבין את המושג אי-שינוי על ידי הדוגמה המובאת להלן:

Testimmutablestring.java

 class Testimmutablestring{ public static void main(String args[]){ String s='Sachin'; s.concat(' Tendulkar');//concat() method appends the string at the end System.out.println(s);//will print Sachin because strings are immutable objects } } 
בדוק את זה עכשיו

תְפוּקָה:

 Sachin 

כעת ניתן להבין זאת על ידי התרשים המופיע להלן. כאן Sachin לא משתנה אלא נוצר אובייקט חדש עם Sachin Tendulkar. לכן String ידוע כבלתי ניתן לשינוי.

מחרוזת בלתי ניתנת לשינוי ב-Java

כפי שאתה יכול לראות באיור לעיל שנוצרים שני אובייקטים אבל ס משתנה התייחסות עדיין מתייחס ל'Sachin' ולא ל'Sachin Tendulkar'.

אבל אם נקצה אותו במפורש למשתנה ההתייחסות, הוא יתייחס לאובייקט 'Sachin Tendulkar'.

לדוגמה:

Testimmutablestring1.java

 class Testimmutablestring1{ public static void main(String args[]){ String s='Sachin'; s=s.concat(' Tendulkar'); System.out.println(s); } } 
בדוק את זה עכשיו

תְפוּקָה:

np.concatenate
 Sachin Tendulkar 

במקרה כזה, s מצביע על ה'סכין טנדלקר'. שים לב שאובייקט Sachin עדיין לא השתנה.

מדוע אובייקטי מחרוזת אינם ניתנים לשינוי ב-Java?

כמו ש-Java משתמש במושג מחרוזת מילולית. נניח שיש 5 משתני התייחסות, כולם מתייחסים לאובייקט אחד 'Sachin'. אם משתנה התייחסות אחד משנה את ערך האובייקט, הוא יושפע מכל משתני ההתייחסות. זו הסיבה שאובייקטי מחרוזת אינם ניתנים לשינוי ב-Java.

להלן כמה תכונות של String שהופכות אובייקטים של String לבלתי ניתנים לשינוי.

1. ClassLoader:

ClassLoader ב-Java משתמש באובייקט String כארגומנט. קחו בחשבון שאם אובייקט String ניתן לשינוי, הערך עשוי להשתנות והמחלקה שאמורה להיטען עשויה להיות שונה.

כדי למנוע פירוש שגוי זה, String אינו ניתן לשינוי.

2. בטוח בשרשור:

מכיוון שאובייקט ה-String אינו ניתן לשינוי, איננו צריכים לדאוג לסנכרון הנדרש בזמן שיתוף אובייקט על פני שרשורים מרובים.

3. אבטחה:

כפי שראינו בטעינת המחלקה, אובייקטי String בלתי ניתנים לשינוי נמנעים משגיאות נוספות על ידי טעינת המחלקה הנכונה. זה מוביל להפיכת תוכנית היישום לאבטחה יותר. שקול דוגמה לתוכנת בנקאות. לא ניתן לשנות את שם המשתמש והסיסמה על ידי כל פולש מכיוון שאובייקטי מחרוזת אינם ניתנים לשינוי. זה יכול להפוך את תוכנית היישום לאבטחה יותר.

4. שטח ערימה:

חוסר השינוי של String עוזר למזער את השימוש בזיכרון הערימה. כאשר אנו מנסים להכריז על אובייקט String חדש, ה-JVM בודק האם הערך כבר קיים ב-String pool או לא. אם הוא קיים, אותו ערך מוקצה לאובייקט החדש. תכונה זו מאפשרת ל-Java להשתמש בשטח הערימה ביעילות.

מדוע שיעור מחרוזת הוא סופי ב-Java?

הסיבה לכך שהמחלקה String היא סופית היא משום שאף אחד לא יכול לעקוף את השיטות של המחלקה String. כך שהוא יכול לספק את אותן תכונות לאובייקטי String החדשים כמו גם לישנים.