JavaRush /จาวาบล็อก /Random-TH /ระดับ 29 คำตอบสำหรับคำถามสัมภาษณ์ในหัวข้อระดับ
DefNeo
ระดับ

ระดับ 29 คำตอบสำหรับคำถามสัมภาษณ์ในหัวข้อระดับ

เผยแพร่ในกลุ่ม
ระดับ 29 คำตอบสำหรับคำถามสัมภาษณ์ในหัวข้อระดับ - 1
  1. เกิดอะไรขึ้นautoboxing?

    Autoboxingเป็นกลไกในการเริ่มต้นอ็อบเจ็กต์ของคลาส wrapper โดยปริยาย (ไบต์, สั้น, อักขระ, จำนวนเต็ม, ยาว, ลอย, สองเท่า) ด้วยค่าของประเภทดั้งเดิมดั้งเดิมที่สอดคล้องกัน (ตามลำดับ , , , , , , , byte, short) charโดยintไม่มีการใช้ตัวสร้างคลาสlongอย่างชัดเจนfloatdouble

    การทำกล่องอัตโนมัติจะเกิดขึ้นเมื่อมีการกำหนดดั้งเดิมให้กับคลาส wrapper โดยตรง (โดยใช้=ตัวดำเนินการ " ") หรือเมื่อมีการส่งผ่านแบบดั้งเดิมไปยังพารามิเตอร์ของเมธอด (เช่น "คลาส wrapper") ทั้งตัวแปรประเภทดั้งเดิมและค่าคงที่เวลาคอมไพล์ (ตัวอักษรและfinal-พื้นฐาน) สามารถบรรจุอัตโนมัติลงใน "คลาส wrapper" ได้ ในกรณีนี้ ตัวอักษรจะต้องถูกต้องทางวากยสัมพันธ์เพื่อเริ่มต้นตัวแปรที่เป็นประเภทดั้งเดิมดั้งเดิม

    การทำออโตบ็อกซ์ของตัวแปรประเภทดั้งเดิมนั้นจะต้องตรงกันทุกประการกับประเภทของประเภทดั้งเดิมดั้งเดิม - ประเภทของ "คลาส wrapper" ตัวอย่างเช่น การพยายามใส่ตัวแปรประเภทbyteลงใน กล่องอัตโนมัติ Shortโดยไม่ทำการแคสต์อย่างชัดเจนก่อนbyte->shortจะทำให้เกิดข้อผิดพลาดในการคอมไพล์

    การออโต้บ็อกซ์ของค่าคงที่ประเภทดั้งเดิมช่วยให้ขอบเขตการจับคู่กว้างขึ้น ในกรณีนี้ คอมไพลเลอร์สามารถดำเนินการขยาย/ลดขนาดประเภทพื้นฐานโดยนัยล่วงหน้าได้ การเปลี่ยนแปลงเกิดขึ้นในสองขั้นตอน:

    1. การขยายโดยนัย (การทำให้แคบลง) ของประเภทดั้งเดิมดั้งเดิมไปเป็นประเภทดั้งเดิมที่สอดคล้องกับคลาส wrapper (สำหรับการแปลงint->Byteก่อนอื่นคอมไพเลอร์จะแคบลงโดยปริยายintเป็นbyte)

    2. การบรรจุอัตโนมัติของดั้งเดิมลงใน "คลาส wrapper" ที่เหมาะสม (คอมไพเลอร์ autopacks byte->Byte) อย่างไรก็ตาม ในกรณีนี้ มีข้อจำกัดเพิ่มเติมสองประการ:

      • การกำหนดดั้งเดิมให้กับ "wrapper" สามารถทำได้โดยใช้=ตัวดำเนินการ " " เท่านั้น (คุณไม่สามารถส่งผ่านพารามิเตอร์ดั้งเดิมไปยังพารามิเตอร์เมธอดได้หากไม่มีการคัดเลือกประเภทที่ชัดเจน)

      • ประเภทของตัวถูกดำเนินการทางด้านซ้ายจะต้องไม่เก่ากว่าCharacterประเภทของตัวถูกดำเนินการทางขวาจะต้องไม่เก่ากว่า, int(อนุญาตให้ขยาย/การหดตัวได้byte <-> short, และเฉพาะการแคบลง, , , ตัวเลือกอื่น ๆ ทั้งหมดจำเป็นต้องมีการคัดเลือกประเภทที่ชัดเจน)byte <-> charshort <-> char
        byte <- intshort <- intchar <- int

    คุณสมบัติเพิ่มเติมของ "คลาส wrapper" จำนวนเต็มที่สร้างขึ้นโดยค่าคงที่ autoboxing ในช่วง -128 +127 คือ JVM แคชไว้ ดังนั้น wrappers ดังกล่าวที่มีค่าเดียวกันจะอ้างอิงถึงวัตถุเดียว

  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