JavaRush /وبلاگ جاوا /Random-FA /سطح 29. پاسخ به سؤالات مصاحبه در مورد موضوع سطح
DefNeo
مرحله

سطح 29. پاسخ به سؤالات مصاحبه در مورد موضوع سطح

در گروه منتشر شد
سطح 29. پاسخ به سوالات مصاحبه با موضوع سطح - 1
  1. چه اتفاقی افتاده است autoboxing؟

    اتوباکسینگ مکانیزمی است برای مقداردهی اولیه اشیاء از کلاس‌های wrapper (بایت، کوتاه، کاراکتر، عدد صحیح، طولانی، شناور، دوگانه) با مقادیر انواع اولیه متناظر آنها (به ترتیب، , , , , , byte, short) charبدون استفاده صریح از سازنده کلاسintlongfloatdouble

    اتوباکسینگ زمانی اتفاق می افتد که یک اولیه به طور مستقیم به یک کلاس wrapper اختصاص داده شود (با استفاده از =عملگر " ")، یا زمانی که یک اولیه به پارامترهای یک روش (مانند یک "کلاس wrapper") منتقل می شود. هر دو متغیر انواع ابتدایی و ثابت های زمان کامپایل (حرفه ای و finalابتدایی) را می توان به صورت خودکار در "کلاس های wrapper" بسته بندی کرد. در این مورد، لفظ ها باید از نظر نحوی صحیح باشند تا متغیری از نوع اولیه اولیه را مقداردهی کنند.

    اتوباکس کردن متغیرهای انواع ابتدایی نیاز به تطابق دقیق با نوع اولیه اولیه دارد - نوع "کلاس wrapper". به عنوان مثال، تلاش برای جعبه‌سازی خودکار یک متغیر نوع byteدر Short, بدون اینکه ابتدا ارسال صریح را انجام دهید، byte->shortباعث خطای کامپایل می‌شود.

    اتوباکسینگ ثابت‌های نوع اولیه اجازه می‌دهد تا مرزهای تطبیق گسترده‌تری داشته باشند. در این حالت، کامپایلر می‌تواند پیشاپیش بسط/تحریک‌سازی ضمنی انواع اولیه را انجام دهد. تحول در دو مرحله انجام می شود:

    1. بسط ضمنی (تریک کردن) نوع اولیه اولیه به نوع اولیه مربوط به کلاس wrapper (برای تبدیل int->Byte، ابتدا کامپایلر به طور ضمنی intبه byte) محدود می شود.

    2. بسته‌بندی خودکار یک اولیه به «کلاس wrapper» مناسب (کامپایلر بسته‌های خودکار byte->Byte). با این حال، در این مورد دو محدودیت اضافی وجود دارد:

      • تخصیص یک primitive به یک "wrapper" فقط با استفاده از عملگر " " انجام می شود =(شما نمی توانید چنین اولیه ای را به پارامترهای روش بدون ریخته گری نوع صریح ارسال کنید)

      • نوع عملوند سمت چپ نباید قدیمی تر از ، Characterنوع عملوند راست نباید بزرگتر از، باشد ( intبسط/انقباض مجاز است byte <-> short، و فقط باریک کردن ،،،، همه گزینه های دیگر نیاز به ریخته گری نوع صریح دارند)byte <-> charshort <-> char
        byte <- intshort <- intchar <- 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