אתחול מחרוזת בג'אווה

1. הקדמה

ג'אווה חוּט הוא אחד השיעורים החשובים ביותר וכבר סקרנו הרבה מההיבטים שלו חוּטסדרת הדרכות הקשורה.

במדריך זה נתמקד חוּט אתחול בג'אווה.

2. יצירה

קודם כל, עלינו לזכור איך חוּטs נוצרים בג'אווה.

אנחנו יכולים להשתמש ב- חָדָשׁ מילת מפתח או התחביר המילולי:

מחרוזת באמצעות New = מחרוזת חדשה ("baeldung"); מחרוזת באמצעות ליטרלית = "באלדונג";

וחשוב גם שנבין כיצד חוּטהם מנוהלים בבריכה מיוחדת.

3. חוּט הצהרה בלבד

ראשית, בואו פשוט להכריז א חוּט, מבלי להקצות ערך במפורש.

אנו יכולים לעשות זאת באופן מקומי או כמשתנה חבר:

מעמד ציבורי StringInitialization {String fieldString; בטל printDeclaredOnlyString () {String localVarString; // System.out.println (localVarString); -> שגיאת אוסף System.out.println (fieldString); }}

כפי שאנו רואים, אם ננסה להשתמש localVarString לפני שנתן לו ערך נקבל שגיאת אוסף. מצד שני, הקונסולה תציג "ריק" ל fieldStringהערך.

לִרְאוֹת, משתני חבר מאותחלים עם ערך ברירת מחדל כאשר הכיתה נבנית, ריק ב חוּטהמקרה. אבל, עלינו לאתחל בעצמנו משתנים מקומיים.

אם אנו נותנים localVarString ערך של ריק, נראה שהשניים, אכן, עכשיו שווים:

מחרוזת localVarString = null; assertEquals (fieldString, localVarString);

4. חוּט אתחול באמצעות ספרות

בואו ניצור שניים חוּטs משתמשים באותה מילולית:

מחרוזת letteralOne = "Baeldung"; מחרוזת letteralTwo = "באלדונג";

נאשר שרק אובייקט אחד נוצר על ידי השוואת הפניות:

assertTrue (literalOne == literalTwo);

הסיבה לכך נובעת מכך ש חוּטs מאוחסנים בבריכה. ממש מוסיף חוּט "Baeldung" לבריכה, ו מילולית שני עושה בו שימוש חוזר.

5. חוּט אתחול באמצעות חָדָשׁ

אנו נראה התנהגות שונה אם נשתמש ב- חָדָשׁ מילת מפתח.

מחרוזת newStringOne = מחרוזת חדשה ("Baeldung"); מחרוזת newStringTwo = מחרוזת חדשה ("Baeldung");

אמנם הערך של שניהם חוּטs יהיו זהים לקודם, נצטרך הפעם לאובייקטים שונים:

assertFalse (newStringOne == newStringTwo);

6. ריק חוּטס

בואו ניצור כעת שלוש ריקות חוּטs:

מחרוזת emptyLiteral = ""; מחרוזת emptyNewString = מחרוזת חדשה (""); מחרוזת emptyNewStringTwo = מחרוזת חדשה ();

כידוע עד עכשיו, ה ריק מילולית יתווסף ל חוּט הבריכה, בעוד ששני האחרים הולכים ישירות אל הערמה.

אמנם לא יהיו אותם אובייקטים, אך לכולם יהיה אותו ערך:

assertFalse (emptyLiteral == emptyNewString) assertFalse (emptyLiteral == emptyNewStringTwo) assertFalse (emptyNewString == emptyNewStringTwo) assertEquals (emptyLiteral, emptyNewString); assertEquals (emptyNewString, emptyNewStringTwo);

7. ריק ערכים

לבסוף, בואו נראה עד כמה אפס חוּטלהתנהג.

בואו נכריז ונתחיל את האפס חוּט:

מחרוזת nullValue = null;

אם הדפסנו nullValueהיינו רואים את המילה "null", כפי שראינו בעבר. ואם ניסינו להפעיל שיטות כלשהן nullValue, היינו מקבלים א NullPointerException, כצפוי.

אבל, מדוע מודפס "null"? מה זה ריק בעצם?

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

אז מאיפה מגיע "null" להדפסת a חוּט לאחר מכן?

אם נסתכל על PrintStream #println היישום, נראה את זה קורא מחרוזת # valueOf:

חלל ציבורי println (אובייקט x) {String s = String.valueOf (x); מסונכרן (זה) {הדפס (ים); שורה חדשה(); }}

וגם אם נסתכל על מחרוזת # valueOf, אנו מקבלים את תשובתנו:

סטטי ציבורי מחרוזת valueOf (Object obj) {return (obj == null)? "null": obj.toString (); }

וברור שזו הסיבה ל"אפס ".

8. מסקנה

במאמר זה חקרנו חוּט אִתחוּל. הסברנו על ההבדל בין הצהרה לאתחול. נגענו גם בשימוש חָדָשׁ ושימוש בתחביר המילולי.

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

כל דוגמאות הקוד המשמשות במאמר זמינות באתר Github.