JavaRush /בלוג Java /Random-HE /רמה 29. תשובות לשאלות ראיון בנושא הרמה
DefNeo
רָמָה

רמה 29. תשובות לשאלות ראיון בנושא הרמה

פורסם בקבוצה
רמה 29. תשובות לשאלות ראיון בנושא רמה - 1
  1. מה קרה autoboxing?

    אגרוף אוטומטי הוא מנגנון לאתחול מרומז של אובייקטים של מחלקות מעטפת (בייט, קצר, תווים, מספר שלם, ארוך, צף, כפול) עם הערכים של הסוגים הפרימיטיביים המקוריים המתאימים להם (בהתאמה, , , , , , , , byte) short, charללא int. שימוש longמפורש בבנאי המחלקה.floatdouble

    אוטובוקס מתרחש כאשר פרימיטיבי מוקצה ישירות למחלקת עטיפה (באמצעות =האופרטור " "), או כאשר פרימיטיבי מועבר לפרמטרים של שיטה (כגון "מחלקה עטיפה"). שני משתנים מסוגים פרימיטיביים וקבועי זמן קומפילציה (מילוליים ו final-פרימיטיביים) ניתנים לאריזה אוטומטית ל"מחלקות עטיפה". במקרה זה, מילוליות חייבות להיות נכונות תחבירית כדי לאתחל משתנה מהסוג הפרימיטיבי המקורי.

    אחסון אוטומטי של משתנים מסוגים פרימיטיביים דורש התאמה מדויקת לסוג הפרימיטיבי המקורי - סוג "מחלקת העטיפה". לדוגמה, ניסיון לתרגם אוטומטית משתנה מסוג byteלתוך Short, מבלי לבצע תחילה cast מפורש, byte->shortיגרום לשגיאת קומפילציה.

    אוטובוקס של קבועי סוג פרימיטיביים מאפשר גבולות התאמה רחבים יותר. במקרה זה, המהדר מסוגל לבצע הרחבה/צמצום מרומזים של טיפוסים פרימיטיביים מראש. השינוי מתרחש בשני שלבים:

    1. הרחבה מרומזת (צמצום) של הסוג הפרימיטיבי המקורי לסוג הפרימיטיבי המתאים למחלקת ה-wrapper (להמרה int->Byte, ראשית המהדר מצטמצם באופן מרומז intל- byte)

    2. אריזה אוטומטית של פרימיטיבי ל"מחלקת העטיפה" המתאימה (המהדר אורז אוטומטית byte->Byte). עם זאת, במקרה זה ישנן שתי הגבלות נוספות:

      • הקצאת פרימיטיבי ל"עטיפה" יכולה להתבצע רק באמצעות =האופרטור " " (לא ניתן להעביר פרימיטיבי כזה לפרמטרים של שיטה ללא ליהוק סוג מפורש)

      • סוג האופרנד השמאלי לא יכול להיות ישן יותר מ Character, סוג האופרנד הימני לא יכול להיות ישן יותר מ int, (מותרת הרחבה/התכווצות byte <-> short, byte <-> char, short <-> char
        ורק צמצום byte <- int, short <- int, char <- int, כל שאר האפשרויות דורשות ליהוק סוג מפורש)

    תכונה נוספת של "מחלקות עטיפה" של מספרים שלמים שנוצרו על ידי קבועי אגרוף אוטומטי בטווח -128 +127 היא שהם נשמרים במטמון על ידי ה-JVM. לכן, עטיפות כאלה עם אותם ערכים יהיו הפניות לאובייקט אחד.

  2. למה משתמשים בו autoboxing?

    אצטט את ההרצאה:

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

  3. Альтернативы autoboxing?

    Не нашел ответа, но запостил на StackOverFlow.

    Исходя из этой дискуссии, получается, что альтернатива autoboxing`у это использование примитивных типов, так How использовние autoboxing`a снижает производительность. Вывод: использовать autoboxing только там где это необходимо.

    Написана статья про Autoboxing: Autoboxing: Traps and Advantages

  4. Типы-обертки для примитивных типов mutable or immutable?

    Immutable, так How примитивные an objectы тоже immutable. Whatбы работать How с Mutable типом есть класс MutableInteger, и.т.д.

  5. Как примитивные типы приводятся к непримитивным аналогам?

    На этот и последующий вопросы хорошо отвечает вот эта статья: Автоупаковка и распаковка в Java

    Это заключение из нее: автоупаковка является механизмом для скрытого преобразования примитивных типов данных в соответствующие классы-оболочки (an objectы). Компилятор использует метод valueOf() чтобы преобразовать примитивные типы в an objectы, а методы IntValue(), doubleValue() и т.д., чтобы получить примитивные типы из an object (то есть обратное преобразование). Автоупаковка преобразует логический тип boolean в Boolean, byte в Byte, char в Character, float в Float, int в Integer, long в Long, short в Short. Распаковка происходит в обратном направлении.

  6. Как непримитивные типы приводятся к примитивным?

    Выше ответил.

  7. Как сравниваются примитивные и непримитивные типы?

    В лекции это подробно рассматривается, но я нашел так скажем тоже самое, но другими словами.

    В Java есть два способа сравнивать an objectы на equalsство, == и метод equals().

    == используется для примитивных типов. Для an objectов «==» это исключительно сравнение ссылок. Для остальных случаев нужно использовать метод equals(). Кроме того метод hashCode() служит (в теории) для той же цели. Хорошим тоном считается, если вы переопределor equals() и hashCode(). После инициализации неких an objectов a и b должно выполняться правило:

    Если выражение a.equals(b) вернет true, то a.hashCode() должен быть equals b.hashCode().

  8. Всегда ли создается новый an object при операции autoboxing?

    Это в лекциях есть:

    Когда мы присваиваем переменной типа Integer meaning типа int, при этом вызывается метод Integer.valueOf: функция valueOf не всегда создает новый an object типа Integer. Она кэширует значения от -128 до 127.

    Если передаваемое meaning выходит за эти пределы, то новый an object создается, а если нет, то нет.

    Если мы пишем new Integer(), то гарантированно создается новый an object. Если мы вызываем Integer.valueOf(), явно or при autoboxing, то этот метод может вернуть для нас How новый an object, так и отдать an object из кэша, если переданное число лежит в диапазоне от -128 до 127.

  9. Как работает кэширование при операции autoboxing?

    Ответил в вопросе выше, на всякий случай создал вопрос на StackOverFlow, но там отвечают тоже самое

  10. Для Howих типов и/or значений работает кэширование?

    В восьмом вопросе. Если у кого – то есть соображения на тему трех последних вопросов, то напишите в комментариях.

הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION