JavaRush /Blog Java /Random-VI /Cấp độ 29. Trả lời các câu hỏi phỏng vấn về chủ đề cấp độ...
DefNeo
Mức độ

Cấp độ 29. Trả lời các câu hỏi phỏng vấn về chủ đề cấp độ

Xuất bản trong nhóm
Cấp độ 29. Trả lời câu hỏi phỏng vấn về chủ đề cấp độ - 1
  1. Chuyện gì đã xảy ra vậy autoboxing?

    Autoboxing là một cơ chế khởi tạo ngầm các đối tượng của các lớp bao bọc (Byte, Short, Character, Integer, Long, Float, Double) với các giá trị của các kiểu nguyên thủy ban đầu tương ứng của chúng (tương ứng, , , , , , , byte, short) char, intkhông có sử dụng longrõ ràng hàm tạo của lớp.floatdouble

    Tự động đóng hộp xảy ra khi một kiểu nguyên thủy được gán trực tiếp cho một lớp trình bao bọc (sử dụng =toán tử " ") hoặc khi một kiểu nguyên thủy được truyền vào các tham số của một phương thức (chẳng hạn như "lớp trình bao bọc"). Cả hai biến thuộc kiểu nguyên thủy và hằng số thời gian biên dịch (nghĩa đen và final-primitive) đều có thể được tự động đóng gói thành “các lớp trình bao bọc”. Trong trường hợp này, các chữ phải đúng về mặt cú pháp để khởi tạo một biến có kiểu nguyên thủy ban đầu.

    Việc tự động đóng hộp các biến thuộc kiểu nguyên thủy yêu cầu phải khớp chính xác với kiểu của kiểu nguyên thủy ban đầu - kiểu của “lớp trình bao bọc”. Ví dụ: cố gắng tự động chuyển một biến loại bytevào Short, mà không thực hiện ép kiểu rõ ràng trước tiên, byte->shortsẽ gây ra lỗi biên dịch.

    Việc tự động đóng hộp các hằng số kiểu nguyên thủy cho phép các ranh giới khớp rộng hơn. Trong trường hợp này, trình biên dịch có thể thực hiện trước việc mở rộng/thu hẹp ngầm định các kiểu nguyên thủy. Sự biến đổi xảy ra theo hai giai đoạn:

    1. mở rộng ngầm định (thu hẹp) kiểu nguyên thủy ban đầu thành kiểu nguyên thủy tương ứng với lớp trình bao bọc (để chuyển đổi int->Byte, đầu tiên trình biên dịch ngầm thu hẹp intthành byte)

    2. tự động đóng gói một nguyên thủy vào “lớp trình bao bọc” thích hợp (trình biên dịch tự động đóng gói byte->Byte). tuy nhiên, trong trường hợp này có hai hạn chế bổ sung:

      • Việc gán một kiểu nguyên thủy cho một "trình bao bọc" chỉ có thể được thực hiện bằng cách sử dụng =toán tử " " (bạn không thể chuyển một kiểu nguyên thủy như vậy sang các tham số phương thức mà không truyền kiểu rõ ràng)

      • loại toán hạng bên trái không được cũ hơn Character, loại toán hạng bên phải không được cũ hơn int, (cho phép mở rộng/thu hẹp byte <-> short, byte <-> char, short <-> char
        và chỉ thu hẹp byte <- int, short <- int, char <- int, tất cả các tùy chọn khác yêu cầu truyền kiểu rõ ràng)

    Một tính năng bổ sung của "các lớp trình bao bọc" số nguyên được tạo bởi các hằng số tự động đóng hộp trong phạm vi -128 +127 là chúng được JVM lưu vào bộ nhớ đệm. Do đó, các trình bao bọc có cùng giá trị như vậy sẽ là tham chiếu đến một đối tượng.

  2. Tại sao nó được sử dụng autoboxing?

    Tôi sẽ trích dẫn bài giảng:

    Như bạn còn nhớ, Java có cả hai kiểu được kế thừa từ lớp Objectvà kiểu nguyên thủy. Tuy nhiên, hóa ra, một thứ tiện lợi như bộ sưu tập và generic chỉ có thể hoạt động với các kiểu được kế thừa từ Object.

  3. Lựa chọn thay thế 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 значений работает кэширование?

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

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION