JavaRush /مدونة جافا /Random-AR /المستوى 29. إجابات لأسئلة المقابلة حول موضوع المستوى
DefNeo
مستوى

المستوى 29. إجابات لأسئلة المقابلة حول موضوع المستوى

نشرت في المجموعة
المستوى 29. إجابات أسئلة المقابلة حول موضوع المستوى - 1
  1. ماذا حدث autoboxing؟

    Autoboxing هي آلية لتهيئة كائنات فئات الغلاف ضمنيًا (Byte، Short، Character، Integer ، Long، Float، Double) مع قيم الأنواع البدائية الأصلية المقابلة لها (على التوالي، , , , , , , byte, short) charبدون الاستخدام الواضح لمنشئ الفئة.intlongfloatdouble

    يحدث Autoboxing عندما يتم تعيين بدائي مباشرة إلى فئة مجمّع (باستخدام =عامل التشغيل " ")، أو عندما يتم تمرير بدائي إلى معلمات أسلوب ما (مثل "فئة مجمّع"). finalيمكن تعبئة كل من متغيرات الأنواع البدائية وثوابت وقت الترجمة (الأحرف الحرفية والأوليات) تلقائيًا في "فئات مجمعة". في هذه الحالة، يجب أن تكون القيم الحرفية صحيحة نحويًا لتهيئة متغير من النوع البدائي الأصلي.

    يتطلب التخصيص التلقائي لمتغيرات الأنواع البدائية تطابقًا تامًا مع نوع النوع البدائي الأصلي - نوع "فئة الغلاف". على سبيل المثال، ستؤدي محاولة وضع متغير نوع byteفي المربع التلقائي Short، دون إجراء عملية تحويل صريحة أولاً، byte->shortإلى حدوث خطأ في الترجمة.

    يسمح التخصيص التلقائي لثوابت النوع البدائي بحدود مطابقة أوسع. في هذه الحالة، يكون المترجم قادرًا على إجراء تمديد/تضييق ضمني للأنواع البدائية مقدمًا. يحدث التحول على مرحلتين:

    1. التوسع الضمني (التضييق) للنوع البدائي الأصلي إلى النوع البدائي المطابق لفئة الغلاف (للتحويل int->Byte، يقوم المترجم أولاً بتضييق نطاقه ضمنيًا intإلى byte)

    2. التعبئة التلقائية لعنصر بدائي في "فئة الغلاف" المناسبة (الحزم التلقائية للمترجم byte->Byte). ومع ذلك، في هذه الحالة هناك قيدين إضافيين:

      • لا يمكن إجراء تعيين بدائي إلى "مجمّع" إلا باستخدام =عامل التشغيل " " (لا يمكنك تمرير مثل هذا العنصر البدائي إلى معلمات الطريقة دون صب النوع الصريح)

      • يجب ألا يكون نوع المعامل الأيسر أقدم من Character، ويجب ألا يكون نوع المعامل الأيمن أقدم من ، int(يُسمح بالامتداد/التضييق byte <-> short، والتضييق فقط ،،،، وتتطلب جميع الخيارات الأخرى صب النوع الصريح )byte <-> charshort <-> char
        byte <- intshort <- intchar <- int

    ميزة إضافية لـ "فئات المجمع" التي تم إنشاؤها بواسطة ثوابت autoboxing في النطاق -128 +127 هي أنه تم تخزينها مؤقتًا بواسطة JVM. لذلك، فإن هذه الأغلفة التي لها نفس القيم ستكون مرجعًا لكائن واحد.

  2. لماذا يتم استخدامه autoboxing؟

    سأقتبس المحاضرة:

    كما تتذكر، تحتوي Java على كلا النوعين الموروثين من الفئة 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